У меня возникла проблема обмена статической переменной между разными потоками в 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 () funcion Значение статической переменной: 100
Режим в методе run (): R введенный режим r_mode () Функция Значение статической переменной: 100
Режим в методе run (): R введенный режим r_mode () Функция Значение статической переменной: 100
Но на самом деле я получаю вывод как метод Mode in run (): W введенный режим w_mode () funcion Значение статической переменной: 100
Режим в методе run (): R введенный режим r_mode () Функция Значение статической переменной:
Режим в методе run (): R введенный режим r_mode () Функция Значение статической переменной:
…. Действительно не осознавая причины. Пожалуйста помоги.
Статические переменные не разделяются между контекстами, причина в том, что статические переменные имеют область ввода класса, а обработчики предназначены для управления областью объекта.
Когда запускается новый поток, статика копируется (удаление сложных переменных, таких как объекты и ресурсы).
Статический охват можно рассматривать как своего рода локальное хранилище потоков.
Кроме того, если члены не являются статическими … все члены класса, полученные из определения pthreads, считаются общедоступными.
Я рекомендую вам прочитать примеры, распространяемые с помощью pthreads, они также доступны на github.
Как вы выполняете многопоточность?
PHP не имеет такой же поддержки потоков, как языки, такие как Java, где у вас есть JVM, который постоянно работает на уровне приложения.
С PHP каждый запрос страницы создает новый экземпляр PHP для обработки этого запроса, а область статических переменных – только для каждого запущенного экземпляра.
Чтобы обмениваться данными между потоками, вам нужно сохранить значение в БД, сеансе или простом файле в зависимости от ваших требований.