可能重复:
管理长时间运行的 php 脚本的最佳方法?
我必须建立一个大电子邮件列表。一切正常,但是当我提交表单页面时正在加载,直到每封电子邮件都发送完毕。所以我希望这个电子邮件发送脚本在后台运行。并注意脚本在后台运行的用户。我不能使用 Ajax。
我想要类似.. proc_open,exec,shell_exec ..
可能重复:
管理长时间运行的 php 脚本的最佳方法?
我必须建立一个大电子邮件列表。一切正常,但是当我提交表单页面时正在加载,直到每封电子邮件都发送完毕。所以我希望这个电子邮件发送脚本在后台运行。并注意脚本在后台运行的用户。我不能使用 Ajax。
我想要类似.. proc_open,exec,shell_exec ..
您可以拥有 cron 作业,该作业将运行 php 脚本,该脚本将从 db 获取队列并发送电子邮件
在主脚本上,您只需将电子邮件添加到队列
仅当您需要进度条时,我才会使用 ajax。使用 ajax 解决方案,您需要保持窗口打开直到它结束。
PHP 有一个函数可以保持进程运行,即使请求页面的用户离开页面:ignore_user_abort如果你检查那里的评论,你可以看到这个例子:
<?php
ignore_user_abort(1); // run script in background
set_time_limit(0); // run script forever
$interval=60*15; // do every 15 minutes...
do{
// add the script that has to be ran every 15 minutes here
// ...
sleep($interval); // wait 15 minutes
}while(true);
?>
这是一个纯粹的 php cron 作业,但是,这个脚本的风险是它会无限期地继续下去,或者至少直到你重置/杀死 php。
设置set_time_limit(0);
为set_time_limit(86400);
将在一天后终止脚本。
这应该为您指明正确的方向/。
重要 在 OP 出现问题后,建议仅在您对服务器具有 SSH 访问权限时才运行此脚本,这样您就可以 KILL/RESTART php apache 以防服务器一直挂起。也不要在 LIVE 服务器上运行脚本。
例如 - 写入脚本运行时的某个地方“A”(数据库或文件)当前状态:“完成”/“不完整”。在后台启动脚本后,发送到您的用户等待页面,该页面使用 AJAX 处理“A”处的更改。
这个 Ajax 脚本将在后台执行一个 PHP 文件。如果您愿意,它还可以将响应发送到 HTML 元素。
<script type="text/javascript" language="javascript">
function execute(filename,var1,var2,var3)
{
var xmlhttp;
if(window.XMLHttpRequest)
{
//Code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
//Code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
alert("Your browser does not support AJAX!");
}
var url = filename+"?";
var params = "var1="+var1+"&var2="+var2+"&var3="+var3;
xmlhttp.open("POST", url, true);
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
{
//Below line will fill a DIV with ID 'response'
//with the reply from the server. You can use this to troubleshoot
//document.getElementById('response').innerHTML=xmlhttp.responseText;
xmlhttp.close;
}
}
//Send the proper header information along with the request
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);
}
</script>
如果您不想设置 cron 脚本,也可以尝试通过 ajax 函数运行脚本。
Ajax请求将是最好的选择。您可以使用 javascript 发送请求,甚至向用户报告进度(这可能需要一些额外的工作)
如果您发现 ajax 太难 - 在 iframe 中运行脚本。这不是最优雅,而是最简单的方法。
提交表单AJAX
并更新 Div 中的进度