概述
如果老板交给你一个业务很复杂的业务场景,并且要求你在测试环境测试生产环境的数据,你会怎么处理呢?
解决方案
解决方案1
第一个解决方案就是将实际生产环境需要的数据,先打印出需要的Sql语句,拼装,把Sql的查询结果放到以.csv文件的Excel表里加以处理。模拟出需要的数据暂存在脚本执行的数组里。
需要注意的是以下几个点:
$list = [];
$mapKey = [
'id',
'novel_id'
];
if (($handle = fopen("/home/work/www/testdb/listdb.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
for ($c = 0; $c < $num; $c++) {
$key = $mapKey[$c];
$arr[$key] = $data[$c];
}
$list[] = $arr;
unset($arr);
}
fclose($handle);
}
array_shift($list);
$list = array_values($list);
如果是少量数据,之前的解决方案就可以解决问题,但如果数据多该怎么处理呢?
解决方案2
首先写一个导入程序,把需要的数据从Excel导入到Mysql的数据表中,考虑到要充分兼容之前的框架的类和方法。
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$path = '/home/work/www/testdb/test_rec2.xlsx';
$spreadsheet = $reader->load($path);
$worksheet = $spreadsheet->getActiveSheet();
$highestRow = $worksheet->getHighestRow();
$lines = $highestRow - 1;
if ($lines <= 0) {
exit('Excel表格中没有数据');
}
$res = [];
$obj = ChangpeiModule_Cpwxw_Novel_ApplyRecommend::getInstance();
for ($row = 2; $row <= $highestRow; ++$row) {
if(!$worksheet->getCellByColumnAndRow(1, $row)->getValue()) {
continue;
}
$item = [
'id' => (int)$worksheet->getCellByColumnAndRow(1, $row)->getValue(),
];
$lastId = $obj->add($item);
echo 'lastId:'.$lastId.PHP_EOL;
}
把需要的数据,导入一张新建的表,表结构相同,为了避免把测试服数据弄乱,以test_ 开头,区别其他测试服的数据表,把正式服的数据导入,导入后检测数据。
在执行中新建了同样的表结构和Model类库,以Test文件夹区别同源数据,运用更灵活,效率更高。
$scriptStartTime = microtime(true);
ChangpeiModule_Test_Novel_ApplyRecommend::getInstance()->testWeeklyScreenScript();
$scriptEndTime = microtime(true);
$diff = $scriptEndTime - $scriptStartTime;
echo '榜单上榜脚本执行结束,执行时间'.$diff;
$scriptStartTime = microtime(true);
ChangpeiModule_Test_Novel_ApplyRecommend::getInstance()->testEndStateScript();
$scriptEndTime = microtime(true);
$diff = $scriptEndTime - $scriptStartTime;
echo '执行榜单任务完成结果..'.$diff;
在导数据的时候有几个注意的点,你导出的数据是否是你需要的数据,一般的脚本任务会互相依赖其他的数据,第二就是导入的Excel表格的路径,重复实验时还要清空数据表,在清空数据表的时候,一定要注意清空,在之前的实践中,一次是误删了测试服的用户表,一次是手误清空了数据表,操作时要严谨,要格外注意!
|