PHP cron中的批处理


Posted in PHP onSeptember 16, 2008

大型的连锁店有一个大问题。每天,在每家商店会发生数千次交易。公司执行官希望对这些数据进行挖掘。哪些产品卖得好?哪些不好?有机产品在哪里卖得好?冰淇淋的销售情况怎么样?
为了捕捉这些数据,组织必须将所有事务性数据装载进一个数据模型,以便更适合生成公司所需的报告类型。但是,这很花费时间,而且随着连锁规模的增长,处理一天的数据可能要花费一天以上的时间。因此,这是个大问题。
现在,您的 Web 应用程序可能不需要处理这么多数据,但是任何站点的处理时间都有可能超过客户愿意等待的时间。一般来说,客户愿意等待的时间是 200 毫秒,如果超过这个时间,客户就会觉得过程 “缓慢”。这个数字基于桌面应用程序,而 Web 使我们更有耐心了。但无论如何,不应该让客户等待的时间超过几秒。所以,要采用一些策略来处理 PHP 中的批处理作业。
分散的方式与 cron
在 UNIX® 机器上,执行批处理的核心程序是 cron 守护进程。这个守护进程读取一个配置文件,这个文件会告诉它要运行哪些命令行以及运行的频率。然后,这个守护进程就按照配置执行它们。在遇到错误时,它甚至能够向指定的电子邮件地址发送错误输出,从而帮助对问题进行调试。
我知道一些工程师强烈主张使用线程技术。“线程!线程才是进行后台处理的真正方法。cron 守护进程太过时了。”
我不这么认为。
这两种方法我都用过,我认为 cron 具备 “Keep It Simple, Stupid(KISS,简单就是美)” 原则的优点。它使后台处理保持简单。不需要编写一直运行的多线程的作业处理应用程序(因此不会有内存泄漏),而是由 cron 启动一个简单的批处理脚本。这个脚本判断是否有作业要处理,执行作业,然后退出。不需要担心内存泄漏。也不需要担心线程停止或陷入无限循环。
那么,cron 是如何工作的?这依赖于您所处的系统环境。我只讨论老式简单的 cron 的 UNIX 命令行版本,您可以向系统管理员咨询如何在自己的 Web 应用程序中实现它。
下面是一个简单的 cron 配置,它在每天晚上 11 点运行一个 PHP 脚本:
0 23 * * * jack /usr/bin/php /users/home/jack/myscript.php

前 5 个字段定义应该启动脚本的时间。然后是应该用来运行这个脚本的用户名。其余的命令是要执行的命令行。时间字段分别是分、小时、月中的日、月和周中的日。下面是几个示例。
命令:
15 * * * * jack /usr/bin/php /users/home/jack/myscript.php

在每个小时的第 15 分钟运行脚本。
命令:
15,45 * * * * jack /usr/bin/php /users/home/jack/myscript.php

在每个小时的第 15 和第 45 分钟运行脚本。
命令:
*/1 3-23 * * * jack /usr/bin/php /users/home/jack/myscript.php

在早上 3 点到晚上 11 点之间的每分钟运行脚本。
命令
30 23 * * 6 jack /usr/bin/php /users/home/jack/myscript.php

在每星期六的晚上 11:30 运行脚本(星期六由 6 指定)。
可以看到,组合的数量是无限的。可以根据需要控制运行脚本的时间。还可以指定多个要运行的脚本,这样的话,一些脚本可以每分钟都运行,而其他脚本(比如备份脚本)可以每天只运行一次。
为了指定将报告的错误发送到哪个电子邮件地址,可以使用 MAILTO 指令,如下所示:
MAILTO=jherr@pobox.com
注意:对于 Microsoft® Windows® 用户,有一个等效的 Scheduled Tasks 系统可以用来定期启动命令行进程(比如 PHP 脚本)。

PHP 相关文章推荐
在PHP中使用XML
Oct 09 PHP
分页详解 从此分页无忧(PHP+mysql)
Nov 23 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
php加密解密实用类分享
Jan 07 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
百万级别知乎用户数据抓取与分析之PHP开发
Sep 28 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
May 08 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
FleaPHP的安全设置方法
Sep 15 #PHP
用PHP调用Oracle存储过程的方法
Sep 12 #PHP
php5新改动之短标记启用方法
Sep 11 #PHP
php5 pdo新改动加载注意事项
Sep 11 #PHP
PHP常用函数小技巧
Sep 11 #PHP
PHP下10件你也许并不了解的事情
Sep 11 #PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 #PHP
You might like
利用php实现禁用IE和火狐的缓存问题
2012/12/03 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
使用canvas进行图像编辑的实例
2017/08/29 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
python使用pil生成图片验证码的方法
2015/05/08 Python
Python中的super()方法使用简介
2015/08/14 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
Django如何实现防止XSS攻击
2020/10/13 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
高校毕业生登记表自我鉴定
2013/11/03 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
思想品德课教学反思
2016/02/24 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js