2016-08-02 3 views
5

मैं PHP 5.5.9 में इस स्क्रिप्ट का उपयोग कर रहा हूँ:पीएचपी CLI PHP7.0 उबंटू xenial सर्वर में काम नहीं कर pcntl

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 
} 

उबंटू 14 कि ठीक काम करता है, लेकिन में कोशिश के साथ Ubuntu 16.04 में निष्पादित करने के लिए जब PHP7.0 और सिग्नल भेजने की कोशिश करें (पीआईडी ​​को मारें), PHP सीएलआई रुकता नहीं है और रननिग रखता है।

उबंटू 16.04 में मैं pcntl विस्तार के लिए जाँच, और कहा कि ठीक है:

>php -m | grep pcntl 
pcntl 

मैं किसी भी त्रुटि जब मैं चलाने के नहीं मिलता है, लेकिन न तो बंद हो जाता है (या प्रदर्शन गूंज)।

क्या PHP7 और pcntl के साथ कोई समस्या है?

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 मैंने कोड संपादित किया। मेरे पास रजिस्टर सिग्नल हैंडलर के बाद लूप के लिए एक लूप है। समस्या यह है कि सिग्नल को रोकना() पर कब्जा कर लिया जाता है, लेकिन गूंज प्रिंट नहीं किया जाता है। – 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(); 

?> 
संबंधित मुद्दे