2016-08-02 18 views
5

Używam tego skryptu w PHP 5.5.9:PHP CLI nie działa PCNTL w PHP7.0 Ubuntu serwer xenial

declare(ticks = 1); 

pcntl_signal(SIGTERM, array($this, 'stopSending')); 
pcntl_signal(SIGINT, array($this, 'stopSending')); 
pcntl_signal(SIGUSR1, array($this, 'stopSending')); 
pcntl_signal(SIGUSR2, array($this, 'stopSending')); 
pcntl_signal(SIGQUIT, array($this, 'stopSending')); 
pcntl_signal(SIGHUP, array($this, 'stopSending')); 

public function stopSending($signals) 
{  
    echo "hello"; 
    exit(); 
} 

while (true) { 
    // some logic 
} 

w Ubuntu 14, który działa poprawnie, ale gdy próbuję wykonać w Ubuntu 16.04 z PHP7.0 i spróbuj wysłać sygnał (zabić PID), PHP CLI nie zatrzymuje się i zachowuje runnig.

W Ubuntu 16.04 i sprawdzić rozszerzenie PCNTL, i to jest ok:

>php -m | grep pcntl 
pcntl 

ja nie otrzymuję żadnych błędów, gdy biegnę, ale nie zatrzymuje się (lub echo wyświetlacz).

Czy jest jakiś problem z PHP7 i PCntl?

UPDATE

Problem jest podczas kapsułkowania podczas pętli w funkcji:

function start() 
{ 
    while (true) { 
     // some logic 
    } 
} 

declare(ticks = 1); 

pcntl_signal(SIGTERM, "stopSending"); 
pcntl_signal(SIGINT, "stopSending"); 
pcntl_signal(SIGUSR1, "stopSending"); 
pcntl_signal(SIGUSR2, "stopSending"); 
pcntl_signal(SIGQUIT, "stopSending"); 
pcntl_signal(SIGHUP, "stopSending"); 

function stopSending($signals) 
{  
    echo "hello"; 
    exit(); 
} 

start(); 

to kod nie jest zatrzymywany.

+0

Kod, który wysłałeś nie wychodzi z SIGTERM. Nie powinno się więc zatrzymywać, wysyłając do niego SIGTERM. Dlaczego to nie działało wcześniej, jest właściwym pytaniem. –

+0

@ErkiA Edytowałem kod. Mam pętlę for po procedurach obsługi rejestru. Problem polega na tym, że sygnały są przechwytywane przez stopSending(), ale nie drukują echa. – jfra

+0

@ErkiA to znaczy, że jest to kod debugowania. Oryginalny kod funkcji "stopSending" kończy działanie programu. – jfra

Odpowiedz

2

Istnieje dobre objaśnienie obsługi sygnałów PHP here. Tak więc najlepszym sposobem, aby upewnić się, że wyzwalacz sygnału uruchamia się we właściwym czasie, jest coś takiego:

<?php 

declare(ticks = 1); 

function start() 
{ 
    while (true) { 
     pcntl_signal_dispatch(); 
    } 
} 

pcntl_signal(SIGTERM, "stopSending"); 
pcntl_signal(SIGINT, "stopSending"); 
pcntl_signal(SIGUSR1, "stopSending"); 
pcntl_signal(SIGUSR2, "stopSending"); 
pcntl_signal(SIGQUIT, "stopSending"); 
pcntl_signal(SIGHUP, "stopSending"); 

function stopSending($signals) 
{  
    echo "hello"; 
    exit(); 
} 

start(); 

?>