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.
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. –
@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
@ErkiA to znaczy, że jest to kod debugowania. Oryginalny kod funkcji "stopSending" kończy działanie programu. – jfra