Warning: Error while sending QUERY packet. PID=4753 in /home/wwwroot/coco/domain/cnlamp/web/wp-includes/wp-db.php on line 1877 php 多线程的实现方法 | LAMP新闻|技巧|经验|资讯站
现在的位置: 首页PHP>正文
php 多线程的实现方法
发表于4年前 PHP 暂无评论

php是不支持多线程的,程序执行是严格按照顺序来执行,并需等待上一个程式代码执行完毕,才会执行下一个。但是有些功能如果是按照顺序来执行,就会出现问题了。例如,转移复制大文件时,则需要页面等待很长时间,造成超时等错误的产生。经过研究,研究出可以使php实现多线程的方法。

具体实现方法就是利用php的cli模式来执行多线程,即用php的函数exec来执行一个系统。

1、多线程实现的前提条件:

(1) php的exec函数必须能够使用。

(2)知道服务器端php命令的路径。

2、关于exec函数说明:

exec — 执行外部程式

语法 : string exec ( string command [, array &output [, int &return_var]] )

说明 :

exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。

如果有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 如果数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,如果你不想要此函数附加元素的话,你可以在传递此数组给exec( )之前呼叫unset( )。

如果有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。

注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。

注意 : 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。

3、多线程实现

如2所示,php在执行到exec时,默认的状态也是悬挂,直到命令执行完毕以后才继续执行后面的程序,但是函数说明中表示可以在后台执行的时候离开他。那么我们再写命令的时候,只需要把命令的输出转向一个文件或输出流即可。

exec('php /var/www/testphp/index.php > /dev/null &');

命令中“> /dev/null &”就是把命令的输出转到了一个输出流。如果需要记录返回日志,可以把 /dev/null 改成 文本路径即可。例如需要输出到text.log文本中

exec('php /var/www/testphp/index.php > /var/www/testphp/text.log &');

使用这个方式,可以实现,php执行到此处后,只需要把命令传递给服务器,即可继续执行后面的程序。

4、测试代码

for ($i=0; $i < 100; $i++)   {   
    exec('php /var/www/testphp/index.php /id/'.$i.' > /var/www/testphp/text_'.$i.'.log &');
}
echo 'success';

给我留言

留言无头像?


×
腾讯微博