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环境搭建最新方法
Sep 05 PHP
php在线打包程序源码
Jul 27 PHP
工厂模式在Zend Framework中应用介绍
Jul 10 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
PHP队列用法实例
Nov 05 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
php头像上传预览实例代码
May 02 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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去除数组中重复数据
2014/11/18 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
JavaScript游戏之优化篇
2010/11/08 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
vue组件横向树实现代码
2018/08/02 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
python基础之入门必看操作
2017/07/26 Python
python 全局变量的import机制介绍
2017/09/07 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
python Timer 类使用介绍
2020/12/28 Python
几道数据库的面试题或笔试题
2014/05/31 面试题
简单的JAVA编程面试题
2013/03/19 面试题
采购主管岗位职责
2014/02/01 职场文书
会务接待方案
2014/02/27 职场文书
学习雷锋倡议书
2014/04/15 职场文书
教师群众路线心得体会
2014/11/04 职场文书
神龙架导游词
2015/02/11 职场文书
2015年度保密工作总结
2015/04/24 职场文书
总经理年会致辞
2015/07/29 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL