Произошла операция массового удаления Внутренняя ошибка сервера в Yii2 - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть операция массового удаления в 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 записей.

Мои вопросы -

  1. Почему я получаю Внутреннюю ошибку сервера, даже если код находится внутри блока try {} catch ()?

  2. Почему это работает до 45 секунд?

  3. Это тот случай, когда Apache уничтожает подпроцесс?

  4. Этопроблема максимального времени, разрешенного для выполнения запроса?

  5. Если в этом случае слишком много соединений, то почему возникла проблема с постоянным соединением?

Заранее спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

Выполнение выполняется дольше, чем позволяют конфигурации.Два способа исправить: разбить исходный набор данных на более мелкие части и выполнить отдельно;или измените ограничение времени выполнения PHP / POSTgres.

...