使用 php 命名管道

Posted

技术标签:

【中文标题】使用 php 命名管道【英文标题】:Using a php named pipe 【发布时间】:2016-05-25 10:22:44 【问题描述】:

情况:

我使用以下代码创建了一个命名管道(在 php 中):

$pipeFile = "/files/queue";
posix_mkfifo($pipefile,0666);

现在我希望能够通过 php 页面(如 readpipe.phpput_in_pipe. php)。


问题:

我可以在 php 文件中使用哪些函数调用可以向命名管道发送数据,并从命名管道接收数据

重要提示:我现在已经如何通过终端向管道发送和接收数据:

echo lol > /files/queue
cat /path/to/pipe 

我不知道如何在 php 脚本中执行此操作。如果我有一个名为 readpipe.php 的页面,并且有人进入它,则该页面需要有一个函数调用来获取管道内的下一条消息(就像 cat ... 对终端所做的那样),类似地,名为 put_in_pipe.php 的页面需要将消息放入管道的代码(就像echo lol > ...)。

非常感谢任何和所有反馈!

【问题讨论】:

【参考方案1】:

您可以使用 PHP 中可用的任何文件 IO 函数,例如file_put_content/file_get_content 写入命名管道并从中读取,但我怀疑这是你想要的。在您描述的多页场景中,管道几乎无法使用。

【讨论】:

那里肯定有什么东西。我的意思是服务器进程间通信可能非常普遍。我知道我可以在文件夹中创建文本文件,并让脚本检查文件是否存在并在其中查找数据,但这似乎非常低效。我认为队列系统可能是一个不错的选择,但我在网上找到的所有队列都是用命名管道/套接字编码的,比如 pheanstalk。您会推荐一种替代服务器进程间通信的方法吗?我现在正处于最后一线希望。 这是一个不同但更好的问题。不幸的是,基于意见。根据您需要的“服务器间”通信类型和持久性级别,它可以是数据库(sql、nosql、普通文件等)或消息代理(activemq、gearman、rabbitmq 等等)。跨度> 好吧,例如分析这些选项。 beanstalkd/beanstalk/pheanstalk 是消息代理吗?因为那是我最初正在查看的队列系统,但这将落入“几乎不能在您(意思是我)描述的多页场景中使用”的情况,因为它实际上是一个使用命名管道的队列,并且我相信rabbitmq也是(我可能是错的)。另一方面,谈到数据库,使用数据库专门用于将数据从一个脚本发送到另一个脚本是很常见的做法吗?你觉得这件事有什么优点或缺点吗? 我刚刚提出了一个新问题,详细阐述了我一直在研究的内容:***.com/questions/37436692/… 是的,beantalk 是一个简单的消息代理。与数据库相比,没有优缺点。它们有不同的用途,您可以选择合适的工具来完成这项工作。向一个人提出建议是不公平的,因为你对你想要达到的目标只有 0 信息。 DB和MQ的根本区别在于前者是随机存取数据的存储,后者是顺序存取数据的队列。关于链接的问题 - 这是一团糟。这样的架构决策需要 a) 业务领域和 b) 可用工具的知识。你需要两个都学。

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

Windows上的PHP命名管道

c++ 和 php 中的命名管道

命名管道的问题

php包含来自fifo(命名管道)文件的指令

请教PHP里使用命名管道连接本机mysql如何写连接串

从 php 在命名管道上运行 shell 命令