PHP使用FIFO(命名管道)文件的include指令

3
我想找到一种使用posix_mkfifo创建的命名管道文件来使用“include”语句的方法。由于我的期望值很高,我看到页面被阻塞,等待我确定不会发生的操作而感到非常沮丧。
因此,我的逻辑是,“include”肯定使用某种“fopen”系列函数,并且可以以这种方式打开fifo,我的唯一要做的事情就是:创建一个fifo,然后写入其中,可能保持资源存活直到它被包含,包含文件,关闭处理程序,删除文件。但当然不是那样的。我认为,include以阻塞方式打开文件,这种行为是我的问题的原因。在c中使用fifo时,我注意到,在非阻塞打开方法中,fifo中的信息会保留,直到读者决定读取它。我希望有同样的行为。
尽管我尝试打开另一页以写入相同的fifo,以便读者可以继续,但也注定失败了。此外,不仅页面不再响应,而且它也无法响应用户中止,事实上,我的会话被阻塞了几分钟,因为session_start()会告诉我不能同时由两个进程使用(我可能在这里对错误消息有所错误,我记不清了,而且我已经删除了测试文件。)
我的问题是是否有任何方法可以实现此效果:使用fifo包含。
最后,为了回答所有关于我到底在做什么的问题,我会说我的系统将自己置于真正的代码和其处理之间,以便以动态方式完全可逆地修改它。为此,它需要读取原始文件,检查代码,在需要时更改代码,然后将其写入文件夹中的一个新“根”文件夹中,保持文件夹和文件层次结构,然后“包含”该文件。
目前,我用真实文件替换了fifo的使用,但我需要过滤大量代码。虽然eval在我的函数中被过度使用,但它不是解决方案,因为它不保留当前目录、脚本名称或任何特定于实际文件的内容,除此之外,它还对许多事情非常敏感,特别是相对路径和奇怪的php语法使用。所以我仍然被困在写文件中。
因此,该系统是一个可怕的时间消耗者和糟糕的资源管理器,我的最初想法是写入更轻、存储在内存中、易失性的fifo,而这些fifo真正为IPC而设计。

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

0

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

stream_wrapper_register("myfilter", "WrapCode");

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

# or

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

完成这一步后,在您的WrapCode流包装器类中,您可以打开一个流到原始资源,然后在文件上透明地处理它。这将是即时进行的,因此您不需要关心将文件存储在某个地方(但您仍然可以这样做)。 PHP手册提供了一个简单的流包装器类示例,展示了它的工作原理。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接