什么Apache / PHP / Server设置可能会影响从一个服务器到另一个服务器的CodeIgniter模型实例化的速度?

时间:2010-08-25 16:52:26

标签: php apache codeigniter apache2

与我的本地测试服务器相比,我的某个应用程序中的一个页面在Web服务器上的运行速度非常慢。在可能解释它的环境中存在一些根本性的差异,但我希望有一个更可解决的解决方案。

服务器:
Solaris 10
Apache 2.2.9 Prefork
PHP 5.2.6
该服务器运行在一个由4个甚至不到一年的Sun盒子组成的集群上,并且在性能方面不应该有任何问题。

本地测试服务器:
Windows XP
Apache 2.2.14 WinNT
PHP 5.3.1
这实际上是我自己的桌面 - 一台体面的机器,但与太阳盒相比应该很苍白。

应用程序是用CodeIgniter编写的,我使用了内部的分析功能来跟踪Model :: Model()的减速。例如,Model :: Model()在本地运行0.0006s,在服务器运行0.0045s。当您在页面上加载数百个模型时,这显然是一个问题。

我在这里从ServerFault交叉发布了这个,因为它可能与CodeIgniter更密切相关。

从本地,该页面需要2-3秒才能加载。从服务器,它是11-15。

本地模块,但不是远程模块:

  • mod_actions
  • mod_asis
  • mod_dav的 mod_dav_fs可以
  • mod_dav_lock的
  • mod_isapi mod_autoindex_color

远程模块,而不是本地模块:

  • mod_authn_dbm
  • mod_authn_anon
  • mod_authz_dbm
  • mod_authz_owner
  • mod_cache的
  • mod_mem_cache模块
  • mod_deflate模块
  • mod_authnz_ldap模块
  • mod_ldap模块
  • mod_mime_magic模块
  • 指定mod_expires
  • mod_unique_id
  • mod_autoindex
  • mod_suexec
  • mod_userdir
  • libphp5
  • mod_dtrace
  • mod_security2

修改

我一直在逐级降低基准测试,并发现最大的差异在于这段代码(在CodeIgniter函数Model :: _ assign_libraries中,并在模型的构造函数中调用):

    $time = microtime()*1000;
    foreach (array_keys(get_object_vars($CI)) as $key)
    {
        if ( ! isset($this->$key) AND $key != $this->_parent_name)
        {
            // In some cases using references can cause
            // problems so we'll conditionally use them
            if ($use_reference == TRUE)
            {
                $this->$key = NULL; // Needed to prevent reference errors with some configurations
                $this->$key =& $CI->$key;
            }
            else
            {
                $this->$key = $CI->$key;
            }
        }
    }
    if (get_class($this) == 'SeatType')
        echo sprintf('%.5f ms|', (microtime()*1000 - $time));

在本地,每次迭代打印大约0.48ms。在集群上,每次迭代打印大约3.9ms。

我开始怀疑这个问题是否在Apache / PHP之外 - 我将php.ini和htconf文件复制到我的本地服务器,并且(在删除mod_dtrace之后,几乎没有别的),我实际上看到了提高了性能。 (上面的检查现在在本地打印.2ms。)

1 个答案:

答案 0 :(得分:0)

我们发现虽然SPARC服务器看起来应该比我的PC中的core2 quad更好,但它们完全通过线程完成。任何一个线程实际上都会表现得更差性能下降可能是由于这一点。