正在进行安全检测...

发布时间:2023-11-16 14:10:20

详细讲解PHP中的批处理如果Web应用程序中的一个特性需要超过1秒或2秒才能完成,那么应该怎么办?需要某种离线处理解决方案。学习几种对PHP应用程序中长时间运行的作业进行离线服务的方法。大型的连锁店有一个大问题。每天,在每家商店会发生数千次交易。公司执行官希望对这些数据进行挖掘。哪些产品卖得好?哪些不好?有机产品在哪里卖得好?冰淇淋的销售情况怎么样?为了捕捉这些数据,组织必须将所有事务性数据装载进一个数据模型,以便更适合生成公司所需的报告类型。但是,这很花费时间,而且随着连锁规模的增长,处理一天的数据可能要花费一天以上的时间。因此,这是个大问题。现在,您的Web应用程序可能不需要处理这么多数据,但是任何站点的处理时间都有可能超过客户愿意等待的时间。一般来说,客户愿意等待的时间是200毫秒,如果超过这个时间,客户就会觉得过程“缓慢”。这个数字基于桌面应用程序,而Web使我们更有耐心了。但无论如何,不应该让客户等待的时间超过几秒。所以,要采用一些策略来处理PHP中的批处理作业。分散的方式与cronUNIX®机器上,执行批处理的核心程序是cron守护进程。这个守护进程读取一个配置文件,这个文件会告诉它要运行哪些命令行以及运行的频率。然后,这个守护进程就按照配置执行它们。在遇到错误时,它甚至能够向指定的电子邮件地址发送错误输出,从而帮助对问题进行调试。我知道一些工程师强烈主张使用线程技术。“线程!线程才是进行后台处理的真正方法。cron守护进程太过时了。我不这么认为。这两种方法我都用过,我认为cron具备KeepItSimple,StupidKISS,简单就是美)原则的优点。它使后台处理保持简单。不需要编写一直运行的多线程的作业处理应用程序(因此不会有内存泄漏)而是由cron启动一个简单的批处理脚本。这个脚本判断是否有作业要处理,执行作业,然后退出。不需要担心内存泄漏。也不需要担心线程停止或陷入无限循环。那么,cron是如何工作的?这依赖于您所处的系统环境。我只讨论老式简单的cronUNIX命令行版本,您可以向系统管理员咨询如何在自己的Web应用程序中实现它。下面是一个简单的cron配置,它在每天晚上11点运行一个PHP脚本:023***jack/usr/bin/php/users/home/jack/myscript.php5个字段定义应该启动脚本的时间。然后是应该用来运行这个脚本的用户名。其余的命令是要执行的命令行。时间字段分别是分、小时、月中的日、月和周中的日。下面是几个示例。命令:15****jack/usr/bin/php/users/home/jack/myscript.php在每个小时的第15分钟运行脚本。命令:15,45****jack/usr/bin/php/users/home/jack/myscript.php在每个小时的第15和第45分钟运行脚本。命令:*/13-23***jack/usr/bin/php/users/home/jack/myscript.php在早上3点到晚上11点之间的每分钟运行脚本。
命令3023**6jack/usr/bin/php/users/home/jack/myscript.php在每星期六的晚上11:30运行脚本(星期六由6指定)可以看到,组合的数量是无限的。可以根据需要控制运行脚本的时间。还可以指定多个要运行的脚本,这样的话,一些脚本可以每分钟都运行,而其他脚本(比如备份脚本)可以每天只运行一次。为了指定将报告的错误发送到哪个电子邮件地址,可以使用MAILTO指令,如下所示:MAILTO=jherr@pobox注意:对于Microsoft®Windows®用户,有一个等效的ScheduledTasks系统可以用来定期启动命令行进程(比如PHP脚本)回页首批处理体系结构的基础知识批处理是相当简单的。在大多数情况下,采用两个工作流之一。第一个工作流用于进行报告;脚本每天运行一次,它生成报告并将报告发送给一组用户。第二个工作流是在响应某种请求时创建的批作业。例如,我登录进Web应用程序中,并要求它向系统中注册的所有用户发送一个消息,将一个新的特性告诉他们。这个操作必须进行批处理,因为系统中有10,000个用户。PHP要花费一段时间才能完成这样的任务,所以它必须由浏览器之外的一个作业来执行。在第二个工作流中,Web应用程序只需将信息放在某个位置,让批处理应用程序共享它。这些信息指定作业的性质(例如,Sendthise-mailtoallthepeopleonthesystem)批处理程序运行这个作业,然后删除作业。另一种方法是,处理程序将作业标为已完成。无论用哪种方法,作业都应该识别为已完成,这样就不会再次运行它。本文的其余部分演示在Web应用程序前端和批处理后端之间共享数据的各种方法。回页首邮件队列第一种方法是使用专用的邮件队列系统。在这种模型中,数据库中的一个表包含应该发送给各个用户的电子邮件消息。Web界面使用mailouts类将电子邮件添加到队列中。电子邮件处理程序使用mailouts类检索未处理的电子邮件,然后再次使用它从队列中删除未处理的电子邮件。这个模型首先需要MySQL模式。清单1.mailout.sqlDROPTABLEIFEXISTSmailouts;CREATETABLEmailouts(idMEDIUMINTNOTNULLAUTO_INCREMENT,from_addressTEXTNOTNULL,to_addressTEXTNOTNULL,subjectTEXTNOTNULL,contentTEXTNOTNULL,PRIMARYKEY(id;这个模式非常简单。每行中有一个from和一个to地址,以及电子邮件的主题和内容。对数据库中的mailouts表进行处理的是PHPmailouts类。清单2.mailouts.phpMailouts{publicstaticfunctionget_db({$dsn='mysql://root:@localhost/mailout';$db=&DB::Connect($dsn,array(;if(PEAR::isError($db{die($db->getMessage(;}return$db;}publicstaticfunctiondelete($id{$db=Mailouts::get_db(;$sth=$db->prepare('DELETEFROMmailoutsWHEREid=?';$db->execute($sth,$id;returntrue;}publicstaticfunctionadd($from,$to,$subject,$content{$db=Mailouts::get_db(;$sth=$db->prepare('INSERTINTOmailoutsVALUES(null,?,?,?,?';$db->execute($sth,array($from,$to,$subject,$content;returntrue;}publicstaticfunctionget_all({$db=Mailouts::get_db(;$res=$db->query("SELECT*FROMmailouts";$rows=array(;while($res->fetchInto($row{$rows[]=$row;}return$rows;}}?>

正在进行安全检测...

相关推荐