在我的网站上,我有一些功能允许用户上传数据源。这些数据源通常有超过30,000条记录。并且每个记录需要经过复杂的验证过程。因此,简单地处理这些数据源将需要超过1小时的时间才能完成任务。这个长时间运行的过程是不可避免的。
这些数据源由公共用户上传。而数据源大小小于5MB的文本文件。所以我们不想给FTP访问权限,也不想给这些用户命令行访问权限。我们只想通过Web访问来上传数据源。并且我们必须在他们上传后立即处理这些数据源。一旦处理完成,我们还必须发送邮件报告给他们。
现在的问题是长时间运行的网页会在许多网络上抛出一些代理超时问题(因为它需要1小时才能响应)。这是大多数客户端网络配置的问题。
我需要一种方法来触发一个PHP脚本一旦上传了数据源。并且该脚本应该在后台运行,同时完整地完成页面加载而不延迟客户端。
一旦处理完成,我将使后台处理数据并向客户端发送电子邮件。由于客户端可能只在几个月内使用这些功能,并且在意外的时间范围内使用,因此无法使用Cron表。
如果有任何方法可以通过网络访问来触发PHP脚本在后台运行,请告诉我。
一个简化需求的样例脚本
假设这个例子并帮助我修改这个脚本以实现结果。我有两个PHP脚本"thread.php和createfile.php"。名为"thread.php"的文件将由客户端通过Web浏览器打开。此脚本需要执行脚本"createfile.php"。但它将花费20秒来响应。但我们希望允许它在后台运行。并立即在浏览器中显示输出。
以下是示例脚本的代码。
createfile.php(http://sugunan.net/demo/createfile.php)
这将使用
请注意,我想避免客户端等待时间,并立即在浏览器上输出结果。
这些数据源由公共用户上传。而数据源大小小于5MB的文本文件。所以我们不想给FTP访问权限,也不想给这些用户命令行访问权限。我们只想通过Web访问来上传数据源。并且我们必须在他们上传后立即处理这些数据源。一旦处理完成,我们还必须发送邮件报告给他们。
现在的问题是长时间运行的网页会在许多网络上抛出一些代理超时问题(因为它需要1小时才能响应)。这是大多数客户端网络配置的问题。
我需要一种方法来触发一个PHP脚本一旦上传了数据源。并且该脚本应该在后台运行,同时完整地完成页面加载而不延迟客户端。
一旦处理完成,我将使后台处理数据并向客户端发送电子邮件。由于客户端可能只在几个月内使用这些功能,并且在意外的时间范围内使用,因此无法使用Cron表。
如果有任何方法可以通过网络访问来触发PHP脚本在后台运行,请告诉我。
一个简化需求的样例脚本
假设这个例子并帮助我修改这个脚本以实现结果。我有两个PHP脚本"thread.php和createfile.php"。名为"thread.php"的文件将由客户端通过Web浏览器打开。此脚本需要执行脚本"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
延迟?请注意,我想避免客户端等待时间,并立即在浏览器上输出结果。