我们只知PHP本身是不支持多线程,但是有时候我们又需要这样的功能,比如:同时启动多个脚本执行任务。那怎么办?
其实,我们可以借助于操作系统的多进程的并发执行能力,以及WEB 服务器的多线程能力(进程与线程的区别请查阅相关资料)来解决。
方案一 操作系统的多进程的并发执行能力
/启动发送脚本
foreach($tasks as $task){
$campaign_id = $v['id'];
$cmd = "php do_task.php task_id=$task";
launch($cmd);
echo "Campaign ID $campaign_id launched \n.....";
}
//在do_task.php中做具体的任务
/**
* 执行任务
*
* @return unknown
*/
function launch($cmd){
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
return pclose(popen("start /b " . $cmd, 'r')); //windows中启动进程格式
} else {
return pclose(popen($cmd . " > /dev/null &", 'r')); //Linux中启动进程格式
}
}
不过,注意官网上的说明:
resourcepopen ( string$command , string$mode )打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。
如果出错返回 FALSE。
Note:
如果需要双向支持,使用 proc_open()。()相关的还有:pcntl_fork()等
另注:关于window 'start' 命令参看:http://www.sniperx.info/2010/windows-xp-dos-start.html
方案二 WEB 服务器的多线程能力
1 使用fsockopen() 或者stream_socket_client()函数打开一个socket链接,参看:
http://fc-lamp.blog.163.com/blog/static/1745666872010391220921/
2 通过HTML(在HTML中的IMG,<script src="XXX"></script>,Ifream等) 或者JS来请求实现。
评论