0

可能重复:
管理长时间运行的 php 脚本的最佳方法?

我必须建立一个大电子邮件列表。一切正常,但是当我提交表单页面时正在加载,直到每封电子邮件都发送完毕。所以我希望这个电子邮件发送脚本在后台运行。并注意脚本在后台运行的用户。我不能使用 Ajax。

我想要类似.. proc_open,exec,shell_exec ..

4

8 回答 8

1

您可以拥有 cron 作业,该作业将运行 php 脚本,该脚本将从 db 获取队列并发送电子邮件

在主脚本上,您只需将电子邮件添加到队列

仅当您需要进度条时,我才会使用 ajax。使用 ajax 解决方案,您需要保持窗口打开直到它结束。

于 2012-07-20T09:40:45.820 回答
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 服务器上运行脚本。

于 2012-07-20T10:12:26.850 回答
0

例如 - 写入脚本运行时的某个地方“A”(数据库或文件)当前状态:“完成”/“不完整”。在后台启动脚本后,发送到您的用户等待页面,该页面使用 AJAX 处理“A”处的更改。

于 2012-07-20T09:43:51.367 回答
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>
于 2012-07-20T09:44:17.497 回答
0

如果您不想设置 cron 脚本,也可以尝试通过 ajax 函数运行脚本。

于 2012-07-20T09:46:45.517 回答
0

您可以构建一个调用 php 脚本的 AJAX 调用。这样,您的站点在请求完成时仍然可以运行。完成后,您的 AJAX 将返回,您可以向用户显示一个消息框。

有关更多信息,请至少检查此内容,如果您了解 AJAX 是什么以及它的作用,请将其与此一起使用

于 2012-07-20T09:42:44.977 回答
0

Ajax请求将是最好的选择。您可以使用 javascript 发送请求,甚至向用户报告进度(这可能需要一些额外的工作)

如果您发现 ajax 太难 - 在 iframe 中运行脚本。这不是最优雅,而是最简单的方法。

于 2012-07-20T09:42:58.090 回答
0

提交表单AJAX并更新 Div 中的进度

于 2012-07-20T09:43:17.340 回答