如何继续检查文件直到它存在,然后提供指向它的链接

Posted

技术标签:

【中文标题】如何继续检查文件直到它存在,然后提供指向它的链接【英文标题】:How to keep checking for a file until it exists, then provide a link to it 【发布时间】:2011-08-17 17:58:12 【问题描述】:

我正在使用 php 系统调用调用 Java 程序。 Java 程序需要一段时间才能运行,但最终会生成一个具有已知文件名的 PDF 文件。

我需要继续检查此文件,直到它存在,然后提供指向它的链接。我假设将涉及一个while循环,但我不希望它过于占用资源。这样做的好方法是什么?

【问题讨论】:

【参考方案1】:

如果您需要将其发送回浏览器,您可能应该使用对 setInterval 计时器的 AJAX 调用和检查文件是否存在的 PHP 脚本进行调查。您可以通过两种方式做到这一点:

    flush() html 返回包含 Javascipt 的浏览器,该 Javascipt 使用 AJAX 为浏览器轮询端启动轮询过程,您的 PHP 脚本使用 AJAX 函数来处理轮询。

    如果 flush() 不起作用,那么您应该在启动 Java 进程之前返回 PHP 脚本的 HTML。在该代码中放置两个 AJAX 调用。一个启动实际的 Java 进程,另一个启动轮询服务以查找文件。

长时间运行的脚本可能会在您从 Java 应用程序获得响应之前使浏览器超时,这就是为什么您可能需要浏览器与 Java 进程异步工作的原因。

另一方面,如果这是一个纯 PHP 脚本运行或 Java 进程小于典型的浏览器超时,您可以使用类似的东西:

$nofileexists = true;
while($nofilexists)  // loop until your file is there
  $nofileexists = checkFileExists(); //check to see if your file is there
  sleep(5); //sleeps for X seconds, in this case 5 before running the loop again

您没有提到这是一个高流量呼叫(对于许多公共用户)还是一个报告类型的应用程序。如果流量大,我会推荐AJAX路由,如果流量低,那么上面的代码。

【讨论】:

【参考方案2】:

基本上你做对了

while (!file_exists($filename)) sleep(1);
print '<a href="'.$filename.'">download PDF</a>';

两次检查之间的睡眠时间为 1 秒,因此它不会对您的 CPU 造成任何压力

【讨论】:

【参考方案3】:

这将完成工作,但您可以指定额外的超时。

while( !file_exists($pathToFile) )

    sleep(1);

【讨论】:

以上是关于如何继续检查文件直到它存在,然后提供指向它的链接的主要内容,如果未能解决你的问题,请参考以下文章

为啥在删除引用指向它的对象后继续存在?

如何在.py文件中运行一个继续提供服务的本地主机,直到关键字停止它为止?

用于检查文件是不是存在于 Web 服务器上的 Oracle 过程

如何让某件事继续下去,直到它在 android 中为真

正则表达式检查链接是不是指向文件

Discord.py,如果它不存在,我将如何让机器人创建一个频道,但如果它确实存在,它将继续执行它的任务?