5

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

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

4

3 回答 3

6

基本上你做对了

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

睡眠在检查之间有 1 秒的时间,所以它不会给你的 CPU 带来压力

于 2011-05-03T13:56:10.893 回答
3

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

while( !file_exists($pathToFile) )
{
    sleep(1);
}
于 2011-05-03T13:55:13.853 回答
1

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

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

  2. 如果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 路由,但如果流量低,那么上面的代码。

于 2011-05-03T14:12:50.203 回答