php7.2 artisan 命令执行一半输出 Segmentation fault (core dumped)
我执行的命令:
php artisan xxx:xxx
不是一开始执行就报错,而是执行一部分报错,这个脚本的功能是:比如拿 1000 条数据,每次 50 条请求第三方接口,执行几次就会报这个错,网上找了没找到解决方法,有没有遇到过的,帮忙看下。
代码:
// 接口限制每次查询 50
$per_page = 50;
$total_page = ceil($all_num / $per_page);
$last_num = $all_num % $per_page;
$fail_num = 0;
echo '共' . $total_page . ' 页' . PHP_EOL;
for ($i = 0; $i < $total_page; $i++){
// 每次请求的 iccid
if ($i === $total_page - 1){
$per_iccids = array_slice($iccids,$i * $per_page,$last_num,true);
}else{
$per_iccids = array_slice($iccids,$i * $per_page,$per_page,true);
}
$per_iccids = array_values($per_iccids);
echo date('Y-m-d H:i:s') . '当前页:' . $i . PHP_EOL;
$res = UsageService::aliFlow($per_iccids);
if ($res['status'] != '0000' || !isset($res['data']['terminals'])){
var_dump($res);
echo date('Y-m-d H:i:s') . '查询失败!' . PHP_EOL;
exit;
}
$terminals = $res['data']['terminals'];
foreach ($terminals as $v){
// iccid monthToDateUsage imsi imei simStatus=2 已激活 realNameStatus
$columns = ['a.card_merchant','b.card_status','b.usage','b.expiration_time','b.activation_time','b.month_flow',
'b.category_type','b.id','b.add_time'];
$card_info = DB::table('usage_card_info as b')
->leftJoin('usage_iccid_list as a','a.iccid','=','b.iccid')
->where(['a.iccid'=>$v['iccid']])
->where('b.expiration_time','>',$datetime)
->orderBy('b.id','desc')
->first($columns);
$card_status = $card_info->card_status;
// 数据库: 1.已实名 2.未实名 3.待审核 4.实名未认证通过 0无需实名
// API : 0-不需实名未实名,1-需要实名未实名,2-需要实名已实名,3-不需要实名已实名
switch ($v['realNameStatus']){
case 0:
$is_certification = 0;
break;
case 2:
case 3:
$is_certification = 1;
break;
default:
$is_certification = 2;
}
// 转换单位 MB -> KB
$flow_used = $v['monthToDateUsage'] * 1024;
// 入库
DB::beginTransaction();
try {
// 流量未使用完 解除异常状态
if ($card_info->card_status != 1 && $flow_used < $card_info->usage && $card_info->expiration_time > $datetime){
UsageCardInfo::query()->where(['id'=>$card_info->id])->update(['card_status'=>1]);
$card_status = 1;
}
if ($card_info->activation_time == '0000-00-00 00:00:00'){
$card_info->activation_time = $datetime;
}
if (!$flow_left = UsageMonthFlowLeft::query()->where(['iccid'=>$v['iccid']])->first()){
$flow_left = new UsageMonthFlowLeft();
$flow_left->iccid = $v['iccid'];
$flow_left->flow_used = $flow_used; // 已使用流量
$flow_left->usage = $card_info->usage;
$flow_left->card_status = $card_status;
$flow_left->expiration_time = $card_info->expiration_time;
$flow_left->sur_package_time = floor((strtotime($card_info->expiration_time) - time()) / 86400);
$flow_left->month_used_total = $flow_used;
$flow_left->month_flow = $card_info->month_flow;
$flow_left->bind_imei = $v['imei'];
$flow_left->imsi = $v['imsi'];
$flow_left->status = $v['simStatus'];
$flow_left->super_package_usable = 0;
$flow_left->super_package_usage = 0;
$flow_left->month_available_flow_total = $card_info->month_flow;
$flow_left->surplus_flow = 0;
$flow_left->category_type = $card_info->category_type;
$flow_left->card_merchant = $card_info->card_merchant;
$flow_left->year_activate_time = $card_info->activation_time;
$flow_left->year_expiration_time = $card_info->expiration_time;
$flow_left->gz_package_type = 0;
$flow_left->is_certification = $is_certification;
$flow_left->warm = '*温馨提示:叠加包套餐或赠送套餐,每月26号过期;购买固定套餐时,当前月赠送2GB,下月生效固定套餐.';
$flow_left->save();
}else{
$flow_left->sur_package_time = floor((strtotime($card_info->expiration_time) - time()) / 86400);
$flow_left->flow_used = $flow_used;
$flow_left->is_certification = $is_certification;
$flow_left->save();
}
// 缓存流量使用数据
UsageService::CacheFlowInfo($flow_left);
DB::commit();
}catch (\Exception $e){
$msg = $e->getMessage();
DB::rollBack();
}
if (isset($msg)){
$fail_num ++;
echo date('Y-m-d H:i:s') . ': ' . $v['iccid'] . '处理失败 ' . $msg . PHP_EOL;
}
}
找到问题了,是 PHP sm3 扩展有问题,换了之后一切正常。