【发布时间】: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 的唯一目的而设计的。
尊敬的, 保罗
【问题讨论】:
-
这似乎是解决方案的一部分:stackoverflow.com/questions/580013/…(另请查看右侧的相关帖子)
-
也许您可以编写一个流包装器,然后通过该包装器包含文件?然后对包装器代码中的代码进行更改。请参阅:php.net/manual/en/function.stream-wrapper-register.php 和 php.net/manual/en/class.streamwrapper.php
-
@Quasdunk 的解决方案不起作用,因为我无法控制 include 语句处理 fopen 的方式。
标签: php include named-pipes fifo