关于脚本执行顺序的总结:
在数据量不大的情况下,我们对与顺序的执行可能不太在意,但是当数据量在千万级别以上的时候,脚本执行顺序就很重要了。
下面这个脚本在calculateSellerAndNums这个方法中添加了sleep(1)这个方法,对于执行顺序有很大的影响。
sleep会让下面的方法先执行查询。(有点新奇)
(1)未添加了sleep方法,执行顺序如下
日期\设备编号 | 1000 | 1001 |
---|---|---|
20180902 | 1 | 5 |
20180903 | 2 | 6 |
20180904 | 3 | 7 |
20180905 | 4 | 8 |
(2)添加sleep方法,执行顺序如下
日期 | 1000 | 1001 |
---|---|---|
20180902 | 1 | 2 |
20180903 | 3 | 4 |
20180904 | 5 | 6 |
20180905 | 7 | 8 |
start_time = ‘20180902’
end_time = ‘20180905’
private static $_number = 0;
//获取商户数和交易笔数
private function calculateSellerAndNums($deviceNo)
{
$result = [];
$field = 'count(*) as nums,count(DISTINCT c.uid) as sellernumber';
for ($i = $this->start_time; $i < $this->end_time; $i += 7200) { // 7200为2个小时
self::$_number ++;
if (self::$_number % 10 == 0) {
wlog('计数器:' . date('Y-m-d H:i:s', $i) . '-----' . date('Y-m-d H:i:s'), 'time.log');
}
$res = $this->consumeModel->alias('c')
->field($field)
->join('***')
->where('c.create_time BETWEEN ' . $i . ' AND ' . ($i + 7199) . ' AND c.pay_status = 1 AND m.device_no LIKE "'. $deviceNo .'%" AND c.`channel` = 11')
->find();
$result[date('Y-m-d', $i)]['num'] += $res['nums'];
//商户
$result[date('Y-m-d', $i)]['sellernumber'] += $res['sellernumber'];
// sleep(1);
}
return $result;
}
//小盒子数据导出
public function export()
{
set_time_limit(0);
try {
$this->consumeModel = self::_selectModel();
$baseArray = $heighArrayOne = $heighArrayThree = $newArray = $compatibleZeroArray = $compatibleOneArray = [];
$baseArray = $this->calculateSellerAndNums("1000");
$heighArrayOne = $this->calculateSellerAndNums("1001");
//中间代码省略。。。
$head = array(
['title' => '日期', 'key' => 'date'],
['title' => '基础版小盒子商户数', 'key' => 'baseSeller'],
['title' => '基础版小盒子交易笔数', 'key' => 'baseNum'],
['title' => '加强版小盒子商户数', 'key' => 'highSeller'],
['title' => '加强版小盒子交易笔数', 'key' => 'highNum'],
);
$handle = new CsvService();
$handle->setFileName('equimentDataExport_' . time());
$handle->addHead($head);
//添加内容
$handle->addContents($newArray);
$handle->saveAsFile();
$outputFileName = $handle->getZip();
wlog('文件名称:' . $outputFileName, 'equiment_data_export.log');
$path = rtrim(C('IMG_SITE_URL'), '/') . ltrim($outputFileName, '.');
} catch (Exception $e) {
wlog('错误信息:' . $e->getMessage(), 'equiment_data_export.log');
}
die(json_encode(['msg' => $path, 'state' => 1]));
}