Apache 多端口配置

Apache的“虚拟主机”,能够很好的支持多域名,绑定同一IP的某端口。

假设需要把一下两个域名指向不同的目录:

1)www.domain_01.com 指向 /home/webroot_01

2)www.domain_02.com 指向/home/webroot_02

在httpd.conf找到

#NameVirtualHost *:80
# <VirtualHost *:80>
……
# </VirtualHost>

之后添加如下配置:

NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.domain_01.com
DocumentRoot “/home/webroot_01”
</VirtualHost>

<VirtualHost *:80>
ServerName www.domain_02.com
DocumentRoot “/home/webroot_02”
</VirtualHost>

重启Apache,配置便完成。

有理想的程序员必须知道的15件事

作为程序员,要取得非凡成就需要记住的15件事。

1、走一条不一样的路

在有利于自己的市场中竞争,如果你满足于“泯然众人矣”,那恐怕就得跟那些低工资国家的程序员们同场竞技了。

2、了解自己的公司

以我在医院、咨询公司、物流企业以及大技术公司工作的经验来看,这一点所言不虚。

不同公司的运营模式差异极大。如果你理解企业的运营模式,那你就不一样了!在这家公司中(或者对客户而言),你是参与业务运营的资产,你的工作能直接产生效益!

3、与最优秀的人为伍

很早以前,我喜欢打篮球,被分配到一个水平比较高的队里。一开始适应的确很困难,但环境的压力越大(重大比赛),我的长进也就越明显。

每个领域其实都一样:你周围人的水平(以及对你的期望)越高,你就会变得越优秀。

4、制造差异

每年学习一门新编程语言。为什么不呢?不断尝试新事物,你关注的技术种类越多,脚下的路就越宽广,你的职业生涯就会日新月异。不知道几年后Java的趋势如何?那就学习Clojure。学Ruby还是Python?这两种语言都可以试试啊。然后你才能知道哪种语言更适合某个特定的项目。看,掌握的语言多了,才能在需要的时候信手拈来吧。

5、畏惧,是最大的敌人

还是直接从书中摘一句吧:“在畏惧中做出的职业规划,很可能会让自己后半辈子就一直被‘圈禁’在小隔断里,永远不会有创造明天辉煌的时刻。没错,那样是安全,但有意思吗?”

6、要成为多面手

如果你掌握了所在领域的知识,那你只能是一名专业人士。用PHP编程?花点时间设置一台Apache服务器,让PHP和MySQL都跑起来。一直在用jQuery?试试Prototype。你懂了吧。

7、一个字:做

别指望别人过来教你该怎么做,出去,自己学着去做!

8、找一位好老师

找一位好老师可以让你在学习技术的时候有的放矢。作者给我们讲述了别人是怎么指导他学习的(顺便说一句,作者在这本书里讲了很多个人经历的小故事,他居然从一位演奏家转行来做软件开发!):“好好研究一下目录服务,熟悉一种UNIX变体,然后再掌握一门脚本语言。”

请记住这句禅宗谚语:“循路觅宗师,形影不相离,师知吾亦知,吾乃成宗师。”

9、主动教会别人

教会别人是一种最好的学习方式。写一篇博客能帮你搞清楚一个问题。为此,你必须先掌握很多材料,同时还要有条有理地讲给别人听(写作技能)。如书中所言:“要想知道自己是不是真的明白,你就讲给别人听听。”

10、实践,实践,再实践(训练)

只有进行大量实践(花大量的时间)才能掌握某种技术。看的很多,写的很少,遇到问题,改一改,又去读代码,……(这样下去是不行的)。

要特别警惕拖延症。其实,往往只要有了开头就好办了。

自我加压,效果会更好。我曾在一篇博客中提到帕金森定律:紧张的时限可以让你提高工作效率。为什么不把这个定律用到学习上呢,比如说在y时间内学会x?

11、从小处入手

