很长时间到空php文件的第一个字节值

时间:2012-12-22 12:04:12

标签: php apache .htaccess cakephp mod-php

几个月前,我有question这样的话。现在为了隔离问题,我尝试了一种新的方法。我把一个空文件放到我的服务器上。

文件名是“foobar.php”。其内容如下:

<?php
echo "hello world";

但是当我尝试进入 example.com/foobar.php 时,我得到了

  

DNS 203毫秒
  连接3.33秒
  发送0毫秒
  到第一个字节的时间17.35秒
  接收1毫秒   总加载时间20.88秒

然后我把另一个名为“foobar.txt”的文件。其内容如下:

hello world<br/>

foobar.txt 的加载时间约为0.2秒。

此网站位于共享主机内部,因此无法获得root Linux访问权限。我试图找出是什么让我的网站变慢。

  • 当我得到这些结果时,我的网站上有60位访问者。并且它们在活动时发送AJAX请求。当它们处于活动状态时,它们几乎每3秒发送一次AJAX请求。
  • 一般来说,我的网站每秒有5-20个请求。
  • 我的托管服务提供商表示没有CPU过载,一般来说非常低。
  • 我向托管公司询问Apache限制。我得到整个共享服务器的这个值:
  

MaxClients 300
  MaxRequestsPerChild 4000
  ThreadsPerChild 25

  • example.com/mybigpage.php example.com/foobar.php 页面几乎同时打开。
  • 如果页面有txt,jpeg或其他扩展名,则会立即打开它们。如果扩展名是php,则打开速度非常慢。
  • CakePHP将会话文件存储在“/ httpdocs / app / tmp / sessions”文件夹中。会话文件在创建两个小时后删除。现在该文件夹中有3653个文件。最早的文件是在2.5小时前创建的。
  • 在我的配置中,PHP处理程序是Apache模块mod_php

新编辑: 我和我的托管公司谈过。并告诉他们“foobar.php”几乎在20秒内打开。虽然该文件根本没有代码。他们告诉我他们把“foobar.php”放到我们使用同一台服务器的其他网站上。我也试过“othersite.com/foobar.php”。它立刻打开了。但“mysite.com/foobar.php”几乎在15秒内开启。什么会造成这种行为?我们对其他网站使用相同的PHP配置,但它们会立即打开.. 可以是因为我的.htaccess规则吗?或者其他什么?

新编辑2: 我的提供商告诉我服务器内没有“apd.so”文件。所以我好像不能使用APD。

我应该寻找什么才能找到瓶颈? 什么会限制我的网站?


其他数据:来自phpinfo,我明白了:

  

'./ configure'' - prefix = / usr / local / lsws / lsphp5'   '--build = x86_64-redhat-linux-gnu'' - host = x86_64-redhat-linux-gnu'   '--target = x86_64-redhat-linux-gnu'' - sysddir = / etc'   '--datadir = / usr / share'' - includenid = / usr / include'   '--libdir = / usr / lib64'' - libdcdir = / usr / libexec'   '--localstatedir = / var'' - sharedstatedir = / usr / com'   '--mandir = / usr / share / man'' - infodir = / usr / share / info'   '--cache-file = .. / config.cache'' - with-libdir = lib64'   '--with-配置文件中路径= /等'   '--with-config-file-scan-dir = / etc / php.dd'' - disable-debug'   '--with-pic'' - disable-rpath'' - without-pear'' - with-bz2'   '--with-curl'' - with-exec-dir = / usr / bin'' - with-freetype-dir = / usr'   '--with-png-dir = / usr'' - without-gdbm'' - with-gettext'' - with-gmp'   '--with-iconv'' - with-jpeg-dir = / usr'' - with-openssl'   '--with-libexpat-dir = / usr / lib64'' - with-pcre-regex = / usr'   '--with-zlib'' - with-layout = GNU'' - enable-exif'' - enable-ftp'   '--enable-magic-quotes'' - enable-sockets'' - enable-sysvsem'   '--enable-sysvshm'' - enable-sysvmsg'' - enable-wddx'   '--with-kerberos'' - enable-ucd-snmp-hack'   '--with-unixODBC = shared,/ usr'' - enable-shmop'' - enable-calendar'   '--with-libxml-dir = / usr'' - with-mysql'' - with-mysqli'' - with-gd'   '--enable-dom'' - disable-dba'' - without-unixODBC'   '--enable-xmlreader'' - enable-xmlwriter'' - with-mcrypt'   '--enable-mbstring'' - with-litespeed'' - enable-soap'' - with-xsl'   '--with-pdo-mysql'' - with-pdo-sqlite'' - enable-sqlite-utf8'   '--with-pspell'' - with-sqlite = shared'' - with-xmlrpc'' - with-mhash'   '--enable-pdo'' - with-imap'' - with-imap-ssl'' - without-suhosin'   '--with-tidy'' - enable-zip'' - enable-inline-optimization'   '--enable-gd-native-ttf'' - enable-bcmath'

