代码之家  ›  专栏  ›  技术社区  ›  Veshraj Joshi

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

  •  5
  • Veshraj Joshi  · 技术社区  · 6 年前

    我在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()块内,我也会收到内部服务器错误。我将max execution time设置为-1,max memory allocation设置为5120M,这现在不是问题所在。我认为这是一个连接错误太多的问题,而有那么多的SQL操作,因此,我在Yii2中启用持久连接,方法是 'attributes'=> [PDO::ATTR_PERSISTENT => true] . 但问题仍然存在。

    我的问题是-

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

    2. 为什么它能工作到45秒?

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

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   David J Eddy    6 年前

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