2016-08-02 49 views
5

:PHP CLI PHP7.0 Ubuntu Xenial sunucuda çalışmıyor PCNTL ben PHP 5.5.9 Bu komut dosyasını kullanıyorum

çalışıyor Ubuntu 14 fakat yılında
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 
} 

deneyin ile Ubuntu 16.04 yürütmek için zaman PHP7.0 ve sinyal göndermek (PID öldürmek), PHP CLI durmaz ve runnig tutmak.

Ubuntu 16.04 i PCNTL eklentisini kontrol edin ve bu ok: Ben çalıştırdığınızda

>php -m | grep pcntl 
pcntl 

Ben herhangi bir hata yok, ama ne durur (veya görünen eko).

PHP7 ve pcntl ile ilgili bir sorun var mı?

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(); 

Bu kod durmuyor: fonksiyonuna içine iken döngü encapsulate zaman

GÜNCELLEME

sorundur.

+0

Gönderdiğiniz kod SIGTERM'de çıkmıyor. Bu yüzden SIGTERM'e gönderirken durmamalı. Neden daha önce çalışmadı, doğru soru. –

+0

@ErkiA Kodu düzenledim. Kayıt sinyali işleyicilerinden sonra bir döngü var. Sorun, sinyallerin stopSending() tarafından yakalanması, ancak eko yazdırılmamasıdır. – jfra

+0

@ErkiA Yani, hata ayıklama kodudur. Özgün kod işlevi "stopSending" programdan çıkar. – jfra

cevap

2

here PHP sinyal işleme hakkında iyi bir açıklama var. Bu nedenle, sinyal işleyicinizin uygun zamanda tetiklenmesini sağlamanın en iyi yolu şunun gibi olacaktır:

<?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(); 

?>