2016-08-02 67 views
5

我使用這個腳本在PHP 5.5.9:PHP CLI PCNTL不是在PHP7.0 Ubuntu的服務器x​​enial工作

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 
} 

在Ubuntu的14工作正常,但是當嘗試在Ubuntu 16.04與執行PHP7.0並嘗試發送信號(終止PID),PHP CLI不停止並保持運行。

在Ubuntu的16.04我檢查了pcntl擴展,這是確定的:

>php -m | grep pcntl 
pcntl 

,當我跑我沒有得到任何錯誤,但是沒有停止(或顯示回波)。

PHP7和pcntl有問題嗎?

UPDATE

問題是,當封裝while循環進入功能:

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

此代碼不會停止。

+0

您發佈的代碼不會在SIGTERM上退出。所以發送SIGTERM時不應該停止。爲什麼以前沒有工作,這是正確的問題。 –

+0

@ErkiA我編輯了代碼。在寄存器信號處理程序之後我有一個for循環。問題是信號被stopSending()捕獲,但沒有打印回顯。 – jfra

+0

@ErkiA我的意思是,這是調試代碼。函數「stopSending」的原始代碼退出程序。 – jfra

回答

2

關於PHP信號處理有一個很好的解釋here。因此,確保信號處理程序在適當時間觸發的最佳方法是這樣的:

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

?> 
相關問題