如何使用命名管道在fopen上设置超时

奥斯丁

我正在尝试使用命名管道在PHP中进行一些IPC。我有一个通过创建的命名管道

$pipePath = __DIR__ . '/pipe';
posix_mkfifo($pipePath, 0600);

完成一些计算后,应该向该管道写入另一个进程。我可以等待它完成并读取类似以下内容的结果:

$result = file_get_contents($pipePath);

或更详细

$in = fopen($pipePath, 'r');
$result = fread($in, 8192);
fclose($in);

(我简化了第二种方法;在实际代码中,我将检查错误,fread在结果大于8192字节的情况下循环运行,等等。)

但是,尽管其他过程应该完成,但是我不相信它会成功,因此我想尝试读取结果超时。等待一段时间后,我想放弃并报告一个错误消息,指出它崩溃了,等等。使用两种方法,PHP代码将永久挂起(或长时间),等待将某些内容写入管道。具体来说,file_get_contentsfread将挂起。

我唯一能想到的解决方案是这样的:

$timeout = 10; //seconds
for ($i = 0; $i < $timeout; $i++) {
    $in = @fopen($pipePath, 'rn');
    if ($in) break;
    sleep(1);
}
if (!$in) {
   throw new RuntimeException("The other process did not finish in the allotted time");
}
$result = fread($in, 8192);
fclose($in);

该问题的注释之一所示,这将使用未记录的'n'标志如果阻塞,它将导致呼叫立即失败。fopenfopen

但是,由于两个原因,我不喜欢此解决方案:

  1. 它每秒检查一次管道,从而完成不必要的工作。
  2. 如果另一个过程中的计算需要1.01秒才能完成,则将等待整整2秒才能获得结果。对于我想做的某些事情,这浪费了很多时间,值得尝试解决该问题。

fopenURL上调用时,我可以添加上下文参数来指定超时值。但是,这似乎不起作用,也没有设置默认的套接字超时。

有没有更好的方法用管道来做到这一点?如果没有,我可能会考虑切换到Unix套接字,但是在其他进程中不那么容易支持它们,因此我宁愿不这样做。

(仅供参考,我只关心Linux;如果这很重要,则不需要在Windows或其他任何工具上都可以使用的东西。)

米卡尔·林德奎斯特(Mikael Lindqvist)

我找到了一种方法来做...

首先,我不知道该n标志,这是非常有用的信息!

但是,如果函数阻塞将失败,这并非完全正确。它仍然返回文件句柄。我们可以使用文件句柄并将其传递给stream_select函数,以等待数据可用。

像这样:

$f=fopen("my.fifo","rn");
$r=array($f);
$w=array();
$x=array();
stream_select($r,$w,$x,10);

此代码等待10秒,以便其他人向fifo的另一端写入内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用命名管道作为临时文件?

来自分类Dev

使用命名管道的程序崩溃

来自分类Dev

使用命名管道模拟进程替换

来自分类Dev

在 c 中使用命名管道

来自分类Dev

在Linux上分割输出并再次使用命名管道重新加入

来自分类Dev

如何使用命名管道传达C和C#程序

来自分类Dev

使用命令行在Ubuntu上设置屏幕超时

来自分类Dev

使用命名管道传输ods输出和数据集

来自分类Dev

为什么要使用命名管道而不是文件?

来自分类Dev

为什么要使用命名管道而不是文件?

来自分类Dev

在C程序中创建的Bash中使用命名管道

来自分类Dev

与未命名管道相比,使用命名管道有什么优势?

来自分类Dev

如何使用命名索引(键)数组在嵌套哈希中设置值?

来自分类Dev

如何使用命名共享内存?

来自分类Dev

如何使用命名共享内存?

来自分类Dev

如何让 QEMU 使用命名的 Docker 接口?

来自分类Dev

如何使用命名空间遍历 Elementtree

来自分类Dev

使用命名函数设置多个事件响应

来自分类Dev

使用命名范围在VBA中设置范围

来自分类Dev

Windows x64上的Inno Setup设置命名管道

来自分类Dev

输入步骤超时,使用Jenkins管道以默认设置继续

来自分类Dev

使用命名空间时如何在PHP中的每个文件上不重复使用'Package \ Library'

来自分类常见问题

如何在Windows 8上使用命令提示符设置/更改DNS

来自分类Dev

如何在网络上设置超时

来自分类Dev

如何在TcpStream上设置连接超时

来自分类Dev

如何在Powershell命令上设置超时?

来自分类Dev

如何在网络上设置超时

来自分类Dev

如何在 Dataflow 上设置超时?

来自分类Dev

如何在javascript echo上设置超时

Related 相关文章

热门标签

归档