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

时间:2018-11-27 06:31:48

标签: php postgresql yii2 internal-server-error

我在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多个记录时需要面对同样的问题。

我的问题是-

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

  2. 为什么最多可以使用45秒?

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

  4. 这是允许运行查询的最长时间吗?

  5. 如果这种情况下连接过多,那么为什么持久连接出现问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

执行的运行时间超过了配置所允许的时间。修复的两种方法:将源数据集分成较小的部分,然后分别执行;或更改PHP / POSTgres执行时间限制。

相关问题