CodeIgniter 项目上的第一个 HTTP 请求的延迟非常高

2024-02-22

我和一个朋友刚刚开始从事一个项目,其他人几年前就停止了开发,我们正在努力恢复它。我们已经解决了大部分与设置相关的问题,但有一个非常烦人的问题我们无法解决。

在我们的本地主机中,所有页面都占用A LOT加载/刷新的时间。我指的不是资产、脚本或任何东西,问题是第一个请求完成之前的延迟。大多数时候需要15到30秒,这是不可接受的,有时甚至会长达1或2分钟。

例如,下面是 Chrome 开发工具中“网络”选项卡的屏幕截图。第一行是视图,其他行是资产。


我们在谷歌上搜索了几个小时并尝试了一些不同的方法,但没有一个起作用。一些解决方案如this one https://serverfault.com/a/349618指向一些 Apache 的httpd.conf设置,但我放弃了它,因为我在其他项目中使用相同的服务器,并且这种情况从未发生过(无论如何我都尝试过,但没有成功)。其他人指出 PHP 版本冲突,所以我尝试将 MAMP 中的 PHP 从 5.4.10 更改为 5.2.17(该项目需要 5.2.3+),但这似乎也不起作用。

除了我的 MAMP 安装之外,我们还在带有 WAMP (PHP5.5) 的 Windows 计算机中测试了它,并且还在另一台带有干净的 MAMP (PHP5.5) 的 Mac 中测试了它,并且在这两种环境中都会发生相同的情况。因此,我们现在想知道问题是否可能出在 CodeIgniter 本身(这听起来不太可能)或某些项目配置中,但我们对 CodeIgniter 还很陌生(也不是 PHP 专家),找不到任何东西。

哦,我们也尝试联系最初的开发者,但他们说那是两年前的事,听起来他们不愿意提供帮助。我真的希望他们当时开发项目时没有遇到这个问题,因为加载时间为 30 秒,这太疯狂了。

有人有任何想法或了解更多我们可以尝试找到问题的事情吗?如果需要的话我可以发布一些代码。


Update:我刚刚发现这个未解决的问题 https://stackoverflow.com/q/23673578/2999215用户在使用 Laravel 时遇到了类似的问题,但只是有时。正如我所说,就我而言,这种情况发生了always,延迟时间从约 10 秒到几分钟不等。


更新2:正如 Wrikken 所建议的,我通过 xdebug 分析器运行了它,但我不确定如何解释结果以了解问题所在。我使用 PHPStorm 的“Analyze Xdebug Profiler”工具打开了一个快照,并按每次调用所用的时间对其进行了排序。以下是一些屏幕截图:

并按自己的时间排序:

That CashewModel在某些行中出现的是由以前的开发人员构建的某种自定义库,这也导致了我们已经解决的一些问题。我希望问题没有隐藏在那里,因为我不知道大多数自定义代码是如何工作的。

有任何想法吗?再说一遍,如果需要的话我可以发布代码。


更新3:深入研究代码,发现MY_Controller在上面的屏幕截图中是一个文件,以前的开发人员在其中创建了一些自定义控制器,扩展CI_Controller。我刚刚发现他们把所有的 Cashew 代码都推到了 GitHub 上,这是 MY_Controller 文件 https://github.com/cubledesarrollo/cashew/blob/master/application/core/MY_Controller.php.

我还将在此处粘贴第 467 行周围的所有相关代码(在 GitHub 的版本中是 464),其中涉及_remap里面的函数CashewController并且是分析器所说的所有时间都花在的地方。我把一些评论和名字翻译成英文。

/**
 *
 * Extension of the default controller, adding support for templates
 * 
 * Usage example:
 *
 * class Dummy extends EC_Controller
 * {
 *     public function index()
 *     {
 *         $this->add_section('id_in_template', 'page_name');
 *         $this->render_page(); // Renders the default template.
 *     }
 * }
 *
 */
class CashewController extends CI_Controller
{
    //
    // Some attributes here
    //

    function __construct() { ... }

