jjzjj

php - Yii2 批量删除操作发生Internal Server Error

coder 2024-04-08 原文

我在 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() block 内,我也会收到内部服务器错误。我将最大执行时间设置为 -1,并将最大内存分配设置为 5120M,目前这不是问题。我认为这是一个连接错误太多的问题,同时有那么多 SQL 操作,因此,我通过放置 'attributes'=> [PDO::ATTR_PERSISTENT => true] 在 Yii2 中启用持久连接。但问题依然存在。

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

我的问题是-

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

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

  3. 这是 Apache 杀死子进程的情况吗?

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

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

提前致谢。

最佳答案

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

关于php - Yii2 批量删除操作发生Internal Server Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53493988/

有关php - Yii2 批量删除操作发生Internal Server Error的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  6. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  7. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  8. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  9. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  10. ruby - 当 attr_accessor 在类方法中时会发生什么? - 2

    所以我想到了这个,想知道当下面的一些事情完成后会发生什么。classTestdefself.abcattr_accessor:Johnendendobject=Test.newputs"beforecallingclassmethodabc:#{object.class.instance_methods(false)}"Test.abcputs"aftercallingclassmethodabc:#{object.class.instance_methods(false)}"这里我检查的是,getter和setter方法是否以这种方式创建。如果是这样,是那些实例方法或类方法。首先我创

随机推荐