2012年8月9日星期四

PHP函数的形参,实参

默认参数---------------------------------------------------------------------------------
function add_some_extra($args)
{
     $args['b']= "bbb";
}
$arr['a']= "aaa";
add_some_extra($arr);
fb::log($arr);
>>>>>>>>>> output>>>>>>>>>>>>>>
array(
        'a'=>'aaa',
)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


引用传递参数--------------------------------------------------------------------------
function add_some_extra(&$args)

{
     $args['b']= "bbb";
}
$arr['a']= "aaa";
add_some_extra($arr);
fb::log($arr);
>>>>>>>>>> output>>>>>>>>>>>>>>
array(
         'a'=>'aaa',

         'b'=>'bbb'
)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

默认参数(参数为object时, 碉堡了。。。)----------------------------------------
function add_some_extra($args)
{
      $args->b ="bbb";
}
$obj->a = "aaa";
add_some_extra($arr);
fb::log($arr);
>>>>>>>>>> output>>>>>>>>>>>>>>
stdClass(
          a:'aaa',

          b:'bbb'
)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

这个aObj会跟着变:
function aObj(&$a, &$b)
{
   $a = $b;
}
$a = new StdClass;
$a->i = 1;
$b = new StdClass;
$b->i = 2;
aObj($a, $b);
$b->i = 3;
print $a->i;

这个aObj一点都不变,还是i=1:
方程式aObj() 跟命令行_command_not_changed_相当:
function aObj($a, $b)
{
   $a = $b;
}
$a = new StdClass;
$a->i = 1;
$b = new StdClass;
$b->i = 2;
aObj($a, $b);
$b->i = 3;
print $a->i;

这个很详细的描述:
class testRefer{
    public $obj ;
   
    public function __construct(){
        $obj = new StdClass;
    }
   
    public function test($a, $b, &$aRef, &$bRef)
    {
       //$a = $b;              //$aOjb won't be changeed
       //$a->i = 10;           //$aOjb will be changeed to ->i=10
       //$a->i = $b->i;        //$aOjb will be changeed to ->i=2
       //$a = clone $b;        //$aOjb won't be changeed
      
       //$aRef = $bRef;        //$aOjb will always be changing follow bOjb
       //$aRef = $b;           //$aOjb will always be changing follow bOjb
       //$aRef->i = 10;        //$aOjb will be changeed to ->i=10
       //$aRef->i = $bRef->i;  //$aOjb will be changeed to ->i=2
       //$aRef = clone $bRef;  //$aOjb will be changeed to ->i=2
       
       //$a = $bRef;           //$aOjb won't be changeed
      
       $this->obj = $b;        // $testRefer->obj will always be changing follow bOjb
       //$this->obj = $bRef;   // $testRefer->obj will always be changing follow bOjb
    }
}


$aOjb = new StdClass;
$aOjb->i = 1;
$bojb = new StdClass;
$bojb->i = 2;

$testRefer = new testRefer();
$testRefer->test($aOjb, $bojb,$aOjb, $bojb);

$bojb->i = 3;

var_dump($aOjb);
print '
';
var_dump($bojb);
print '
';
var_dump($testRefer->obj);
print '
';


普通变量测试-------------------------------------------------------------------
function a(&$a, &$b)
 {
      $a =& $b;
 }
   $a = 1;
   $b = 2;
   a($a, $b);
   $b = 3;
print $a; 
这里输出 a=1

function a2(&$a, &$b)
{
   $a = $b;
}
$a = 1;
$b = 2;
a2($a, $b);
$b = 3;
print $a;
这里输出 a=2

方程式a() 跟以下命令行_command_not_changed_相当:

_command_not_changed_:
//a=1
$a = 1;
$b = 2;
$a1 =& $a;
$b1 =& $b;
$a1 = &$b1; //指向被改了
$b = 3;
这里输出 a=1
------------------------

//这个才会跟着变:
$a = 1;
$b = 2;
$a =& $b;
$b = 3;
print $a;

这里输出 a=1

 

2012年7月2日星期一

zendstudio 批量添加换行符

回车和换行关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打 开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。


win:“\r\n”,0x0D0A;
linux:“\n”,0x0A;
mac:"\r",0x0D; 


Zendstudio中用\r\n大量替换\r :

Find: \r
Replace with: \r\n

