批量删除操作在Yii2中发生内部服务器错误

Ves*_*shi 5 php postgresql internal-server-error yii2

我在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要删除的记录数低于300,这样可以正常工作.如果300以上的记录数甚至代码都在try {} catch()块内,我会收到内部服务器错误.我将最大执行时间设置为-1,将最大内存分配设置为5120M,这不是现在的问题.我认为这是一个有太多连接错误的问题,而有多少SQL操作,因此,我通过put启用Yii2中的持久连接'attributes'=> [PDO::ATTR_PERSISTENT => true].但问题仍然存在.

这里,查询执行最多45秒,并在那里发生错误.在45秒内,它会删除多达300条记录并记录它们.之后,它会给出内部服务器错误.查询中没有错误.好的,我编写了自定义查询来加速并删除多达500条记录.但是在拥有超过500条记录时需要面对同样的问题.

我的问题是 -

  1. 为什么我收到内部服务器错误,即使代码在try {} catch()块内?

  2. 为什么它可以工作45秒?

  3. 这是Apache的子进程查杀案例吗?

  4. 是否允许运行查询的最长时间问题?

  5. 如果这种情况的连接太多,那么为什么持久连接会出现问题呢?

提前致谢.

Dav*_*ddy 0

执行的运行时间超出了配置允许的时间。修复方法有两种:将源数据集分成更小的部分并单独执行;或者更改 PHP/POSTgres 执行时间限制。