2016-01-13 53 views
1

事实上,我有一个proc_open函数,它将执行一个命令并将其子命令传递给它。这里有一个问题,有时会发生,通常不会发生。PHP - 等待执行单行的特定时间,否则返回

问题

当我想处理管道OUT输出没有从目标服务器和脚本响应将等待响应提高到.....

问题

我想说,等待20秒的反应,如果你没有得到任何回应。从函数返回。这一点很重要,我不想停止脚本执行,而只是从函数返回。
我必须使用多线程库作为POSIX?

有什么办法来实现这个想法?
任何想法将不胜感激。在此先感谢

代码示例

<?PHP 
set_time_limit(0); 

..... 

public function test() 
{ 
    foreach ($this->commands as $cmd) 
    { 
     fwrite($pipes[0], "$cmd \n"); 

     //Sometimes PHP stuck on the following line 
     //Wait for almost 20 sec if respond did not came return 
     $read = fread($pipes[1], 2096) . "\n"; 
    } 
} 
+0

也许这可以帮助你:http://stackoverflow.com/questions/7749869/how-can-i-set-time-out-for-fread-when-access-socket – nikoskip

回答

0

你没有说什么操作系统,这是上运行,尽管你提POSIX。也不是哪个SAPI。总的来说,这些对你的选择有很大的影响。

此外,你还没有说过你开始的过程是什么,也没有说过它在超时时应该如何处理。关闭stdio流可能会强制进程崩溃。如果你想发送一个信号,你需要知道pid(IIRC不能从proc_open()中获得)。

你有最直接的问题是,流,默认情况下为阻止读取,因此简单地将它设置为非阻塞让你过了第一关:

set_stream_blocking($pipes[1],false); 
... 

fwrite($pipes[0], "$cmd \n"); 
$ttl=time()+20; 
while(''==$read && time()<$ttl) { 
    $read=fread($pipes[1],2096); 
    if (!$read) sleep(1); 
} 
if (!$read) echo " timeout"; 

(BTW这可能会无法正常工作在MsWindows中)

+0

我正在处理电报 - 在Ubuntu的cli。将多个命令管道输入到进程中,并且它将逐个执行它们。但是当我使用你的方法一切搞砸了,执行的顺序和结果改变了! –

0

使用stream_set_timeout(但如果同流和fwrite)后:

fwrite($pipes[0], "$cmd \n"); 
stream_set_timeout($pipes[1], 20); 
$read = fread($pipes[1], 2096) . "\n"; 

编辑: 在一些特殊情况下,您必须使用stream_select(),而不是PHP中的错误。

$r = [$pipes[0]]; 
$w = $e = null; 
if(stream_select($r, $w, $e, 20) !== false) 
    foreach($r as $s) 
    $read = fread($s,2096); 

我希望这有助于吗?

+0

感谢您的回复,但功能没有变化 –

+0

它是如何工作的? –

+0

像以前一样,程序等待响应,响应不会到来,但程序等待并等待... –