    /**
     * We use this _remap to automatically create the CRUD method calls
     *
     * @param string $method
     * @param string $params
     */
    public function _remap($method, $params = array())
    {
        // NEW
        if ($method == 'new') {
            $method = '_new';
        }
        // CREATE
        else if ($method == 'index' && $this->request_method() == 'post') {
            $method = '_create';
        }
        else if (is_numeric($method) && $this->request_method() == 'post' && count($params) == 0) {
            $params[0] = $method;
            $method = '_create';
        }
        // SHOW
        else if (is_numeric($method) && count($params) == 0) {
            $params[0] = $method;
            $method = '_show';
        }
        else if (is_numeric($method) && count($params) == 1 && $params[0] == 'edit') {
            // EDIT
            if ($this->request_method() == 'get') {
                $params[0] = $method;
                $method = '_edit';
            }
            // UPDATE
            else if ($this->request_method() == 'post') {
                $params[0] = $method;
                $method = '_update';
            }
        }
        // DELETE
        else if (is_numeric($method) && count($params) == 1 && $params[0] == 'delete') {
            $params[0] = $method;
            $method = '_delete';
        }

        if (method_exists($this, $method)) {
            return call_user_func_array(array($this, $method), $params);
        }
        show_404();
    }

    //
    // Some more functions
    //
}


所以里面发生了一些事情call_user_func_array(array($this, $method), $params), right?


我发现了这个问题,感谢一条评论 https://stackoverflow.com/questions/25755699/very-high-latency-in-first-http-request-on-codeigniter-project/25770788#comment40308296_25755699上面发布了,但用户没有写答案,所以我将其发布在这里。

以前的开发人员编写的代码大量使用了memcached扩展名,我以前从未使用过,所以我不知道它是什么,也不知道我需要在我的计算机中启用它。我按照步骤操作here https://github.com/majksner/php-memcached-mamp就是这样,加载时间现在可以接受了。

感谢大家!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CodeIgniter 项目上的第一个 HTTP 请求的延迟非常高 的相关文章

  • PHP - Filter_var 替代方案?

    我构建了一个 php 脚本来输出以表单形式发布的数据 但遇到了问题 网站将运行的服务器运行 PHP 5 1 6 此版本的 PHP 不支持 filter var 我需要知道短期内的替代方案 最好是昨天 但在 Google 或 Stack Ov
  • PHP 或 WAMP 不确定是什么

    我已经安装了 WAMP 服务器 2 0 PHP 5 4 3 安装WAMP后我已经重新启动了所有服务并且可以打开 phpinfo 显示良好 phpmyadmin 它也显示得很好 我可以使用数据库 然而 当在 Chrome 中运行简单的 php
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 负载平衡集群中的 PHP 会话 - 如何?

    好的 我得到了这个完全罕见的负载平衡 PHP 网站的独特场景 令人遗憾的是 它过去没有进行负载平衡 现在我们开始遇到问题 目前唯一的问题是 PHP 会话 当然 一开始没有人想到这个问题 因此 PHP 会话配置保留为默认值 因此 两台服务器都
  • 如何通过php的require()或include()函数传递变量?

    当我使用这个时 require diggstyle code php page page no 警告是 无法打开流 第 198 行 C xampp htdocs 4ajax gallery core php 中没有错误 错误是 Failed
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 在 Symfony 序列化中更改序列化属性名称

    我正在使用 Symfony 序列化器 效果很好 use Symfony Component Serializer Annotation Groups Groups default notification public function g
  • 如何使用 Twig 的属性函数访问嵌套对象属性

    我试图使用一个树枝变量来访问另一个树枝变量的属性 直到我找到 属性 函数为止 该变量才起作用 除了需要访问嵌套属性的情况外 效果很好 当包含属性的变量实际上是对象 属性时 它不起作用 例如 attribute object1 variabl
  • apache_request_headers() 与 $_SERVER

    据我所知 apache request headers 提供与以下相同的信息 SERVER 但按键略有不同 为什么有人应该使用apache request headers 而不仅仅是从那里获取这些信息 SERVER 我在 Centos 上使
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入

随机推荐