PHP:在线程之间共享一个静态变量


PHP: Sharing a static variable between threads

我在PHP中的不同线程之间共享静态变量时遇到了问题。简单地说,我想1.在一个线程中写入一个静态变量2.在其他线程中读取并执行所需的过程并进行清洁。为了测试上述需求,我编写了以下PHP脚本。

<?php
class ThreadDemo1 extends Thread
{
private $mode;  //to run 2 threads in different modes
private static $test;  //Static variable shared between threads
//Instance is created with different mode
function __construct($mode) {
    $this->mode = $mode;            
}
//Set the static variable using mode 'w'
function w_mode() {
   echo 'entered mode w_mode() funcion';
   echo "<br />";
   //Set shared variable to 0 from initial 100
   self::$test = 100;
   echo "Value of static variable : ".self::$test;
   echo "<br />";
   echo "<br />";
   //sleep for a while
   sleep(1);
}
//Read the staic vaiable set in mode 'W'
function r_mode() {
   echo 'entered mode r_mode() function';
   echo "<br />";
   //printing the staic variable set in W mode
   echo "Value of static variable : ".self::$test;
   echo "<br />";
   echo "<br />";
   //Sleep for a while
   sleep(2);
}
//Start the thread in different modes
public function run() {
//Print the mode for reference
echo "Mode in run() method: ".$this->mode;
echo "<br />";
    switch ($this->mode)
    {
    case 'W':
          $this->w_mode();
          break;
   case 'R':
         $this->r_mode();
         break;
  default:
        echo "Invalid option";        
        }      
    }
}

$trd1 = new ThreadDemo1('W');
$trd2 = new ThreadDemo1('R');
$trd3 = new ThreadDemo1('R');
$trd1->start();
$trd2->start();
$trd3->start();
?>

预期输出为,run()方法中的模式:W已进入模式w_mode()函数静态变量值:100

run()方法中的模式:R已输入mode r_mode()函数静态变量值:100

run()方法中的模式:R已输入mode r_mode()函数静态变量值:100

但实际上我得到的输出是,run()方法中的模式:W已进入模式w_mode()函数静态变量值:100

run()方法中的模式:R已输入mode r_mode()函数静态变量值:

run()方法中的模式:R已输入mode r_mode()函数静态变量值:

真的不知道原因。请帮忙。

静态变量不在上下文之间共享,原因是静态变量有一个类入口范围,而处理程序用于管理对象范围。

当一个新线程启动时,静态信息会被复制(删除复杂的变量,如对象和资源)。

静态作用域可以看作是一种线程本地存储。

此外,如果成员不是静态的。。。从pthreads定义派生的类的所有成员都被认为是公共的。

我鼓励您阅读pthreads分发的示例,它们也可以在github上获得。

您是如何实现多线程的?

PHP没有像Java这样的语言那样的线程支持,Java中有一个JVM,它一直在应用程序级别运行。

使用PHP,每个页面请求都会创建一个新的PHP实例来处理该请求,并且静态变量的范围仅适用于每个正在运行的实例。

要在线程之间共享数据,您需要根据需要将值存储在数据库、会话或简单文件中。