Very high latency in first HTTP request on CodeIgn

2019-06-20 18:19发布

A friend and I just started working in a project which other people stopped developing a couple of years ago, and we're trying to resurrect it. We've already solved most of the setup-related issues, but there's a really annoying one that we can't figure out.

In our localhosts, all the pages take A LOT of time to load/refresh. And I don't mean assets, scripts or anything, the problem is the latency until the first request completes. Most times it takes 15 to 30 seconds, which is unacceptable, and sometimes it even goes up to 1 or 2 minutes.

For example, here's a screenshot of the Network tab in Chrome dev tools. The first row is the view, the other ones are assets.

Example of crazy latency


We've googled for hours and tried a few different things, but none of them has worked. Some solutions like this one point to some Apache's httpd.conf settings, but I discarded that since I'm using the same server for other projects and this never happened (I tried it anyway, but didn't work). Others point to PHP version conflicts, so I tried changing the PHP in my MAMP from 5.4.10 to 5.2.17 (the project requires 5.2.3+), but that didn't seem to work either.

Apart from my MAMP installation, we also tested it in a Windows machine with WAMP (PHP5.5), and also in another Mac with a clean MAMP (PHP5.5), and the same thing happens in both environments. So, we are now wondering if the problem could be in CodeIgniter itself (which sounds unlikely) or in some project configuration, but we're pretty new to CodeIgniter (and also not PHP experts) and couldn't find anything.

Oh, and we also tried contacting the original developers, but they said that was two years ago and sounded like they're unwilling to help. I really hope they didn't have this issue while developing the project back then, because working with 30sec load times it's just insane.

Someone have any idea or know about something more we could try to find the issue? I could post some code if needed.



Update: I just found this unsolved question where a user experienced a similar issue with Laravel, but only sometimes. As I said, in my case this happens always, with latency times spanning from ~10 seconds to a few minutes.



Update 2: As suggested by Wrikken, i ran it through an xdebug profiler, but I'm not sure of how to interpret the results to see where the issue is. I opened a snapshot with PHPStorm's "Analyze Xdebug Profiler" tool, and sorted it by time used in each call. Here are a couple of screenshots:

Execution Statistics tab Call Tree tab

And sorted by Own Time:

Sorted by Own Time

That CashewModel showing up in some lines is a some sort of custom library built by the previous developers, which was also causing some problems we already solved. I hope the problem isn't hidden there, because I have no idea of how most of that custom code works.

Any ideas? Again, I can post code if needed.



Update 3: Digging into the code, that MY_Controller in the screenshot above is a file where the previous developers created some custom controllers extending CI_Controller. I just found out that they pushed all the Cashew code to GitHub, here's the MY_Controller file.

I'll also paste here all the relevant code around line 467 (in GitHub's version is 464), which involves the _remap function inside the CashewController and is where the profiler says all the time is spent. I translated some comments and names into English.

/**
 *
 * 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
    //
}


So something's happening inside that call_user_func_array(array($this, $method), $params), right?

3条回答
【Aperson】
2楼-- · 2019-06-20 18:32

I found the issue thanks to a comment posted above but the user didn't write an answer, so I'm posting it here.

The code written by the previous developers is making a pretty intensive use of the memcached extension, which I never used before, so I didn't know what it was or that I needed to enable it in my computer. I followed the steps here and that was it, load times are acceptable now.

Thanks everyone!

查看更多
劳资没心,怎么记你
3楼-- · 2019-06-20 18:35

That sounds like a timeout on a domain or host-name look-up (or IP reversal), a bad localhost resolve to the IPv6 ::1 (with a fallback to 127.0.0.1), or an HTTPS request that timeouts out when doing a certificate revocation list check (you'd need to remove that option from whatever function that is handling this).

查看更多
不美不萌又怎样
4楼-- · 2019-06-20 18:43

I had the same problem. Some of the potential solutions are:
1. You might have debug mode on.
2. The cache might not be setup. Set it to auto cache.

If none of them works out, try using docker for codeigniter which worked out foe me.

Hope it helps.

查看更多
登录 后发表回答