我希望找到一种方法来使用由posix_mkfifo创建的fifo(命名管道)文件来使用“include”语句。由于我的期望很高,我非常沮丧地看到页面被阻止,等待我确信它不会发生的行动。
所以...我的逻辑决定了“包含”肯定会使用某种“fopen” - 家庭功能,并且可以通过这种方式打开fifos,我唯一要做的就是:创建一个,然后写入其中,可能保持资源活着,直到它被包含,包括文件,关闭处理程序,删除文件。但当然不是那样的。我认为include以阻塞方式打开文件,这种行为是我的问题的原因。 在c中使用了fifos之后,我注意到在非阻塞打开方法中,fifo中的信息被保留,直到读者决定阅读它。我希望有同样的行为。
虽然我试图打开另一个页面写入同一个fifo,以便读者可以继续,但也必然会失败。此外,不仅页面不再响应,而且它也无法回答用户中止,事实上由于我的会话被阻止了几分钟,因为session_start()会告诉我两个进程都无法使用一次(我在这里可能错误的是关于错误消息,我记得很清楚,而且我已经删除了测试文件。)
我的问题是,是否有任何方法可以实现这种效果:包括使用fifo。
最后, 为了回答所有关于我为什么要这样做的问题,我会说我的系统将自己置于真实代码和处理之间,目的是以动态方式根据需要修改它,完全可逆。为此,它需要读取原始文件,检查代码,在它看起来更改它然后将其写入文件,在新的“根”文件夹中,保留文件夹和文件层次结构然后“包含”文件。 目前,我将fifos的使用替换为真实文件之一,但我需要过滤大量代码。而eval虽然在我的函数中被过度使用,但它不是一个解决方案,因为它不保留当前目录和脚本名称,或者任何特定于实际文件的内容,除了它对许多事情都是非常明智的,特别是对于相对路径,以及奇怪的使用PHP语法。所以我仍然坚持写文件。
由于系统是一个糟糕的时间消费者和糟糕的资源管理器,我最初的想法是写入更轻,保存在内存中,易失性,并且真正用于IPC的唯一目的。 p>
尊重, 保罗
答案 0 :(得分:0)
正如评论中所建议的那样,我将详细说明一下:编写自己的流包装然后你可以在协议之上注册它:
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。