【发布时间】:2026-02-19 11:05:01
【问题描述】:
在我的网站中,我有一些功能可以上传用户的数据馈送。这些数据馈送通常有超过 30,000 条记录。并且每条记录都需要经过复杂的验证过程。因此,简单地说,此提要处理将需要 1 个多小时才能完成任务。这个长期运行的过程是不可避免的。
此提要由公共用户上传。并且提要大小小于 5MB 的文本文件。因此,我们不想授予 FTP 访问权限,也不想授予这些用户命令行访问权限。只有我们更愿意提供网络访问权限以上传提要。我们必须在上传后立即处理提要。一旦处理完毕,我们还必须向他们发送邮件报告。
现在的问题是长时间运行的网页在许多网络上引发了一些代理超时问题(因为需要 1 小时才能响应)。这是大多数客户端网络配置的问题。
我需要一种方法来在提要上传后触发 PHP 脚本。并且该脚本应该在后台运行,同时正确完成页面加载,而不会延迟客户端。
我会在后台处理数据并在处理完成后向客户端发送邮件。 Cron 选项卡在这里不可行,因为客户可能每月仅在意外的时间范围内使用这些功能几次。
如果有任何方法可以在后台触发 PHP 脚本但通过网络访问,请告诉我。
简化需求的示例脚本
假设这个例子并帮助我修改这个脚本以达到结果。我有两个 PHP 脚本“thread.php 和 createfile.php”。名为“thread.php”的文件将由客户端通过网络浏览器打开。该脚本需要执行脚本“createfile.php”。但需要 20 秒才能做出响应。但我们想让它在后台运行。并立即在浏览器中显示输出。
以下是示例脚本中的代码。
createfile.php (http://sugunan.net/demo/createfile.php)
<?php
sleep(20);
@unlink("phpfile.txt");
$myfile = fopen("phpfile.txt", "w") or die("Unable to open file!");
$txt = date("h:i:s")."\n";
fwrite($myfile, $txt);
fclose($myfile);
mail("someone@example.com","Background process","Process completed");
?>
创建的文件在网址可见:http://sugunan.net/demo/phpfile.txt
thread.php (http://sugunan.net/demo/thread.php)
<pre>
<?php
echo "Script start at: " . date('h:i:s') . "\n";
include("createfile.php"); //give a method to execute this script but in background without delay
echo "Script end at: " . date('h:i:s');
?>
这将给出sleep() 函数延迟的后续输出。
脚本开始于:02:53:27
脚本结束于:02:53:47
有没有办法在没有include() 方法的情况下执行“createfile.php”。并避免在后台处理“createfile.php”时出现 20 秒 sleep 延迟?
请考虑我想避免客户端的等待时间,并希望立即在浏览器上输出。
【问题讨论】:
-
感谢您的 cmets 和回答。我已经放置了带有可访问网址的示例代码。您能否建议我如何修改这些脚本以避免延迟但在后台处理。
-
@Marcin Orlowski:我已经尝试过类似问题的并行处理建议。它可以很好地进行并行处理。但这又在等待浏览器中的输出。如果该延迟发生在浏览器上,那么客户端将再次遇到代理超时问题。以下示例是我尝试过的示例。 mullie.eu/parallel-processing-multi-tasking-php
-
@Marcin Orlowski:我从另一个堆栈溢出答案中找到了可行的解决方案:*.com/questions/3819398/…。相关问题和选择的答案符合我的要求。如果您愿意,可以将我的问题作为该问题的重复。