php多线程变量范围共享问题

时间:2013-10-14 04:45:30

标签: php multithreading variables object pecl

我使用php创建一个多线程cli应用程序,但线程之间的变量共享遇到了一些问题

这是我的代码:

<?php
class testThread extends Thread{
    public function run(){
        wrapper::hello();
    }
}

class wrapper{
    public static $test0;
    public static $test1;
    public static function create(){
        self::$test0 = 'a string';
        self::$test1 = new DateTime();

        echo '#main thread echo start' . "\n";
        var_dump(self::$test0);
        var_dump(self::$test1);
        echo '#main thread echo end' . "\n\n";
        //echo '#---------------------------' . "\n\n";

        $test = new testThread();
        $test->start();
    }

    public static function hello(){
        echo '#sub thread echo start' . "\n\n";
        var_dump(self::$test0);
        var_dump(self::$test1);
        echo '#sub thread echo end' . "\n";
    }
}

wrapper::create();
?>

和结果

#main thread echo start
string(8) "a string"
object(DateTime)#1 (3) {
  ["date"]=>
  string(19) "2013-10-14 12:36:17"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(11) "Asia/Taipei"
}
#main thread echo end

#sub thread echo start

string(8) "a string"
NULL
#sub thread echo end

在这个结果中,你可以看到静态String变量可以从子Thread中获取值,但是DateTime对象不是!

我的php版本是

  

PHP 5.5.4(cli)(建于:2013年10月9日11:27:32)(DEBUG)版权所有(c)   1997-2013 PHP Group Zend Engine v2.5.0,版权所有(c)1998-2013   Zend Technologies

如果您有任何意见,请留在这里,对我来说非常有帮助。

感谢。

--------更新-----------

这是我的phpinfo

php test.php | grep "Confi"
Configure Command =>  './configure'  '--enable-sockets' '--enable-debug' '--enable-maintainer-zts' '--enable-pthreads'
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
Configuration

2 个答案:

答案 0 :(得分:2)

来自PHP手册中的简介:

  

静态成员:创建新上下文(Thread或Worker)时,   只复制静态类的简单成员,没有资源或   对象从静态类复制到线程上下文中   成员。这允许它们作为一种本地线程运行   存储。例如,在启动上下文时,一个静态的类   成员包括数据库服务器的连接信息,以及   连接本身,只会有简单的连接信息   复制,而不是连接。允许新上下文启动   连接的方式与创建它的上下文相同,存储   连接在同一个地方而不影响原始背景。

http://php.net/manual/en/intro.pthreads.php

答案 1 :(得分:0)

php线程的要求:

pthreads需要在启用ZTS的情况下构建PHP(在Windows上使用--enable-maintainer-zts或--enable-zts)

确保还安装了php线程的PECL扩展。