php的pthreads扩展实现执行多线程任务

php的pthreads扩展实现执行多线程任务
一、PHP安装pthreads的多线程扩展下载pthreads源码http://pecl.php.net/package/pthreads首先确定安装的php版本是线程安全的如果不是的话重新编译加上 --enable-maintainer-zts \1.解压tar -zxvf pthreads-0.0.44.tgz ;2.进入源码文件夹 cd pthreads-0.0.44 执行 /usr/local/php/bin/phpize;3.执行./configure --with-php-config/usr/local/php/bin/php-config;4.执行make make install;5.编辑/usr/local/php/lib/php.ini加上extensionpthreads.so6.重启php就行了...7、php -m | grep pthreads 查看是否安装完成注意安装 pthreads 需要的是已安装的PHP版本为 thread safly安全线程已开启二、使用多线程的方法1、 入口文件 run.php?php header(Content-Type:application/json; charsetutf-8); error_reporting(E_ERROR | E_CORE_ERROR | E_PARSE); /** * 任务执行入口 */ $stime time(); require_once(./thread.php); class Task{ private $threadNum 5; //线程并行执行个数 public function goRun() { $start_time time(); //构造任务列表 $GLOBALS[taskList] [ [name任务1, urlurl1], [name任务2, urlurl2], [name任务3, urlurl3], [name任务4, urlurl4], [name任务5, urlurl5], [name任务6, urlurl6], [name任务7, urlurl7], [name任务8, urlurl8], [name任务9, urlurl9], [name任务10, urlurl10], ]; while(count($GLOBALS[taskList])){ $taskList $this-readyThread($GLOBALS[taskList]); foreach($taskList as $key$val){ $token task_.$this-randomkeys(20); $pool[$token] new TaskThread($key, $val); echo ---------------创建线程:.$token.PHP_EOL; } echo 等待执行完成.PHP_EOL; //开始执行线程 foreach ($pool as $key$th) { $th-start(); sleep(1); //延迟启动 unset($pool[$key]); } } sleep(3); //线程回收完毕 $end_time time(); $use $end_time - $start_time; echo date(Ymd H:i:s). 执行完毕... USE {$use} s.PHP_EOL; exit; } public function randomkeys($length) { $returnStr; $pattern 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ; for($i 0; $i $length; $i ) { $returnStr . $pattern {mt_rand ( 0, 61 )}; //生成php随机数 } return $returnStr; } /** * 开启线程前分配线程任务 */ private function readyThread($data) { $tasklist array(); $i 1; foreach ($data as $key $val) { if ($i $this-threadNum) { return $tasklist; } $tasklist[$i][] $val; unset($GLOBALS[taskList][$key]); $i; } return $tasklist; } } $Task new Task(); $Task-goRun();2、多线程控制器文件 thread.php?php /** * 多线程控制器 */ class TaskThread extends Thread { private $task; private $name; //构造 function __construct($name, $task) { $this-task $task; $this-name $name; unset($task, $name); } //线程主体 function run() { //任务初始化执行【此处根据自己的需要编辑具体任务执行方法】 echo pre/; print_r($this-task); unset($this-task); unset($this-name); exit; } }

最新新闻

日新闻

周新闻

月新闻