PHP 线程安全,多线程

关于PHP线程,有一个库: https://github.com/krakjoe/pthreads 这个库还挺不错。

pthreads需要线程安全环境,
下载php的安装包,解压: 
  tar zxvf php-5.4.5.tar.gz//名字是不是这个我不确定,自己去下载
安装:
./configure   --enable-maintainer-zts --prefix=/usr/local/php-zts
make
 
make install

2.安装pthreads

cd /usr/local/src/

wget http://pecl.php.net/get/pthreads-2.0.5.tgz

tar zxvf pthreads-2.0.5.tgz

cd pthreads-2.0.5(进入这个目录。然后执行下面一条操作语句)

/usr/local/php5.5.12-zts/bin/phpize(这是一个操作语句,执行之后会出现configure)

./configure --with-php-config=/usr/local/php5.5.12-zts/bin/php-config

make

make install


3.添加扩展

php.ini添加 :  extension=pthreads.so;

如果你是之前安装过php,那么,/usr/local/php-zts/bin/php -i|grep "php.ini" 这个语句帮你找到php.ini位置。

找出php.ini的位置,修改它把ext=pthreads.so加入进入进去,因为我原来就有php,现在新装的php.ini文件不存在我就考了一个过去……


4.查看扩展是否安装成功

/usr/local/php5.5.12-zts/bin/php -i | grep -i pthreads




测试代码:

<?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



直接在网页没有输出,需要调用PHP脚本运行。


参照文章:

http://www.2cto.com/kf/201309/245093.html

http://blog.csdn.net/crz03128/article/details/25954441


编译了很久,做个记录。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值