PHP包含指令从fifo(命名管道)文件


php include directive from fifo (named pipe) files

我正在寻找一种方法来使用使用posix_mkfifo创建的fifo(命名管道)文件来使用"include"语句。由于我的期望很高,当我看到页面被封锁时,我感到非常沮丧,等待着一个我确信永远不会发生的行动。

所以…我的逻辑规定,作为"包括"肯定使用某种"fopen"家族函数,fifo可以这样打开,我唯一要做的就是:创建一个,然后在其中写入,也许保持资源存活,直到它被包含,包括文件,关闭处理程序,删除文件。当然,事实并非如此。我想,包括打开文件在阻塞的方式,这种行为是我的问题的原因。在c中使用fifo后,我注意到在非阻塞开放方法中,fifo中的信息被保留,直到读者决定读取它。我希望你也能这么做。

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

我的问题是,如果有任何方法来实现这种效果:包括使用fifo。

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

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

与尊重,保罗

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

stream_wrapper_register("myfilter", "WrapCode");
include('myfilter://path-to-include');
# or
include('myfilter://file://path-to-include');

完成后,在WrapCode流包装器类中,您可以打开原始资源的流,然后在文件上透明地处理它。这将是动态的,所以您不需要关心将文件存储在某个地方(但您仍然可以这样做)。

PHP手册提供了一个简单的流包装器类的例子,展示了它是如何工作的。