下载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加上extension=pthreads.so
6.重启php就行了...
7、php -m | grep pthreads 查看是否安装完成
注意:安装 pthreads 需要的是已安装的PHP版本为 thread safly(安全线程)已开启
<?php
header('Content-Type:application/json; charset=utf-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', 'url'=>'url1'],
['name'=>'任务2', 'url'=>'url2'],
['name'=>'任务3', 'url'=>'url3'],
['name'=>'任务4', 'url'=>'url4'],
['name'=>'任务5', 'url'=>'url5'],
['name'=>'任务6', 'url'=>'url6'],
['name'=>'任务7', 'url'=>'url7'],
['name'=>'任务8', 'url'=>'url8'],
['name'=>'任务9', 'url'=>'url9'],
['name'=>'任务10', 'url'=>'url10'],
];
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();
<?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();
}
}