Windows上的PHP命名管道

Posted

技术标签:

【中文标题】Windows上的PHP命名管道【英文标题】:PHP Named pipes on windows 【发布时间】:2011-08-18 23:36:40 【问题描述】:

好的,这就是场景。假设我有一个 php 脚本,它应该等待某些信息可用,我认为如果我可以使这个脚本块而不是忙于循环直到该信息可用,这将是一个很好的解决方案。信息本身将由另一个 php 脚本实例提供。假设我希望阻止 X 数量的此类请求,直到这 1 个脚本实例提供此信息。 我想我可以使用命名管道,读取器进程将阻塞等待管道被写入,写入器将通过管道或其他方式提供所需的信息来写入并立即解除阻塞所有读取器。 我找到了 posix_mkfifo,但它在 Windows 上不起作用,有没有其他方法可以在 Windows 和 *nix 上工作。 或者,也许有某种方法可以让一堆请求阻塞,并在时间到时让另一个请求“释放它们”。 我真的不想求助于繁忙的循环,我想在不使用 1 秒延迟和 sutch 的情况下节省 cpu。

【问题讨论】:

你的返回键怎么了?它离开是因为觉得不需要吗? :-P 您已经告诉我们您认为解决问题的方法是什么,但如果您告诉我们问题可能会有更好的方法。 【参考方案1】:

如果您有可用的套接字扩展(或stream_socket_server()),您可以在脚本中创建一个套接字服务器,为其他脚本提供信息——让我们将该脚本称为“主”。然后,您可以让您想要阻止的所有脚本 - “奴隶” - 对 localhost 执行 fsockopen() 然后设置它们,以便 fgets()fwrite() 等将阻止直到数据可用那些插座。

这并不是最有效的方法,因为您必须将 IPC 分给 TCP 堆栈,但是如果您希望它在 Windoze 上工作,您不能使用 *nix 域套接字,所以这就是您坚持的方法。

我能想到的唯一另一件事是涉及临时文件和flock(),因为默认情况下它会阻塞,直到获得锁为止。这可能是最便携的选项,因为自古以来flock() 的行为在任何地方都是相同的,但它也可能无法(并且可能不会)在作为 ISAPI 模块运行的 PHP 实例上工作(请参阅PHP manual) .

【讨论】:

以上是关于Windows上的PHP命名管道的主要内容,如果未能解决你的问题,请参考以下文章

Docker Windows 容器挂载命名管道

在 IIS 上的 WebAPI 中访问被拒绝的命名管道

Java中命名管道的并发读/写(在Windows上)

从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)

保护 WCF 使用的命名管道

windows命名管道