*Regular expressions

2012年2月3日星期五

PHP使用数据库永久连接方式操作MySQL的是与非

转:http://hi.baidu.com/thinkinginlamp/blog/item/c947fdfa91c3fbdeb48f3187.html 作者:老王

PHP 程序员 应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障。对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这里我厚着脸皮试图做一个简单的讨论,所述观点不见得全都正确,欢迎大家反馈意见。

首先看看数据库永久连接的定义: 永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

PHP使用永久连接方式操作MySQL是有前提的:就是PHP必须安装为多线程或多进程Web服务器的插件或模块。最常见的形式是把PHP用作多进程Apache服务器的一个模块。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成Web页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有不同子进程请求SQL服务的后继页面都能够重新使用这个已经建立的 SQL服务器连接。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。每个子进程将对服务器建立各自独立的永久连接。PHP本身并没有数据库连接池的概念,但是Apache有进程池的概念, 一个Apache子进程结束后会被放回进程池, 这也就使得mysql_pconnect打开的的那个mysql连接资源可以不被释放,而是依附在相应的Apache子进程上保存到了进程池中。于是在下一个连接请求时它就可以被复用。一切看起来似乎都很正常,但是在Apache并发访问量大的时候,如果使用mysql_pconnect,会由于之前的 Apache子进程占用的MySQL连接没有close, 很快使MySQL达到最大连接数,使得之后的请求可能得不到响应。

上 面的部分文字是摘抄自PHP文档,看起来可能还是有些文绉绉的不好理解,那么我就用大白话再举一个例子来说明问题: 假设Apache配置最大连接数为1000,MySQL配置最大连接数为100,当Apache服务器接到200个并发访问的时候,其中100个涉及到数据库访问,剩下的100个不涉及数据库访问,因为这个时候还不存在可用的数据库连接,所以这里面涉及到数据库访问的100个并发会同时产生100个数据库永久连接,达到了数据库最大连接数,当这些操作没有结束的时候,任何其他的连接都无法再获得数据库连接,当这些操作结束了,相应的连接会被放入进程池,此时Apache的进程池里就有了200个空闲的子进程,其中100个是带有数据库连接的,由于Apache会为访问请求随机的挑选空闲子进程,所以你得到的子进程很可能是不包含数据库连接的那100个中的一个,而数据库连接已经达到了最大值,你也不可能成功的建立新的数据库连接,唉,你便只好不停的刷新页面,哪个时候运气好,碰巧分配到了带有数据库连接的子进程,才能正常浏览页面。如果是大访问量的网站来说,任何时候都可能存在大量的并发,所以浏览者可能就会不停的发现无法连接数据库的现象了。 或许你会说,我们把Apache和MySQL的最大连接数调成一样大不就可以了么?是的,合理的调整这个最大连接数某种程度上会避免这个问题的发生,但是Apache和MySQL的负载能力是不同的,如果按照Apache的负载能力来设置,对于MySQL来说,这个最大连接数就偏大,会产生大量的 MySQL数据库永久连接,打个比方,就好像和平时代还要养活一个几百万的军队一样,其开销得不偿失;而如果按照Mysql的负载能力设置,对于 Apache来说,这个最大连接数就偏小,有点杀鸡牛刀的感觉,无法发挥Apache的最大效率。

所 以按照PHP手册上的介绍,只适合在并发访问不大的网站上使用数据库永久连接,但对于一个并发访问不大的网站来说,使用数据库永久连接带来的效率提高似乎没有太大的意义,从这个角度上来看,我觉得PHP中的数据库永久连接基本上是一个鸡肋的角色,如果你一定要使用数据库连接池的概念,可以尝试一下sqlrelay 或者Apache本身提供的mod_dbd ,说不定会有惊喜。

2012年1月31日星期二

Zend Studio代码提示工作不正常的解决办法

相信很多哥们在用zend studio进行php开发的时候会经常遇到zend studio 的代码提示工作簿正常的情况,其实解决这个问题很简单 ,删除电脑当前用户下这个文件: (当前的workspace目录)/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.dltk.ui.prefs (例如:C:/Users/Administrator/Zend/workspaces/DefaultWorkspace7/.metadata /.plugins/org.eclipse.core.runtime/.settings/org.eclipse.dltk.ui.prefs