每天都取得一项小成果,每天都要坚持做(写在博客上?)。这样一来,你只能让自己比昨天更进步,而不能说自己比上星期进步了一点。

12、享受过程

关注当下,而不是目标,享受那些在追逐未来目标的途中可能无暇顾及的小胜利。人总要生活在当下。我享受编程的过程,就像享受编程的结果一样。

13、不要丧失危机感

越是成功,就越容易犯重大错误。永远不要忘了危机感,特别是要认识到你今天所知道的,到了明天可能就会一文不值。过去的荣耀不能保你永远无虞。

据书中所说,你最好是要让自己能够“通用”,而不要对哪种技术或哪个公司产生依赖。你所掌握的某些技能,甚至你的工作,到了明天都可能会变得毫无价值。因此要不断提高/丰富/扩展自己的技能。

14、推销自己

为某个项目贡献自己的一份力量,写一篇博客,共享自己的源代码,成为对某个社区有用的人。
当然,做这些事可能需要激情,要看你的爱好,但这些事也会间接地推广你的工作成果,证明你的实力,提高你的知名度。

15、关注市场

书中还提到了“预警极客”,也就是那些始终引领技术发展的人。这些人说过的话往往带有预见性,他们提到事物也许过几天就会成为头条新闻。关注这些人,常看他们的Twitter和博客。

转:http://cnbeta.com/articles/140601.htm

Ecshop模板类的一个bug

Ecshop类的模板类(includes/cls_template.php),简化的着实好用。但可否注意到这个bug:

简单举例说:

在模板里面的某一个smarty标签有:{foreach from=$goods_list item=goods} , 还有 {$goods.goods_name}等

在PHP文件注册变量有:$smarty->assign(‘goods_list’, $goods_list);  $smarty->assign(‘goods’, $goods);

注意到smarty语法foreach语句中的item的名字是goods,而又有一个goods标签名被注册;其模板类有考虑防止注册相同标签的变量(即$this->_val[var_name]中的var_name防止重复),所以它在处理var_name的时候,在_compile_foreach_start(tag_args)处理,利用$this->_patchstack成员(array类型)暂存储foreach中的处理后的item名字(即对goods后面再加入随机数字,以防重复)。然后再注册变量的时候,判断下标为item的名字的$this->_patchstack变量是否存在,然后再以其值作为$this->_val数组的下标,而进行赋值。

然而,它在处理$this->_patchstack中,有一个必要的任务,存储一个变量的时候,用完它的时候,必须废了它。它在这个关节上,有bug(从make_val方法入手查起就了然)。所以导致在多个foreach在item的名字,如果和单独一个变量名相同时候(上边提到的goods),就会导致生成编译文件的时候,对单独变量名的:eg:编译后的本应该是$this->_val[‘goods’][‘goods_name’], 却是 $this->_var[‘goods_0_95615500_1302147485’][‘goods_name’],这样$smarty->assign(‘goods’, goods)注册的变量,就不可赋值到对应的变量中,从而显示不出数据。

罗嗦了那么多,就是该废它的时候,没废到。在select($tag)方法中,当tag{0} == ‘/’和substr($tag, 1) == ‘foreach’的时候,在$this->_foreachmark == ‘foreachelse’的时候,没有array_pop($this->_patchstack)。允许它,问题解决。

还有,模板类它一开始并为声明_patchstack其成员变量,这本身埋下不稳定的因素。

 

感悟

受挫一次,对生活的理解加深一层;

失误一次,对人生的醒悟增添一阶;

不幸一次,对世界的认识成熟一级;

磨难一次,对成功的内涵透彻一遍。

PHP官方称PHP代码源或被污染 用户下载需谨慎

转载:http://chinaz.com/Webmaster/report/03251CV52011.html

3月25日消息:据PHP官方网站发布新闻得知其wiki账号被盗,原因是wiki.php.net漏洞导致的,而wiki的账号和php代码源的SVN提交权限相关联,从而导致PHP代码受污染。

