我有两个PHP文件,它们运行很长时间(没有执行限制)。其中一个文件用于检查远程服务器上的某些数据。为了使其更有效,我运行了一些文件#1的实例。一旦任何文件#1收到有效响应,第二个文件就应该执行操作。
问题 - 如何将数据从一个执行文件传递到另一个文件?第一个想法是按文件#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)工作原理相同 - 它睡眠时间为1毫秒,每秒只进行1000次迭代。
此致 纳斯
答案 0 :(得分:1)
使用PHP inotify扩展(http://www.php.net/manual/en/intro.inotify.php,扩展URL为http://pecl.php.net/package/inotify)。它会在文件更改时提醒您的进程。否则,您可以使用简单的套接字来引发第二个脚本。
答案 1 :(得分:1)
使用streams创建或连接到套接字,然后在套接字上选择。
答案 2 :(得分:1)
很多反馈。
首先我假设您在Web服务器中托管这些文件并通过在Web浏览器中“打开”它们来调用它们。我问这个是因为问题中提到的“无执行限制”。您应该考虑在CLI上编写和运行PHP脚本,除非您的托管架构有一些限制。如果您已经将它们作为CLI脚本运行,请忽略它。
其次,正如其他人建议您应该使用PHP中可用的TCP / IP套接字API来连接两个脚本,其中一个脚本是服务器,第二个脚本是客户端。如果您对此不熟悉,可能需要一段时间才能正确完成。所以你现在也可以忽略它。
第三,为什么最小睡眠持续时间是1ms是一个问题?这让我感到困惑,因为一方面,你说你正在使用睡眠,因为没有它,负载很高。另一方面,你想要睡眠不到1毫秒...理想情况下,你应该睡5秒,10秒或更长时间,这取决于文件的更新频率,以及你需要什么样的时间回应它。如果你想要近乎即时的响应,你可以尝试做Linux尾部实用程序所做的事情。这是梨的inotify扩展(在我之前的另一张海报中提到)。如果这是一个非常严肃的应用程序,并且您需要非常快的响应时间,则应考虑使用实时操作系统。 RTOS会让你睡眠不到1毫秒。
第四,如果这两个脚本将在同一台服务器上(并且始终在同一台服务器上),您可以考虑其他选项,如共享内存。