PHP多线程变量作用域共享问题

3

我是用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

在这个结果中,您可以看到静态字符串变量可以从子线程中获取值,但DateTime对象不行!
我的php版本是
PHP 5.5.4(cli)(构建:2013年10月9日11:27:32)(DEBUG)版权所有(c) 1997-2013年PHP组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个回答

2

来自PHP手册中的介绍:

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

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


谢谢这个答案,那么在线程之间没有可能分享对象吗?我唯一想到的另一种方式是将变量写入临时文件以便使用...但在我的情况下,我想在主线程中完成子线程后触发某些事情。 - Tony Hsieh
这仅适用于静态内容,请尝试阅读Github上的示例:http://github.com/krakjoe/pthreads,它们涵盖了广泛的主题,并应该帮助任何人入门... - Joe Watkins

0

php线程的要求:

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

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


我非常确定我已经在编译PHP时进行了此配置,这是我的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 - Tony Hsieh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接