2013-06-24 3 views
4

PHP의 다른 스레드간에 정적 변수를 공유하는 데 문제가 있습니다. 간단히 말해서 나는 을 원한다. 하나의 스레드에 정적 변수를 작성한다. 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(); 
?> 

예상 출력은 런 모드() 방법 : 런 100

모드() 메소드 : 정적 변수 입력 모드 w_mode() funcion W 값 R 입력 모드 r_mode 정적 변수() 함수 값 : 런타임 100

모드() 메소드 정적 변수 R 입력 모드 r_mode() 함수 값 : 100

,451,515,

그러나 실제로 나는 같은 출력, 실행에 모드() 메소드를 얻고있다 : 실행 100

모드() 메소드 : R 입력 모드 입력 모드 w_mode() funcion 정적 변수의 값 W r_mode() 함수 정적 변수 값 : 런

모드()에있어서 R 정적 변수 입력 모드 r_mode() 함수 값 : 원인 정말로 모르고

..... 도와주세요.

답변

-3

어떻게 멀티 스레딩을 수행하고 있습니까?

PHP는 응용 프로그램 수준에서 지속적으로 실행되는 JVM이있는 Java와 같은 스레딩 지원을 제공하지 않습니다.

PHP에서는 각 페이지 요청이 PHP의 새 인스턴스를 생성하여 해당 요청을 처리하고 있으며, 정적 변수의 범위는 실행중인 각 인스턴스에 대해서만 적용됩니다.

스레드간에 데이터를 공유하려면 요구 사항에 따라 DB, 세션 또는 간단한 파일에 값을 저장해야합니다.

+0

안녕하세요 폴 S입니다. 친절한 답변과 시간을 보내 주셔서 감사합니다. 내 불완전한 질문에 대해 죄송합니다. 요청에서 2 개의 스레드를 시작하려고합니다. 감사 Vinay – user2515938

+0

http : // php.net/Thread –

7

정적 변수는 컨텍스트간에 공유되지 않으므로 정적 변수에는 클래스 항목 범위가 있고 핸들러는 객체 범위를 관리하기위한 것입니다.

새 스레드가 시작되면 통계가 복사됩니다 (객체 및 자원과 같은 복잡한 변수 제거).

정적 범위는 일종의 스레드 로컬 저장소로 생각할 수 있습니다.

또한 구성원이 정적이 아닌 경우 pthreads 정의에서 파생 된 클래스의 모든 구성원은 공개 된 것으로 간주됩니다.

pthreads와 함께 배포 된 예제를 읽는 것이 좋습니다. gthub에서도 사용할 수 있습니다.

+0

친애하는 Joe, 답변 해 주셔서 감사합니다. 나는 또한 여러 시도가 범위가 결론 인 것으로 결론을 내린 후에도 이유가있다. Vinay 감사합니다. – user2515938

관련 문제