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

Posted

技术标签:

【中文标题】php包含来自fifo(命名管道)文件的指令【英文标题】:php include directive from fifo (named pipe) files 【发布时间】:2011-09-03 09:42:40 【问题描述】:

我正在寻找一种方法来使用使用 posix_mkfifo 创建的 fifo(命名管道)文件来使用“include”语句。由于我的期望很高,我非常沮丧地看到页面被阻止,等待一个我确信它永远不会发生的动作。

所以...我的逻辑表明,“include”肯定会使用某种“fopen”系列功能,并且可以通过这种方式打开fifos,我唯一要做的就是:创建一个,然后在其中写入,也许保持资源活着直到它被包含,包含文件,关闭处理程序,删除文件。但当然不是那样的。我想 include 以阻塞方式打开文件,这种行为是我的问题的原因。 在 c 中使用 fifos 后,我注意到在非阻塞打开方法中,fifo 中的信息被保留,直到读者决定阅读它。我希望有同样的行为。

虽然我试图打开另一个页面写入同一个fifo,以便阅读器可以继续,但这也注定会失败。此外,不仅页面不再响应,而且它也未能响应用户中止,事实上由于我的会话被阻塞了几分钟,因为 session_start() 会告诉我两个进程不能使用有一次(这里的错误信息可能我记错了,我记得很清楚,我已经删除了测试文件。)

我的问题是是否有任何方法可以实现这种效果:包括使用 fifo。

最后, 为了回答所有关于我为什么要这样做的问题,我会说我的系统将自己置于真实代码和正在处理的代码之间,目的是根据需要以动态方式对其进行修改,完全可逆。为此,它需要读取原始文件,检查代码,在需要时进行更改,然后将其写入文件中,在新的“根”文件夹中,保留文件夹和文件层次结构,然后“包含”文件. 目前,我将fifos的使用替换为真实文件之一,但我需要过滤很多代码。 eval,虽然在我的函数中被过度使用,但不是一个解决方案,因为它不保留当前目录和脚本名称,或任何特定于实际文件的内容,此外它对许多事情非常敏感,尤其是相对路径,并且php 语法的奇怪用法。所以我仍然坚持写文件。

因为这个系统是一个糟糕的时间消耗者和一个糟糕的资源管理器,我最初的想法是在 fifo 中编写更轻便、保存在内存中、易失性并且真正为 IPC 的唯一目的而设计的。

尊敬的, 保罗

【问题讨论】:

这似乎是解决方案的一部分:***.com/questions/580013/…(另请查看右侧的相关帖子) 也许您可以编写一个流包装器,然后通过该包装器包含文件?然后对包装器代码中的代码进行更改。请参阅:php.net/manual/en/function.stream-wrapper-register.php 和 php.net/manual/en/class.streamwrapper.php @Quasdunk 的解决方案不起作用,因为我无法控制 include 语句处理 fopen 的方式。 【参考方案1】:

正如评论中的建议,我会详细说明一下:编写您自己的流包装器,然后您可以在协议之上注册它:

stream_wrapper_register("myfilter", "WrapCode");

include('myfilter://path-to-include');

# or

include('myfilter://file://path-to-include');

完成后,在您的WrapCode 流包装类中,您可以打开原始资源的流,然后在文件上透明地处理它。这将是即时的,因此您无需关心将文件存储在某处(但您仍然可以这样做)。

PHP Manual offers an example with a simple stream wrapper class 显示了它的工作原理。

【讨论】:

半小时前我才刚要回答,但是像我一样开始发布 cmets,虽然我在这个网站上发现了一个很好的知识来源,但我可能错过了最大字符数,我的帖子没有挂号的。无论如何,我要感谢您提出的优雅解决方案,即使我在害怕包装器甚至尝试它之前就想到了它。但是在玩了一下这个例子并真正理解它之后,我发现自己被前面的可能性迷住了。我可能会返回我的完整代码示例,以启发其他人寻找类似的解决方案。 再次感谢您的回答。在我自己的服务器上离线测试后,现在我正在与托管服务提供商的愚蠢规则作斗争,感觉那里的技术人员甚至不知道包装器是什么。我在某些函数上出现了奇怪的行为,其中一些甚至不想使用包装器,而另一些则这样做,当他们这样做时,他们不允许我使用包装器内的 fread 函数,该函数什么也不返回,等等,我对此很生气。面对无法克服某些人的愚蠢,我必须再次低下头。 虽然我仍然想知道是否有任何方法可以包含命名管道!不幸的是,这可能是我唯一的解决方案。如果这是迄今为止最优雅的解决方案,也许是最好的方法。

以上是关于php包含来自fifo(命名管道)文件的指令的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信--FIFO(命名管道)

Linux系统编程——进程间通信:命名管道(FIFO)

简述Linux进程间通信之命名管道FIFO

命名管道(fifo)有多贵?

命名管道FIFO

什么时候应该使用 fifo 文件/命名管道?