【问题标题】:CodeIgniter performance issues with large form大型表单的 CodeIgniter 性能问题
【发布时间】:2013-05-09 21:17:14
【问题描述】:

我正在使用 CodeIgniter,但我在使用非常大的表单时遇到了一些性能问题。基本上它可以达到 1,000 个字段,因为它用于数据输入(许多字段具有相同的值,因此由于客户端代码,用户花费不到 30 分钟填写它)。

显示从数据库填充的表单只需不到一秒钟的时间。但是当用户点击提交时,现在获取 POST 数据而不是 DB 数据的完全相同的代码需要永远并且通常会超时。它适用于几百个字段(在 DB 中提交/插入不到 15 秒),但如果字段数量增加一倍,它突然需要更长的时间。

代码中有3部分(这里就不复制了,因为涉及到很多领域的所有逻辑,所以很长很复杂):

  1. 准备对象内部的数据(来自数据库或表单)
  2. 使用$this->form_validation->run() 进行表单验证
  3. 数据库插入/编辑

从数据库读取数据进行编辑时,第 1 部分非常快。当数据来自 POST 时,它永远不会到达第 2 部分,因此绝对不是表单验证或数据库插入的问题。

我有时会收到此消息,我认为问题来自 Codeigniter 的 XSS 保护:

Maximum execution time of 90 seconds exceeded in (...)/system/core/Security.php

你知道使用这些是否有点慢? $this->post->input('fieldname', TRUE)$this->input->post(NULL, TRUE)。 Codeigniter 是否会在我每次使用它们时进行大量计算,因此我是否应该在计算中使用它们之前将每个帖子输入保存到一个变量中?

或者我可以关闭 XSS 保护,因为它在我们的管理部分,但我真的不会那样做。

或者也许根本不是这样,我的代码有点糟糕?

【问题讨论】:

  • 您是否尝试过Profiling 您的应用程序或使用Benchmarking Class?这可以帮助您确定代码的哪些部分(如果有)特别慢。

标签: php performance forms codeigniter


【解决方案1】:

问题解决了!基本上我在控制器的开头添加了这个:

if($this->input->post(NULL,TRUE)) $hasPOST = true;
else $hasPOST = false;

我用if($hasPOST) {do some stuff}替换了if($this->input->post(NULL,TRUE)) {do some stuff}的每一个实例。

现在提交不到一秒钟...使用if($this->input->post(NULL,TRUE)) 检查是否有一些发布数据的问题是codeigniter 每次都对所有字段运行xss 清理。

【讨论】:

    【解决方案2】:

    我会再次回顾您的用户场景,是否真的有必要一次性提交所有 1000 个值?或者您可以将其分解为用户的多步骤过程。对我来说,似乎有很多数据要处理。

    我会给你的脚本计时,看看你的瓶颈在哪里,这可能与 codeIgniter 无关,而纯粹是因为你试图提交如此大量的字段。

    【讨论】:

    • 我的备份解决方案确实是将表单分成几个部分,但这将意味着在没有真正了解问题所在的情况下重构整个事情,所以理想情况下它不会达到这一点.
    • 我一直在为脚本计时,现在看来,如果我有 400 个字段,则需要 15 秒,但如果我有 800 个字段,它甚至不会通过主循环 50 次。所以我高度怀疑在我的循环中使用它对性能非常非常不利:if($this->input->post(NULL,TRUE))。我认为每次调用 codeigniter 时都会对所有表单进行 xss 清理,这会在循环中调用时降低性能(然后它会进行 800x800 清理......)。
    猜你喜欢
    • 2016-11-04
    • 2018-05-20
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2019-06-29
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多