php 多线程入门 pthread - PHP程序员学习笔记|如何学习PHP

PHP程序员学习笔记|如何学习PHP

个人总结的PHP学习方法


php 多线程入门 pthread

2017-12-13 0phpcom 学习笔记


一、判断PHP是ts还是nts版

通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版。

二、根据PHP ts\nts版选择对应pthreads的版本

本人php版本是5.4.17的所以下载php_pthreads-0.1.0-5.4-ts-vc9-x86.zip文件包,其中0.1.0表示为当前pthreads版本号,5.4为php版本号,ts就是之前判断php对应的ts、nts版,vs9代表是Visual Studio 2008 compiler编译器编译的,最后的x86代表的是32位的版本。

三、安装pthreads扩展

将下载好的php_pthreads-0.1.0-5.4-ts-vc9-x86.zip文件包解压得到
pthreadVC2.dll和php_pthreads.dll文件,把vc2文件放到php.exe同级目录,把php_pthreads.dll放到扩展目录下。
1、修改php.ini文件 添加extension=php_pthreads.dll
2、修改Apache配置文件httpd.conf 添加LoadFile "X:/PHP5/pthreadVC2.dll"
3、重启Apache服务器

四、测试pthreads扩展

<?php
class AsyncOperation extends Thread {
  public function __construct($arg){
    $this->arg = $arg;
  }

  public function run(){
    if($this->arg){
      printf("Hello %s\n", $this->arg);
    }
  }
}
$thread = new AsyncOperation("World");
if($thread->start())
  $thread->join();
?>

实现异步执行POST操作
<?php
$t1 = microtime(true);
class AsyncPost extends \Thread {
    public function __construct($url,$post,$index){
        $this->url = $url;
        $this->post = $post;
        $this->index = $index;
    }
    public function run(){
        if(!empty($this->url)){
            return $this->post($this->url,$this->post,$this->index);
        }

    }
    public function Post($url, $post = null,$index)
    {
        $post_data = $post;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // post数据
        curl_setopt($ch, CURLOPT_POST, 1);
        // post的变量
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        $output = curl_exec($ch);
        curl_close($ch);
        //打印获得的数据
        echo intval($index)."\r\n";
        return $output;
    }
}
echo "NUL"."\r\n";
$workers = [];
for($i=0;$i<10;$i++){
    $workers[$i] = new AsyncPost('http://www.0-php.com', "www.0-php.com",$i);
    $workers[$i]->start();//创建多线程
}

foreach ($workers as $key=>$worker) {
    while($workers[$key]->isRunning()) {
        usleep(100);
    }
    if ($workers[$key]->join()) {//启动多线程
        print_r($workers[$key]->result);
    }
}

$t2 = microtime(true);
echo '耗时'.round($t2-$t1,3).'秒';

输出结果:
D:\www.0-php.com>php index.php
扤UL
0
1
2
3
4
5
6
7
8
9
« 网站改版 | 记一段2017年-4月 的一次创业经历»
发表评论:









订阅Rss