我正在寻找一种方法来使用使用由posix_mkfifo创建的fifo(命名管道)文件来使用“include”语句。由于我的期望很高,我非常沮丧地看到页面被阻止,等待一个行动,我确信它不会发生。所以......我的逻辑规定,作为“包含”肯定使用某种“fopen” - 家庭功能,而fifos可以这样打开,我唯一要做的就是:创建一个,然后写入它可能会使资源保持活动状态直到它被包含在内,包括文件,关闭处理程序,删除文件。但当然不是那样的。我想包括以阻塞的方式打开文件,这种行为是我的问题的原因。 在c中使用fifos后,我注意到在非阻塞的开放方法中,fifo中的信息被保留,直到读者决定读取它为止。我希望有同样的行为。php包含来自fifo(命名管道)文件的指令
尽管我试图打开另一个页面写入相同的FIFO,以便读者可以继续下去,这也肯定会失败。此外,不仅页面没有响应,而且它也无法回答用户中止,事实是由于我的会话被阻止了几分钟,因为session_start()会告诉我,两个进程不能在一次(我在这里可能错误的是关于错误信息,我能记得很清楚,并且我已经删除了测试文件。)
我的问题是如果有什么办法可以达到这个效果:包括使用fifo。
最后, 回答所有关于到底为什么我要做这个,我会说,我的系统将自身真正的代码之间,它的处理,在一个动态的方式修改它需要为目的的问题,完全可逆的。为此,它需要读取原始文件,检查代码,在看起来时更改它,然后将其写入文件中,存储在新的“根”文件夹中,保留文件夹和文件层次结构,然后“包含”文件。 目前,我用真实文件替换了fifos的使用,但我需要过滤很多代码。尽管eval在我的函数中被过度使用,但它并不是一个解决方案,因为它不会保留当前目录和脚本名称,也不会保留特定于实际文件的任何内容,除此之外它对许多事情都非常明智,尤其是对于相对路径,以及PHP语法的奇怪用法。所以我仍然坚持写文件。
因为这个系统是一个可怕的时间消费者和一个糟糕的资源管理器,所以我最初的想法是写入更加轻便,保存在内存中,易失性的fifo中,并且真正用于IPC的唯一目的。
恕我直言, 保罗
这似乎是解决方案的一部分:http://stackoverflow.com/questions/580013/how-do-i-perform-a-non-blocking-fopen-on-a-named-pipe-mkfifo (也可以查看右边的相关文章) – 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