У меня есть операция массового удаления в Yii2, ниже приведен код для удаления записей с журналом активности (здесь СУБД - 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, а максимальное выделение памяти - 5120 МБ, но это пока не проблема.Я думал, что это проблема слишком большого количества ошибок соединения, хотя у него столько операций SQL, поэтому я включаю постоянное соединение в Yii2, поставив 'attributes'=> [PDO::ATTR_PERSISTENT => true]
.Но проблема все еще существует.
Здесь запрос выполняется до 45 секунд, и там произошла ошибка.За 45 секунд он удаляет до 300 записей и ведет их журнал.После этого выдает внутреннюю ошибку сервера.В запросе нет ошибок.Хорошо, я написал пользовательский запрос для ускорения, и это удаляет до 500 записей.Но нужно столкнуться с той же проблемой, имея более 500 записей.
Мои вопросы -
Почему я получаю Внутреннюю ошибку сервера, даже если код находится внутри блока try {} catch ()?
Почему это работает до 45 секунд?
Это тот случай, когда Apache уничтожает подпроцесс?
Этопроблема максимального времени, разрешенного для выполнения запроса?
Если в этом случае слишком много соединений, то почему возникла проблема с постоянным соединением?
Заранее спасибо.