2013-01-04 15 views
8

Musiałem zbudować system kolejki PHP i znalazłem ten genialny artykuł http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-1-understanding-the-project/ i użyłem go do stworzenia systemu kolejki PHP, bardzo łatwego w konfiguracji i użyciu.Jak zbudować system kolejki PHP

Poniżej znajduje się kod dla queue.php, uruchamiany z powłoki (puTTy lub somesuch).

<?PHP 

//. set this constant to false if we ever need to debug 
//. the application in a terminal. 
define('QUEUESERVER_FORK', true); 

//////// fork into a background process //////// 
if(QUEUESERVER_FORK){  
    $pid = pcntl_fork(); 
    if($pid === -1) die('error: unable to fork.');  
    else if($pid) exit(0);   
    posix_setsid();  
    sleep(1);   
    ob_start(); 
} 

$queue = array(); 

//////// setup our named pipe //////// 
$pipefile = '/tmp/queueserver-input'; 

if(file_exists($pipefile))  
    if(!unlink($pipefile))   
     die('unable to remove stale file'); 

umask(0); 


if(!posix_mkfifo($pipefile, 0666))  
    die('unable to create named pipe'); 

$pipe = fopen($pipefile,'r+'); 

if(!$pipe) die('unable to open the named pipe'); 

stream_set_blocking($pipe, false); 

//////// process the queue //////// 
while(1){  

    while($input = trim(fgets($pipe))){   
     stream_set_blocking($pipe, false);   
     $queue[] = $input;  
    }  

    $job = current($queue);  
    $jobkey = key($queue);  

    if($job){   
     echo 'processing job ', $job, PHP_EOL;     
     process($job);     
     next($queue);   
     unset($job, $queue[$jobkey]);    
    }else{   
     echo 'no jobs to do - waiting...', PHP_EOL;   
     stream_set_blocking($pipe, true);  
    }   

    if(QUEUESERVER_FORK) ob_clean(); 

} 

?> 

Najtrudniej było uzyskać funkcje PCDL do pracy na moim serwerze.

Moje pytanie brzmi: "Jak uzyskać automatyczne uruchomienie zadania, gdy/jeśli serwer musi zostać ponownie uruchomiony?"

+1

Co, dokładnie, jest twoje pytanie? –

+1

@MartinBean Jak uzyskać automatyczne uruchomienie zadania, gdy/jeśli serwer ma zostać ponownie uruchomiony? –

+1

można zmodyfikować skrypt uruchamiania serwera, aby to zrobić, lub można dodać skrypt, który zgłosi stan skryptu/serwera i drugi skrypt do ponownego uruchomienia zadania, a następnie użyć ich zarówno z hosta lokalnego lub zdalnego do monitorowania zadania serwera/restartu (z cronjob) – llamerr

Odpowiedz

9

Moje pytanie brzmi: "W jaki sposób mogę automatycznie uruchomić zadanie, gdy/jeśli serwer ma zostać ponownie uruchomiony?"

Dodanie go do listy rzeczy rozpoczętych po uruchomieniu serwera. Niestety instrukcje tego powodu różnią się znacznie w zależności od systemu operacyjnego i wersji systemu operacyjnego. Prawdopodobnie chcesz użyć czegoś nieco bardziej wieloplatformowego. Miałem dużo szczęścia z supervisor, które prawdopodobnie znajdziesz w repozytorium pakietów w wybranym systemie operacyjnym.

To powiedziawszy, idziesz w dół szlakiem szaleństwo. To, co robisz, zostało zrobione wcześniej, lepiej, przez niesamowitych ludzi. Sprawdź system kolejek roboczych Gearman i towarzyszące PECL extension. Zdarza się, że przełożony jest bardzo przydatny do utrzymania przy życiu pracowników Gearman.