Windows/Mac/Linux上php中的命名管道


Named pipe in php on Windows/Mac/Linux?

我目前正在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

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

我在php5.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管道"),比如这个答案:

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

理想情况下,该解决方案应该使用php的普通安装,因此没有套接字等,但任何帮助都要感谢。

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

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

你所有的样品都在管子的名字上有点。

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

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

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