4 个答案:

答案 0 :(得分:6)

似乎很明显是一个PHP问题,因为Apache在提供静态文件方面没有问题。您是否尝试过从PECL安装APD

使用像APD这样的PHP分析器将向您展示瓶颈是否在PHP中,如果是,它将在何处。例如,你正在使用的框架是否缓慢?或者只是一个流氓扩展?

从官方manual解释:

使用APD,您只需在入口点添加一条指令:

<?php
apd_set_pprof_trace();
?>

APD会将分析信​​息转储到* apd.dumpdir / pprof_pid.ext *。

然后, pprofp 将使用您的转储文件并告诉您哪些方法正在缩短响应时间:

bash-2.05b$ pprofp -R /tmp/pprof.22141.0

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

如果您看到的延迟都没有显示在配置文件中,则表明它是系统范围的PHP配置问题(可能是流氓或配置错误的扩展)。但我猜它是框架中的东西。

答案 1 :(得分:4)

您在编写此问题时,您有几个客户端每3秒执行一次AJAX请求。这使得服务器上可用的所有PHP工作程序都可能被这些AJAX请求阻止。您的Web服务器收到/foobar.php的请求,然后必须等到PHP工作人员可以自由处理您的请求。

因此,对于您的问题可能的解决方案是(没有您更具体的AJAX需要,我需要保持这一般):

  • 让AJAX请求转到静态文件
  • 确保PHP在(AJAX)请求完成时真正关闭连接,例如使用header("Connection: close");(尽管这可能还不够,请检查PHP manual about connection handling上的注释)
  • 减少发出的AJAX请求数(与您的提供商合作制作的数字)

一般情况下,您需要提供商帮助解决此问题。您没有编写提供程序用于提供PHP的方法,例如使用fpm,有一个名为process.max的设置可以限制您的Web服务器并行处理这么多PHP文件的能力。

答案 2 :(得分:3)

如果没有您的提供者的合作,您就没有机会找出问题所在。

我建议它类似于磁盘io会话问题。

另一个有趣的观点是您的提供者使用: http://www.litespeedtech.com/php-litespeed-sapi.html 从来没有听说过那个bevore。

如果您的提供商会对mjk建议您的内容,您应该只是更改您的提供商。 接缝是因为他们没有受到控制。

答案 3 :(得分:2)

如果同一个空PHP文件在移动到另一个站点时立即加载,则不能归因于任何框架或包含的文件,因为此时已加载了非文件。

它可能是php或Apache端的配置问题,也可能是由重写规则引起的。我建议尝试以下方法:

1。)如果允许每站点PHP设置,请要求托管公司将您的特定php.ini重命名为其他名称,从另一个站点复制php.ini并重新启动Apache,看看是否有帮助。我在Windows上遇到了类似的问题,这是由于php.ini上的文件访问问题所以这可能会有所帮助。

2.。)暂时重命名.htaccess并再次访问php文件。如果加载时间减少,您将有一个错误的重写条件或其他指令。你也可以发布.htaccess的内容吗?