老版本ecos中产品中会存在大量失败请求,这部分失败请求是否可以通过linux的定时任务自动化触发“重新发送”呢?
当然可以了,下面是相关方法:
1、测试crontab是否可用:
a、运行如下命令对当前用户的crontab进行编辑
[root@localhost aabb]# crontab -e
b、加入如下的脚本,先对crontab进行调试
*/1 * * * * /usr/local/bin/php /home/www/info.php
注意:/usr/local/bin/php 是php运行目录 /home/www/info.php 是需要调用的php脚本 */1 * * * * 是指每分钟执行一次
c、测试php脚本,php脚本如下
<?php error_log(date('Y-m-d:h-i-s').'1111'." ",3,__FILE__.'log'); #在本脚本同目录将时间+1111打印输出到info.phplog文件中
d、进行调试,当页面不断出现新的log,是不是小小的成就感?
[root@localhost www]# tail -f info.phplog 2014-04-02:10-57-011111 2014-04-02:10-58-011111 2014-04-02:10-59-011111 2014-04-02:11-00-011111 2014-04-02:11-01-011111
2、新建php脚本[ecstore_path]/script/crontab/auto_repeat.php,脚本功能是重发请求,脚本如下:
<?php
//author:J.R.SUN(tntppa@163.com) require_once(realpath(dirname(__FILE__)).'/../../config/config.php'); define('APP_DIR',ROOT_DIR."/app/"); include_once(APP_DIR."/base/defined.php"); require_once(ROOT_DIR.'/app/base/kernel.php'); if(!kernel::register_autoload()){ require_once(APP_DIR.'/base/autoload.php'); } //调用重发函数 get_all_fail_message(); //获得所有失败请求数据,然后请求 function get_all_fail_message(){ $objBaseRpcpoll = app::get('base')->model('rpcpoll'); //将所有失败记录一次性取出来,然后处理,这样做的目的是为了减少sql的请求 //接上,但是这样做的坏处是你不知道到底有多少条失败的数据,可能导致单进程内存溢出,服务器500错误 //接上,后续的解决方式是分段取出数据,但是因为我这里是演示,我就不这样做了 $allFailData = $objBaseRpcpoll->getList('id,calltime',array('status'=>'failed')); foreach($allFailData as $value){ $orderNo = $value['id']; $callTime = $value['calltime']; repeat_request($orderNo,$callTime); } } //重复请求矩阵 function repeat_request($orderNo,$callTime){ $objBaseRpcpoll = app::get('base')->model('rpcpoll'); $tmp = $objBaseRpcpoll->getList('*', array('id'=>$orderNo,'calltime'=>$callTime)); if ($tmp) { $arrRpcpoll = $tmp[0]; $arrCallback = explode(':', $arrRpcpoll['callback']); $callback = array( 'class'=>$arrCallback[0], 'method'=>$arrCallback[1], ); $rpcPollKey = $arrRpcpoll['id'] . '-' . $arrRpcpoll['calltime']; // 与中心交互 $objRpcRequestService = kernel::service('b2c.rpc.send.request'); if ($objRpcRequestService && method_exists($objRpcRequestService, 'rpc_recaller_request')) { if ($objRpcRequestService instanceof b2c_api_rpc_request_interface) $objRpcRequestService->rpc_recaller_request($arrRpcpoll['method'], $arrRpcpoll['params'], $callback, $arrRpcpoll['method'], 1, $rpcPollKey); } else { $objRpcRequest = kernel::single('b2c_order_data_relation'); $objRpcRequest->form_request($arrRpcpoll['method'], $arrRpcpoll['params'], $callback, $arrRpcpoll['method'], 1, $rpcPollKey); } } }
3、测试脚本是否运行正确
cd 将目录定位到auto_repeat.php脚本下,然后运行命令:
[root@localhost crontab]# php auto_repeat.php
当后台【通信数据】列表中的【失败次数】加1 或者是后台失败的请求在减少,说明脚本起作用了
4、将crontab与auto_repeat.php脚本二合一,最终完成自动化重发的功能
修改crontab(默认当前root用户,如果指定用户,请使用命令:crontab -u username -e)
[root@localhost www]# crontab -e
修改成如下样子:
*/30 * * * * /usr/local/bin/php /home/www/ecstore/script/crontab/auto_repeat.php
上文意思是每30分钟执行一次,如果要禁止将运行结果发送邮件也可以修改成如下样子:
*/30 * * * * /usr/local/bin/php /home/www/ecstore/script/crontab/auto_repeat.php > /dev/null 2>&1