我正在写一个php脚本来发送邮件到特定邮件列表中的所有邮件地址。邮件可能会遇到数千个,整个脚本可能需要几个小时才能执行。我想要的是,一旦用户输入邮件的详细信息,主体,主题等,并点击按钮/链接,PHP脚本运行在后台,并且用户一旦点击按钮/链接就会被重定向到某个页面。从浏览器启动后台执行php脚本
简而言之,PHP脚本应该从浏览器启动,但应该在服务器上运行,即使浏览器已关闭。
或者,如果可以使用AJAX/Javascript在重定向页面上显示进度条,但即使浏览器关闭,php脚本仍应继续执行。
我正在写一个php脚本来发送邮件到特定邮件列表中的所有邮件地址。邮件可能会遇到数千个,整个脚本可能需要几个小时才能执行。我想要的是,一旦用户输入邮件的详细信息,主体,主题等,并点击按钮/链接,PHP脚本运行在后台,并且用户一旦点击按钮/链接就会被重定向到某个页面。从浏览器启动后台执行php脚本
简而言之,PHP脚本应该从浏览器启动,但应该在服务器上运行,即使浏览器已关闭。
或者,如果可以使用AJAX/Javascript在重定向页面上显示进度条,但即使浏览器关闭,php脚本仍应继续执行。
PHP是这个工作的错误工具。在电子邮件服务器(可能是同一台服务器)上设置一个邮件列表,然后从浏览器通过ajax将数据发送到PHP,然后应该将电子邮件(只发送一次)发送到邮件列表。
电子邮件软件将负责将副本发送给邮件列表的每个用户。
这是最有效的之一。
某些链接可以帮助你做更多的研究:
但请记住,这有什么做编程,你应该寻求帮助在其他一些堆栈交换站点(如unix或serverfault)。
要使脚本继续并让它处于状态,即使用户刷新了这一点也是有点工作的。
超级简单的方法是放弃第二部分。 如果您只需要执行服务器端的操作,则可以使用XHR(aka ajax),并使用长轮询方法给出进度。
如果您希望进程独立于用户连接,您需要每次都生成一个新的PHP实例。然后找到一种方法将其输出提供给用户。 例如,您可以将输出存储到redis中。
你想要做的是以下几点:
点击按钮调用你的处理脚本。然后,将处理脚本应该使用ignore_user_abort防止脚本停止一旦浏览器移动,然后重定向broser与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中创建一个deamon类似。
因此,如果我放弃显示进度条,只是想要该脚本完成执行,即使浏览器已关闭,还需要做什么? – user1510326
如果你这样做,当你达到1000分时,无论如何你都会回到我的答案。基本上,任何你试图使用软件(这里:PHP)的方式都没有被使用的方式将会**在某些时候**杀死你的服务器;) – Flavius