我如何在PHP中创建循环并跟踪其完整性


How could i create loop in PHP and keep track of its completeness

我正在尝试使用php创建一个简单的时事通讯发送应用程序。我想知道我是否可以用PHP创建一个即使浏览器关闭也能持续运行的脚本。

我已经把代码写成

<?php
        include "db.php";
        $newsletterid=$_GET['id'];
        $t="select * from tbl_newsletters where newsletterid='".$newsletterid."'";
        $q=mysql_query($t);
        $r=mysql_fetch_array($q);
        $Subject=$r['subject'];
        $Message=$r['message'];
        $headers  = 'MIME-Version: 1.0' . "'r'n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "'r'n";
        $headers .= 'To: '.$_SESSION['login_name'].'<'.$email.'>' . "'r'n";
        $headers .= 'From: My Newsletter Manager <newsletter@myexample.com>' . "'r'n";
        $t="select email from tbl_subscribers where status='SUBSCRIBED'";
        $q=mysql_query($t);
        while($r=mysql_fetch_array($q))
        {
            $addresses[]=$r['email'];   
        }
        foreach($addresses as $address)
        {
            mail($address,$Subject,$Message,$headers) or die("Cannot Send Email");
            $t="insert into tbl_activities set
                username='".$_SESSION['login_name']."',
                activity='Sent News Letter [$Subject] to $address',
                date='".date("Y-m-d H:i:s")."',
                status='SUCCESS'                
                ";
            mysql_query($t) or die("Error Saving to Database");
        }
?>

我有点相信,这个脚本在向所有订户发送时事通讯时都能工作,但如果时事通讯运营商关闭浏览器会发生什么。这个脚本会持续发送时事通讯直到foreach循环完成吗?

即使这个脚本有效,我也愿意为发送的每封电子邮件显示一个进度条,操作员可以随时查看。

同时,我希望我能阻止运营商重新发送时事通讯,直到上一次完成?

我不是专家,也没有OOP和类实例的高级知识?

您应该阅读PHP的连接处理。本节文档讨论ignore_user_abort(),该函数告诉PHP解释器在浏览器断开与PHP脚本的连接后继续执行。它还告诉您关于set_time_limit()的信息,该函数用于设置脚本的超时持续时间。

例如,您可能想在脚本中添加这样的代码:

set_time_limit( 0 ); // 0 means never timeout
ignore_user_abort(true); // continue running when browser closes

当您的代码在与浏览器的连接之外运行时,错误处理、内存管理和事件日志等问题变得更加重要。了解在浏览器关闭后很长一段时间运行的代码是否成功,以及它实际做了什么,这很有帮助。

与在浏览器连接断开后运行PHP代码不同,需要考虑的另一个选项是将长时间运行的代码作为服务器端进程编写,并让PHP脚本只调用该服务器进程。这意味着所有的错误处理、内存管理和事件日志记录问题都可以在服务器端应用程序编程环境中处理,比如Java,它可能比PHP具有更好的功能。

当用户关闭客户端时,脚本的作用取决于如何处理PHP的连接处理。您可以中止脚本,也可以让它继续。

如果你决定中止脚本,你可以实现一个功能,保存新闻稿发送到的最后一个电子邮件地址。或者,你可以在循环中写入日志文件,如果脚本被中止,你就会知道所有已经通知的电子邮件。

PHP解释器对脚本施加时间限制,并将终止运行时间过长的脚本。我认为默认的时间限制是30秒,尽管它可以在服务器的配置中更改。

据我所知,PHP脚本只在响应客户端(例如浏览器)的请求时运行,而脚本的目的只是响应特定的请求。您不能独立于任何请求进行后台处理。

我写了一个简单的测试代码:

 <?php
set_time_limit(0);  //set time limit = unlimited
ini_set('memory_limit','900M'); //memory max 900MB

for($i=0;$i<=30000;$i++)
{
    file_put_contents('temp/'.$i.'.txt','Some data...');
}
?> 

在浏览器中打开后,我再次关闭了浏览器,PHP仍在处理我的指令,并成功写入了所有的txt文件(0-30000)。也许您可以使用mail()函数创建自己的测试。希望这个简单的测试能给你更多的想法。

也许您想了解PHP连接状态是如何维护的:PHP连接处理。