在Windows / Mac / Linux上用php命名管道?

时间:2013-07-30 18:09:49

标签: php windows windows-xp named-pipes

我目前在php中使用proc_open()与命令行工具进行通信。它会自动为STDIN,STDOUT和STDERR创建最多3个文件描述符,因为超过3个管道会破坏Windows的兼容性。它适用于Windows XP和Mac上的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()或系统(“mkfifo pipe”),如下所示:

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

理想情况下,解决方案应该使用php的vanilla安装,所以没有套接字等,但任何事情都有帮助谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

所有样品都带有管道名称的点。