我必须建立一个大的电子邮件列表。一切都很完美,但是当我提交表单页面正在加载,直到每封电子邮件都发送。所以我希望这个电子邮件发送脚本在后台运行。并注意脚本运行的用户在背景中。 我不能使用Ajax。
我想要一些像... proc_open,exec,shell_exec ..
答案 0 :(得分:1)
你可以拥有运行php脚本的cron作业,它将从db获取队列并发送电子邮件
在主脚本上,您只需要将电子邮件添加到队列
只有在需要进度条的情况下我才会使用ajax。使用ajax解决方案,您需要保持窗口打开直到它结束。
答案 1 :(得分:1)
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服务器上运行脚本。
答案 2 :(得分:0)
您可以构建一个调用php脚本的AJAX调用。这样,您的网站仍然可以在请求完成时运行。完成后,您的AJAX将返回,您可以向用户显示消息框。
有关详细信息,请查看at least this,如果您了解AJAX及其功能,请将其与this一起使用
答案 3 :(得分:0)
Ajax请求将是最佳选择。您可以使用javascript发送请求,甚至向用户报告进度(可能需要一些额外的工作)
如果你发现ajax太难了 - 在iframe中运行脚本。这不是最优雅,但最简单的方法。
答案 4 :(得分:0)
使用AJAX
提交表单并更新Div中的进度
答案 5 :(得分:0)
例如 - 写入脚本运行时的某个位置“A”(db或file)当前状态:“complete”/“incomplete”。在后台启动脚本后发送到您的用户等待页面,使用AJAX处理更改“A”。
答案 6 :(得分:0)
此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>
答案 7 :(得分:0)
如果您不想设置cron脚本,也可以尝试通过ajax函数运行脚本。