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

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

我的 php 版本是

PHP 5.5.4 (cli) (built: Oct 9 2013 11:27:32) (DEBUG) 版权所有 (c) 1997-2013 The PHP Group Zend Engine v2.5.0, Copyright (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
4

2 回答 2

2

来自 PHP 手册中的介绍:

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

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

于 2013-10-14T07:18:33.287 回答
0

php线程的要求:

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

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

于 2013-10-14T04:49:39.317 回答