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