• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP 多线程扩展(正儿八经的线程)pthr_php

php 搞代码 3年前 (2018-06-21) 158次浏览 已收录 0个评论

环境CentOS 6.3 64bit,php 5.4.5

 
pthreads需要线程安全环境,
 
下载php的安装包,解压:
 
  tar zxvf php-5.4.5.tar.gz//名字是不是这个我不确定,自己去下载
 
安装:
 
./configure –enable-zts –prefix=/usr/local/php-zts
 
make
 
make install
 
结果就把线程安装版的php安装到了/usr/local/php-zts,目前我不了解开启线程安全到底会带来什么影响,所以,就弄两个测试版本。
 
下载和安装pthreads:
 
tar zxvf pthreads
 
cd pthreads-0.0.45 // 本文的是第一个stable版本
 
/usr/local/php-zts/bin/phpize
./configure –with-php-config=/usr/local/php-zts/bin/php-config
make
make install
 
 
 
/usr/local/php-zts/bin/php -igrep "php.ini"
找出php.ini的位置,修改它把ext=pthreads.so加入进入进去,因为我原来就有php,现在新装的php.ini文件不存在我就考了一个过去……
 
pthreads-0.0.45/examples目录下有些示例文件,比文档有用,在线文档根本不能说明问题,我修改了一个,执行了一下:
    <?php   /*  * Sharing symbols 101  * @NOTE Thread::fetch was never included in a release and was superceeded by object handlers  *   pthreads allows read access to thread data from any context      pthreads allows write access to thread data from any context      carry on reading ...      work in progress ...  */   class TestObject {       public $val;   }      class Fetching extends Thread {       public function run(){           /*          * of course ...          */           $this->sym = 10245;           $this->arr = array(               "1", "2", "3"           );           echo '6'.chr(10);           /*          * objects do work, no preparation needed ...          * read/write objects isn't finalized ..          * so do the dance to make it work ...          */           $obj = new TestObject();           $obj->val = "testval";           $this->obj = $obj;           echo '7'.chr(10);           /*          * will always work          */           $this->objs = serialize($this->obj);           echo '8'.chr(10);           /*          * nooooooo          */           $this->res = fopen("php://stdout", "w");           echo '9'.chr(10);           /*          * tell the waiting process we have created symbols and fetch will succeed          */           $this->synchronized(function(){               $this->notify();           });           echo '10'.chr(10);           /* wait for the process to be finished with the stream */           $this->synchronized(function(){               $this->wait();           });           echo '11'.chr(10);       }   }   echo '0'.chr(10);   $thread = new Fetching();   echo '1'.chr(10);   $thread->start();   //sleep(1); 加了这个就不能正常工作,真奇怪   echo '2'.chr(10);   $thread->synchronized(function($me){       echo '3'.chr(10);       $me->wait();       echo '4'.chr(10);   }, $thread);   echo '5'.chr(10);      /*  * we just got notified that there are symbols waiting  */   foreach(array("sym", "arr", "obj", "objs", "res") as $symbol){       printf("/$thread->%s: ", $symbol);          $fetched = $thread->$symbol;       if ($fetched) {           switch($symbol){               /*              * manual unserialize              */               case "objs":                   var_dump(unserialize($fetched));               break;                              default: var_dump($fetched);           }       }       printf("/n");   }      /* notify the thread so it can destroy resource */   $thread->synchronized(function($me){       $me->notify();   }, $thread);   ?>    /usr/local/php-zts/bin/php Fetch.php  结果:  0 1 2 3 6 7 8 9 10 4 5 $thread->sym: int(10245)   $thread->arr: array(3) {   [0]=>   string(1) "1"   [1]=>   string(1) "2"   [2]=>   string(1) "3" }   $thread->obj: object(TestObject)#2 (1) {   ["val"]=>   string(7) "testval" }   $thread->objs: object(TestObject)#2 (1) {   ["val"]=>   string(7) "testval" }   $thread->res: resource(3) of type (stream)   11   

 

欢迎大家阅读《PHP 多线程扩展(正儿八经的线程)pthr_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址