我在Yii2中进行了批量删除操作,以下是这段代码,用于删除带有活动日志的记录(这里的DBMS是PostgreSQL)-
$companies = Yii::$app->request->post('ids', '');
if($companies && count($companies)) {
foreach ($companies as $company) {
try{
$utsendelseid = $company['utsendelseid'];
$mailid = $company['mailid'];
$model = MailSend::find()->where(['utsendelseid' => $utsendelseid, 'mailid' => $mailid])->one();
if($model && !$model->mailsendt) {
if($model->delete()) {
// if model deleted successfully then keep a log using commandBus
$companyModel = $this->findCompanyModel($model->kundenr);
$questionnaireModel = $this->findModel($utsendelseid);
Yii::$app->commandBus->handle(new AddCompanyLogCommand([
'kundenr' => $model->kundenr,
'portal_id' => ($questionnaireModel?$questionnaireModel->prosjektkode:''),
'activity' => Yii::t('backend', 'Slettet fra spørreskjema'),
'notes' => Yii::t('backend', 'Company "{company}" has been deleted from questionnaire - "{questionnaire}"("{questionnaire_id}")', [
'company' => ($companyModel?$companyModel->etternavn:''),
'questionnaire' => ($questionnaireModel?$questionnaireModel->beskrivelse:''),
'questionnaire_id' => $utsendelseid
]),
'activity_type_code' => 30,
]));
}
}
}
// even tried with PDOException
catch(Exception $e){
echo $e->getMessage();
// exit the request processing here
exit(0);
}
}
}
如果需要删除的记录数小于300,这将很好地工作。如果记录数大于300,即使代码位于try {} catch()块中,我也会收到内部服务器错误消息。我将最大执行时间设置为-1,并将最大内存分配设置为5120M,这现在不是问题。我认为这是一个有太多SQL操作的连接错误过多的问题,因此,我通过在'attributes'=> [PDO::ATTR_PERSISTENT => true]
中添加了Yii2中的持久连接。但是问题仍然存在。
在这里,查询最多执行45秒,并且在那里发生错误。在45秒内,它最多可删除300条记录并保留它们的日志。之后,它会发出内部服务器错误。查询没有错误。好的,我编写了自定义查询来加快速度,并且最多可以删除500条记录。但是有500多个记录时需要面对同样的问题。
我的问题是-
为什么即使代码在try {} catch()块中,我也出现内部服务器错误?
为什么最多可以使用45秒?
这是Apache杀死子进程的案例吗?
这是允许运行查询的最长时间吗?
如果这种情况下连接过多,那么为什么持久连接出现问题?
谢谢。
答案 0 :(得分:0)
执行的运行时间超过了配置所允许的时间。修复的两种方法:将源数据集分成较小的部分,然后分别执行;或更改PHP / POSTgres执行时间限制。