在浏览器启动的后台执行php脚本

时间:2012-10-01 22:45:04

标签: php javascript ajax

我正在编写一个php脚本,用于将邮件发送到特定邮件列表中的所有电子邮件地址。邮件可能会达到数千个,整个脚本可能需要几个小时才能执行。我想要的是一旦用户输入邮件详细信息,正文,主题等并点击按钮/链接,php脚本在后台运行,用户在点击按钮/链接后立即重定向到某个页面。

简而言之,php脚本应该从浏览器启动,但即使浏览器关闭也应该在服务器上运行。

或者,如果使用AJAX / Javascript可以在重定向页面上显示进度条,但即使浏览器关闭,php脚本也应该继续执行。

3 个答案:

答案 0 :(得分:2)

PHP是错误的工作工具。在电子邮件服务器(可能是同一台服务器)上设置邮件列表,然后从浏览器通过ajax将数据传递给PHP,然后应该发送电子邮件(仅一次)到邮件列表。

电子邮件软件将负责向邮件列表的每个订阅者发送副本。

这是最有效方式之一。

一些可能有助于您进行更多研究的链接:

请记住,这与编程有没有,你应该在其他堆栈交换网站上寻求帮助(例如unixserverfault)。

答案 1 :(得分:0)

要使脚本继续运行并让它给它状态,即使用户刷新它也有点工作。

超级简单的方法是放弃第二部分。 如果你只需要在服务器端执行一个动作,你就可以拥有一个XHR(也就是ajax),并通过长轮询方法给出进展。

如果您希望进程独立于用户连接,则每次都需要生成一个新的PHP实例。然后找到一种方法将其输出提供给用户。 例如,您可以将输出存储到redis中。

答案 2 :(得分:0)

您想要做的是以下内容:

单击按钮调用您的处理脚本。然后,处理脚本应使用ignore_user_abort处理请求,以防止脚本在浏览器移动后停止,然后使用header('Location: success.html');

重定向浏览器
<?php
  ignore_user_abort(true);
  header('Location: success.html');
  echo 'Making sure the header gets flushed';
  flush();

  //Send out the mails
?>

但是,您需要确保脚本没有激活输出缓冲。如果您正在使用某些压缩模块或任何可能在提交内容之前等待整个过程完成的任何内容,从而冻结整个内容。最好是禁用脚本URL的任何输出缓冲。

这类似于在PHP中创建守护进程的方式。