如何在后台运行php文件

时间:2012-07-20 09:39:02

标签: php exec shell-exec proc-open

  

可能重复:
  Best way to manage long-running php script?

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

我想要一些像... proc_open,exec,shell_exec ..

8 个答案:

答案 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函数运行脚本。