【问题标题】:Named pipe in php on Windows/Mac/Linux?Windows/Mac/Linux 上 php 中的命名管道?
【发布时间】:2013-07-31 00:42:54
【问题描述】:

我目前在 php 中使用 proc_open() 与命令行工具进行通信。它会自动为 STDIN、STDOUT 和 STDERR 创建多达 3 个文件描述符,因为超过 3 个管道会破坏 Windows 兼容性。它在我的 Mac 上的 Windows XP 和 10.7 上运行良好。

但是,我希望能够创建自己的命名管道以进行更好的控制。如果我不能这样做,那么我必须维护进程资源及其流资源之间的引用,这会使我的代码过于复杂。我不能使用文件,因为它们会为长时间的任务填满磁盘空间。我也试图避免使用套接字,因为它们在 php 中默认不启用。

以下是我目前找到的链接:

http://bytes.com/topic/php/answers/557245-named-pipes-windows

https://bugs.php.net/bug.php?id=29005

Interprocess Communication using Named Pipes in C# + PHP

http://en.wikipedia.org/wiki/Named_pipe#In_Windows

http://www.phpkode.com/source/p/xp-framework/xp-framework-xp-framework-554d8b2/core/src/main/php/rdbms/mysqlx/NamedPipe.class.php

我已经在 php 5.3.13 中尝试过所有这些,但它们都不起作用:

var_dump(fopen("\\\\.\\pipe\\mypipe", "w+"));
var_dump(fopen("\\\\127.0.0.1\\pipe\\mypipe", "w+"));
var_dump(fopen("\\\\".php_uname('n')."\\pipe\\mypipe", "w+"));

我总是收到如下所示的错误:

PHP Warning:  fopen(\\.\pipe\mypipe): failed to open stream: No such file or directory in C:\Documents and Settings\Administrator\Desktop\named-pipe.php on line 15
PHP Stack trace:
PHP   1. {main}() C:\Documents and Settings\Administrator\Desktop\named-pipe.php:0
PHP   2. fopen() C:\Documents and Settings\Administrator\Desktop\named-pipe.php:15

Warning: fopen(\\.\pipe\mypipe): failed to open stream: No such file or directory in C:\Documents and Settings\Administrator\Desktop\named-pipe.php on line 15

Call Stack:
    0.0018     431936   1. {main}() C:\Documents and Settings\Administrator\Desktop\named-pipe.php:0
    0.0018     432072   2. fopen() C:\Documents and Settings\Administrator\Desktop\named-pipe.php:15

bool(false)

所以我的问题是,有没有人在 Windows XP 上成功打开命名管道?如果没有,哪些版本的 Windows 支持命名管道?我不知道管道“文件”描述符是否需要已经存在,例如它是否必须由 mysql 或其他服务创建。

如果您可以提供跨平台代码,可能会像此答案中使用 posix_mkfifo() 或 system("mkfifo pipe") 获得奖励积分:

http://www.php.net/manual/en/function.popen.php#22801

理想情况下,该解决方案应与 php 的 vanilla 安装一起使用,因此无需套接字等,但任何事情都有帮助,谢谢。

【问题讨论】:

    标签: php windows windows-xp named-pipes


    【解决方案1】:

    你真的读过http://bytes.com/topic/php/answers/557245-named-pipes-windows吗?

    解决方法是不要在管道名称中使用点。

    您的所有样本都在管道名称中带有点。

    【讨论】:

      【解决方案2】:

      您正在编写此服务器代码吗?看起来您正在使用客户端调用,也许您需要先创建管道?

      https://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx

      不确定是否可以用 php 编写服务器,需要 CreateNamedPipe()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多