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 相关文章推荐
php4与php5的区别小结(配置异同)
Dec 20 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
php之readdir函数用法实例
Nov 13 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP 断点续传实例详解
Nov 11 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
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
Javascript的闭包
2009/12/31 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
js倒计时显示实例
2016/12/11 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
平面设计师工作职责范文
2013/12/03 职场文书
文科生自我鉴定
2014/02/15 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
安全生产工作汇报
2014/10/28 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
党员承诺书格式范文
2015/04/28 职场文书
学习心得体会
2019/06/20 职场文书
五年级作文之想象作文
2019/10/30 职场文书
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis