PHP 中的批处理的实现

2019-04-11 01:14:56刘景俊


下一步是编写一个简单的测试脚本,这个脚本将一个条目添加到队列中。

清单 3. mailout_test_add.php
    <?phprequire 'mailout.php';Mailouts::add( 'donotreply@mydomain.com',  'molly@nocompany.com.org',  'Test Subject',  'This is a test of the batch mail sendout' );?>


在这个示例中,我添加一个 mailout,这个消息要发送给某公司的 Molly,其中包括主题 “Test Subject” 和电子邮件主体。可以在命令行上运行这个脚本:php mailout_test_add.php。

为了发送电子邮件,需要另一个脚本,这个脚本作为作业处理程序。

清单 4. mailout_send.php
    <?phprequire_once 'mailout.php';function process( $from, $to, $subject, $email ) {  mail( $to, $subject, $email, "From: $from" );}$messages = Mailouts::get_all();foreach( $messages as $msg ) {  process( $msg[1], $msg[2], $msg[3], $msg[4] );  Mailouts::delete( $msg[0] );}?>


这个脚本使用 get_all() 方法检索所有电子邮件消息,然后使用 PHP 的 mail() 方法逐一发送消息。在每次成功发送电子邮件之后,调用 delete() 方法从队列中删除对应的记录。

使用 cron 守护进程定期运行这个脚本。运行这个脚本的频率取决于您的应用程序的需要。

注意:PHP Extension and Application Repository(PEAR)存储库包含一个出色的 邮件队列系统 实现,可以免费下载。

 回页首 


更通用的方法

专门用来发送电子邮件的解决方案是很不错,但是是否有更通用的方法?我们需要能够发送电子邮件、生成报告或者执行其他耗费时间的处理,而不必在浏览器中等待处理完成。

为此,可以利用一个事实:PHP 是一种解释型语言。可以将 PHP 代码存储在数据库中的队列中,以后再执行它。这需要两个表,见清单 5。

清单 5. generic.sql
    DROP TABLE IF EXISTS processing_items;CREATE TABLE processing_items (  id MEDIUMINT NOT NULL AUTO_INCREMENT,  function TEXT NOT NULL,  PRIMARY KEY ( id ));DROP TABLE IF EXISTS processing_args;CREATE TABLE processing_args (  id MEDIUMINT NOT NULL AUTO_INCREMENT,  item_id MEDIUMINT NOT NULL,  key_name TEXT NOT NULL,  value TEXT NOT NULL,  PRIMARY KEY ( id ));
相关文章 大家在看