Php 对于执行时间可能较长的服务器,如何及时将结果返回给用户,并且不让服务器因过多的请求而过载?

Php 对于执行时间可能较长的服务器,如何及时将结果返回给用户,并且不让服务器因过多的请求而过载?,php,Php,我有一个带有web界面的服务器,通过它将任务提交到服务器,并将结果作为网页返回给用户。有时结果是动态生成的,有时可能需要几个小时。结果写入磁盘,并且检查\u状态功能定期检查任务是否完成。 在下面给出的代码中,似乎 while ($status == 0) { sleep(x); $status = check_status($pars); ... } 当用户等待其任务完成时,挂起服务器以执行大任务。 什么是及时将结果返回给用户而不过载的最佳解决方案 请求过多的服务器?

我有一个带有web界面的服务器,通过它将任务提交到服务器,并将结果作为网页返回给用户。有时结果是动态生成的,有时可能需要几个小时。结果写入磁盘,并且
检查\u状态
功能定期检查任务是否完成。 在下面给出的代码中,似乎

while ($status == 0) {
    sleep(x);
    $status = check_status($pars);
    ...
}
当用户等待其任务完成时,挂起服务器以执行大任务。 什么是及时将结果返回给用户而不过载的最佳解决方案 请求过多的服务器? 在循环中设置限制并终止它?或者是否有现代先进技术可用于
如何更有效地处理这些情况

$status = check_status($pars);
if ($status == 1) {
    ...
    print $result;
}
else {
    print $reference_to_future_result; 
}

ob_flush();
flush();

while ($status == 0) {
    sleep(30);
    $status=check_status($pars);
    if ($status == 1) {
        ...
        change_page_content_to_result;
    }
}
...

如果服务器的开放连接是一个问题,我建议使用AJAX从客户端定期轮询。客户机将每隔一段时间签入一次,服务器将在一个简单的HTTP响应中返回作业的状态


我建议您使用JavaScript的
setInterval()
和AJAX功能构建一些东西。

您需要将此过程与Web服务器分离,否则将继续阻止请求

我看到了一些选择

  • 使用cronjob从数据库读取作业队列(例如)并处理该作业。我在这里看到的唯一缺点是你的最低频率是1分钟。因此,您只需要保存工作负载并在数据库上设置一条记录,这样就可以由cronted脚本选择
  • 使用一个不断监听新作业的作业服务器(例如gearman),执行
    触发并忘记
    请求
  • 使用非阻塞服务器:node.js、tornado等。。。(这毫无意义,但值得一提)

对于这两种用途,您都需要使用某种方法来跟踪进度,您可以使用db或内存(memcache、redis等),然后使用js函数不断询问任务的进度

您研究过这个函数了吗?如果您使用的是Apache,
sleep()
将在这段时间内锁定整个Apache进程。一般来说,这是个坏主意,除非你想服药。不。这是行不通的,即使您使用ajax运行它,请求仍然会阻止其他请求。我的回答意味着没有任何请求被阻止。可以将其视为检查linux中后台进程的状态。每个AJAX请求仅检查作业的状态。您的作业本身被提交并在后台运行(不阻塞HTTP)。如果我们实际上是在讨论非阻塞请求<代码>没有过多的服务器超载请求<代码>不会是问题的一部分吗?我不会考虑每秒钟5秒或以上的任何方式…谢谢您的回复,还是看不出你的建议有什么好处。也许我错过了什么。您建议将循环移动到客户端。请求检查_状态调用的数量仍然相同。区别-在您的情况下,它们将是对服务器的外部调用。关键是循环是无限的。如果任务crushes=永远不会生成结果会发生什么。。。