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加上extension=pthreads.so

6.重启php就行了...

7、php -m | grep pthreads 查看是否安装完成

注意:安装 pthreads 需要的是已安装的PHP版本为 thread safly(安全线程)已开启

 

二、使用多线程的方法

1、 入口文件 run.php

<?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();

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();
    }

}


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_68949064

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值