2010-11-06 73 views
0

我有两个PHP文件,它们运行很长时间(没有执行限制)。其中一个文件用于检查远程服务器上的一些数据。为了使它更有效,我运行了文件#1的几个实例。第二个文件应该是规范行为,一旦任何文件#1收到有效的响应。PHP - 将数据从一个进程发送到其他进程

问题 - 如何将数据从一个正在执行的文件传递给其他人?第一个想法是通过文件#1和文件#2将数据保存到文件定期检查文件修改时间。问题是它会给服务器造成很大的负载,如果我通过使用睡眠函数来限制它,那么我能够达到的最小睡眠时间是1ms(Linux系统的时间量 - 是否有任何方法可以改变它)?所以 - 也许任何人有任何想法如何将信息从一个过程传递给其他人?

$last = filemtime('action.txt'); 
while(!$stop) { 
    if($last != filemtime('action.txt')) { echo microtime(true); $stop = 1; } 
    clearstatcache('action.txt'); 
    usleep(100); 
    $i++; 
} 

任何低于< usleep(1000)的工作原理是相同的 - 它睡觉1ms的只有1000迭代每秒完成的。

问候, 乔纳斯

+0

感谢您的评论 - 在我的情况下,似乎流将是最合理和最有效的解决方案,因为我也能够在不需要读取/写入文件的情况下传递数据。 – flyeris 2010-11-06 16:49:50

回答

1

使用PHP的inotify扩展(http://www.php.net/manual/en/intro.inotify.php,扩展URL是http://pecl.php.net/package/inotify)。当文件改变时它会提醒你的进程。否则你可以使用一个简单的套接字来引发第二个脚本。

1

使用streams创建或连接到套接字,然后在套接字上选择。

1

很多反馈。

首先,我正确地假设您将这些文件托管在Web服务器中,并通过在Web浏览器中“打开”它们来调用它们。我在问这个问题是因为问题中提到的“不执行限制”。你应该考虑在cli上编写和运行你的php脚本,除非你的主机架构有一些限制。如果您已经将它们作为cli脚本运行,请忽略此操作。

秒,正如其他人建议你应该使用tcp/ip套接字API在PHP中连接两个脚本之间,一个脚本是服务器和第二个客户端。如果您对此不熟悉,则可能需要一段时间才能正确执行。所以你现在可以忽略这个。

第三,为什么最小睡眠时间是1ms是一个问题。这让我感到困惑,因为一方面你说你正在睡觉,因为没有它,负载就会很高。另一方面,你想睡不到1ms ......理想情况下,你应该睡5秒,10秒或更长时间,这取决于文件更新的频率以及你需要什么样的时间来响应到它。如果你想要近乎立竿见影的响应,你可以尝试做一下linux尾巴实用程序。这是梨inotify扩展(在我之前提到的其他海报)。如果这是一个非常严重的应用程序,并且您需要真正的快速响应时间,则应考虑使用实时操作系统。一个实时操作系统会给你睡眠少于1ms。

第四,如果这两个脚本要在同一台服务器上(并且总是在同一台服务器上),那么可以考虑其他选项,如共享内存。

+0

1.是的,脚本将在CLI上运行; 2.套接字将是以后使用的方法。谢谢你的提示! 3。好吧 - 如果我没有睡觉的话,它会每秒进行17000次迭代(检查),PHP文件消耗高达40%的服务器CPU。如果我使用任何睡眠,它将变为1ms,并且只有1000次迭代完成。这就是为什么我想在这之间做一个短暂的睡眠,将其限制在〜5000次左右。 – flyeris 2010-11-06 16:53:23

+0

4.共享内存?以某种方式来完成PHP? – flyeris 2010-11-06 16:54:00

+0

用php完成共享内存.. http://www.php.net/manual/en/ref.sem.php – 2010-11-06 17:00:58

相关问题