2011-09-03 133 views
3

我正在寻找一种方法来使用使用由posix_mkfifo创建的fifo(命名管道)文件来使用“include”语句。由于我的期望很高,我非常沮丧地看到页面被阻止,等待一个行动,我确信它不会发生。所以......我的逻辑规定,作为“包含”肯定使用某种“fopen” - 家庭功能,而fifos可以这样打开,我唯一要做的就是:创建一个,然后写入它可能会使资源保持活动状态直到它被包含在内,包括文件,关闭处理程序,删除文件。但当然不是那样的。我想包括以阻塞的方式打开文件,这种行为是我的问题的原因。 在c中使用fifos后,我注意到在非阻塞的开放方法中,fifo中的信息被保留,直到读者决定读取它为止。我希望有同样的行为。php包含来自fifo(命名管道)文件的指令

尽管我试图打开另一个页面写入相同的FIFO,以便读者可以继续下去,这也肯定会失败。此外,不仅页面没有响应,而且它也无法回答用户中止,事实是由于我的会话被阻止了几分钟,因为session_start()会告诉我,两个进程不能在一次(我在这里可能错误的是关于错误信息,我能记得很清楚,并且我已经删除了测试文件。)

我的问题是如果有什么办法可以达到这个效果:包括使用fifo。

最后, 回答所有关于到底为什么我要做这个,我会说,我的系统将自身真正的代码之间,它的处理,在一个动态的方式修改它需要为目的的问题,完全可逆的。为此,它需要读取原始文件,检查代码,在看起来时更改它,然后将其写入文件中,存储在新的“根”文件夹中,保留文件夹和文件层次结构,然后“包含”文件。 目前,我用真实文件替换了fifos的使用,但我需要过滤很多代码。尽管eval在我的函数中被过度使用,但它并不是一个解决方案,因为它不会保留当前目录和脚本名称,也不会保留特定于实际文件的任何内容,除此之外它对许多事情都非常明智,尤其是对于相对路径,以及PHP语法的奇怪用法。所以我仍然坚持写文件。

因为这个系统是一个可怕的时间消费者和一个糟糕的资源管理器,所以我最初的想法是写入更加轻便,保存在内存中,易失性的fifo中,并且真正用于IPC的唯一目的。

恕我直言, 保罗

+0

这似乎是解决方案的一部分:http://stackoverflow.com/questions/580013/how-do-i-perform-a-non-blocking-fopen-on-a-named-pipe-mkfifo (也可以查看右边的相关文章) – Quasdunk

+0

也许你可以编写一个流包装器,然后通过这个包装器包含这些文件?然后对包装的代码中的代码进行更改。请参阅:http://www.php.net/manual/en/function.stream-wrapper-register。php和http://www.php.net/manual/en/class.streamwrapper.php – hakre

+0

@Quasdunk的解决方案不起作用,因为我无法控制include语句处理fopen的方式。 – khael

回答

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它显示它是如何工作的。

+0

我刚刚在半小时前回答,但是在发表评论时,我已经开始讨论,尽管我在本网站找到了一个很好的知识来源,但我可能错过了最大字符数,而我的帖子未被注册。无论如何,我想感谢你提供的优雅解决方案,即使我在想吓唬甚至试用它的包装纸之前想到它。但是在玩了一下这个例子并且真正理解了它后,我发现自己被前面的可能性迷住了。我可能会返回一个完整的代码示例,以便为其他人寻找类似解决方案提供灵感。 – khael

+0

@paul:很高兴听到,谢谢你的反馈。 – hakre

+0

我想再次感谢你的回答。在离线测试之后,在我自己的服务器上,现在我正在与我的托管服务提供商的愚蠢规则作斗争,他们觉得那里的技术人员甚至不知道包装是什么。我在某些函数上得到了奇怪的行为,其中一些函数甚至不想使用包装器,其他人甚至不想使用包装器,而当他们做它们不让我在包装器中使用fread函数时,函数不会返回任何内容等等。 ,我对此很生气。面对无法克服一些人的愚蠢,我必须再次低下头。 – khael