2013-06-24 7 views
4

У меня есть проблема с распределением статической переменной между разными потоками в PHP. Простыми словами я хочу 1. Напишите статическую переменную в одном потоке 2. Прочитайте ее в другой теме и выполните необходимый процесс и очистите ее. Для тестирования выше требования я написал ниже PHP-скрипт.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(); 
?> 

Ожидаемый выход, метод режим в беге(): W введен режим w_mode() несильно Значение статической переменной: 100

Mode в беге() Метод: R введен режим r_mode() функция Значение статической переменной: 100

режим в перспективе() метод: R вошел в режим r_mode() функция Значение статической переменной: 100

Но на самом деле я получаю результат, как, режим в перспективе() метод: W вошел в режим w_mode() несильно Значение статической переменной: 100

Mode в перспективе() метод: R введен режим r_mode функция() Значение статической переменной:

режим в перспективе() метод: R введен режим r_mode() функция Значение статической переменной:

.... на самом деле не знают причины. Пожалуйста помоги.

ответ

-3

Как вы выполняете многопоточность?

PHP не имеет такой же поддержки потоков, как языки, такие как Java, где у вас есть JVM, который постоянно работает на уровне приложения.

С PHP каждый запрос страницы создает новый экземпляр PHP для обработки этого запроса, а область статических переменных - только для каждого запущенного экземпляра.

Чтобы поделиться данными между потоками, вам необходимо сохранить значение в БД, сеансе или простом файле в зависимости от ваших требований.

+0

Привет, Пол С. Спасибо за ваш ответ и ваше время. Извините за мой неполный вопрос. Я намерен сделать 2 потока в запросе. Спасибо Vinay – user2515938

+0

http: // php.net/Thread –

7

Статические переменные не разделяются между контекстами, причина в том, что статические переменные имеют область ввода класса, а обработчики предназначены для управления областью объектов.

Когда начинается новый поток, статика копируется (удаляет сложные переменные, например объекты и ресурсы).

Статический охват можно рассматривать как своего рода локальное хранилище потоков.

Кроме того, если члены не являются статическими ... все члены класса, полученные из определения pthreads, считаются общедоступными.

Я рекомендую вам ознакомиться с примерами, распространяемыми с помощью pthreads, они также доступны в github.

+0

Дорогой Джо, спасибо за ответ. Я также после нескольких попыток пришел к выводу, что сфера была причиной. Спасибо Vinay – user2515938