我使用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
答案 0 :(得分:2)
来自PHP手册中的简介:
静态成员:创建新上下文(Thread或Worker)时, 只复制静态类的简单成员,没有资源或 对象从静态类复制到线程上下文中 成员。这允许它们作为一种本地线程运行 存储。例如,在启动上下文时,一个静态的类 成员包括数据库服务器的连接信息,以及 连接本身,只会有简单的连接信息 复制,而不是连接。允许新上下文启动 连接的方式与创建它的上下文相同,存储 连接在同一个地方而不影响原始背景。
答案 1 :(得分:0)
php线程的要求:
pthreads需要在启用ZTS的情况下构建PHP(在Windows上使用--enable-maintainer-zts或--enable-zts)
确保还安装了php线程的PECL扩展。