【问题标题】:PHP - Wait specific time for execution of single line, otherwise returnPHP - 等待特定时间执行单行,否则返回
【发布时间】:2016-01-13 17:37:23
【问题描述】:

事实上,我有一个proc_open 函数,它将执行一个命令并将它的子命令传递给它。这里有一个问题,有时会发生而不是通常。

问题

当我想得到进程管道输出时,目标服务器没有响应,脚本将等待响应......

问题

我想说等待响应 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";
    }
}

【问题讨论】:

标签: php wait proc-open


【解决方案1】:

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

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

您遇到的直接问题是流,默认情况下是阻塞读取,因此只需将其设置为非阻塞即可让您越过第一个障碍:

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";

(顺便说一句,这可能不适用于 mswindows)

【讨论】:

  • 我正在 Ubuntu 中开发电报 CLI。将多个命令传递给进程,它将一一执行。但是当我使用你的方法时,一切都搞砸了,执行顺序和结果都变了!!!!
【解决方案2】:

使用 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);

我希望这会有所帮助?

【讨论】:

  • 感谢回复,但功能没有变化
  • 和以前一样,程序等待响应,响应不会到来,但程序等待并等待......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多