据了解,PHP5.3.6以及其后续版本的代码有可能被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的用户,需谨慎。

原文内容:
The wiki.php.net box was compromised and the attackers were able to collect wiki account credentials. No other machines in the php.net infrastructure appear to have been affected. Our biggest concern is, of course, the integrity of our source code. We did an extensive code audit and looked at every commit since 5.3.5 to make sure that no stolen accounts were used to inject anything malicious. Nothing was found. The compromised machine has been wiped and we are forcing a password change for all svn accounts.
We are still investigating the details of the attack which combined a vulnerability in the Wiki software with a Linux root exploit.

内容大致是:

由于wiki账号被盗,PHP的代码源极有可能被污染,当然,PHP团队已经做最大的努力以保证自PHP5.3.5版本的代码没有收到污染,并且强迫SVN修改现有的密码。

而事件目前的状态是,他们仍然没法锁定漏洞所在,因为他们仍在排查。

一个很明显的问题是,PHP5.3.6以及其后续版本的代码可能已经被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的人,要小心了。

而windows.php.net和wiki.php.net也已经暂停访问。

———————————-

作为一款被广泛使用的开发语言,经过此事,已经表明了php源码存在风险的可能,php源码的安全性令人堪忧。

WIN2008的Jmail组件问题

换个服务器(WIN2008(64位)),问题还真多,Jmail不能用了。

Goolge,baidu搜烂了,被折腾一番,终于找到解决方法。

“Application Pools Defaults” -> “Enable 32-bit Applications” -> “Ture”

好郁闷,菜鸟~

[DBNETLIB][ConnectionOpen (Invalid Instance()).]Invalid connection问题

这天把WIN2003+IIS 6.0 + SQL2000下某一个ASP网站转移到WIN2008 + IIS 7.0 + SQL2008时候,出现无法显示数据。输出错误为:[DBNETLIB][ConnectionOpen (Invalid Instance()).]Invalid connection。

Google下,原来需要在加上端口号。

之前连接字符:

“Provider=SQLOLEDB.1; User ID=帐号名; Password=密码; Data Source=IP; Initial Catalog=数据库名”;

现在改为:

“Provider=SQLOLEDB.1; User ID=帐号名; Password=密码; Data Source=IP, 1433; Initial Catalog=数据库名”;

问题解决。值得一提的是,注意Win2008自带的防火墙的设置,对安装SQL2008的安装,连接有影响。所以,出现有些情况,可以在这方面找下原因。

使用数组语法访问的重载

PHP支持联合数组把整型或字符串的值映射到任何其它的值,这是一个关键字/值得映射模式,像在应用框架中查找字典一样,很是方便。

假设这么个例子,在海里的记录查找某个ID的记录。联合数组中少量数据放在一起,用其值如查字典般确认所需要的数据,非常快捷。但如果数据大,为查找某ID的数据而把所有的数据都加载到一个数组中就不实际了。

实际上,可以使用数组的语法轻松实现。这实际是PHP调用自定义的方法,由此方法执行相关的数据库调用,返回所对应的值。实现这些功能,定义的类需要实现ArrayAccess接口(如下):

bool offsetExists($index);

mixed offsetGet($index);

void offsetSet($index, $new_value);

void offsetUnset($index);

class userMap implements ArrayAccess
{
     private $_db;  // 只是简单的举例,这里不详述其实现

    function offsetExists($user_name)
      {
           return $this->_db->userExists($user_name);
      }

      function offsetGet($user_name)
      {
          return $this->_db->getUserID($user_name);
      }

      function offsetSet($user_name, $id)
      {
          $this->_db->setUserID($user_name, $id);
      }

      function offsetUnset($user_name)
      {
          $this->_db->unsetUser($user_name);
      }
}

$userMap = new userMap();

echo "ljlwill's ID is ". $userMap['ljlwill'];

可以看到,对象userMap的使用就像Array一样。在实际开发中,有时使用这重载功能会比冗长调用一个方法更加便捷。