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


Long Time to First Byte value for an empty php file

几个月前我就有过这样的问题。现在,为了解决这个问题,我尝试了一种新的方法。我把一个空文件放到了服务器。

文件名为"foobar.php"。其内容如下:

<?php
echo "hello world";

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

DNS 203 mseconds
连接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限制。我得到了整个共享服务器的这些值:

数300MaxRequestsPerChild 4000
ThreadsPerChild 25

  • example.com/mybigpage.phpexample.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规则吗?或者其他事情?

新Edit2: 我的提供者告诉我不存在"apd"。文件在服务器中。看来我不能用APD了。

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


附加数据:从phpinfo,我得到这个:

"。/配置"——prefix =/usr/地方/lsws/lsphp5 '"——构建= x86_64-redhat-linux-gnu '",主机= x86_64-redhat-linux-gnu '"——目标= x86_64-redhat-linux-gnu"——sysconfdir =/etc"——datadir =/usr/分享"——includedir =/usr/包括"——libdir =/usr/lib64 ' '——libexecdir =/usr/libexec '"——localstatedir =/var ' '——sharedstatedir =/usr/com '"——寺庙=/usr/share/man ' '——infodir =/usr/share/信息"——缓存文件= . ./配置。缓存"——with-libdir = lib64 '"——with-config-file-path =/etc"——with-config-file-scan-dir =/etc/php。dd ' '——disable-debug '"——with-pic ' '——disable-rpath ' '——without-pear ' '——with-bz2 '——使用curl的"——with-exec-dir =/usr/bin ' '——with-freetype-dir =/usr '"——with-png-dir =/usr ' '——without-gdbm ' '——with-gettext——gmp的"——with-iconv’"——with-jpeg-dir =/usr ' '——使用openssl"——with-libexpat-dir =/usr/lib64 ' '——with-pcre-regex =/usr '"——with-zlib ' '——with-layout = GNU ' '——enable-exif ' '——enable-ftp '’——enable-sockets’’——enable- systemsem’"——enable-sysvshm"——enable-sysvmsg"——enable-wddx"——使用kerberos ' '——enable-ucd-snmp-hack '——with-unixODBC=shared,/usr' '——enable-shmop' '——enable-calendar'"——with-libxml-dir =/usr '——使用mysql的"——with-mysqli"——与gd的’——enable-dom’——disable-dba’——without-unixODBC’'——enable-xmlreader' '——enable-xmlwriter' '——with-mcrypt''——enable-mbstring' '——with- litesspeed ' '——enable-soap' '——with-xsl'"——with-pdo-mysql"——with-pdo-sqlite"——enable-sqlite-utf8"——with-pspell’"——with-sqlite =共享"——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"

显然是PHP的问题,因为Apache提供静态文件没有问题。你试过从PECL安装APD吗?

使用像APD这样的PHP分析器将显示瓶颈是否在PHP中,如果是,它在哪里。例如,您正在使用的框架速度慢吗?或者只是一个恶意的扩展?

摘自官方手册:

使用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配置问题(可能是恶意或错误配置的扩展)。但我猜是框架里的东西。

您写在发生此问题时,您有几个客户端每3秒执行一次AJAX请求。这可能导致服务器上可用的所有PHP工作线程都被这些AJAX请求阻塞。你的web服务器接收到你对/foobar.php的请求,然后必须等待PHP worker空闲来处理你的请求。

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

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

一般情况下,您需要提供商的帮助来解决这个问题。你没有写你的提供商使用哪种方法来服务PHP,例如fpm有一个叫做process.max的设置,可以限制你的web服务器并行处理这么多PHP文件的能力。

没有供应商的合作,您就没有机会找出问题所在。

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

另一个有趣的地方是你的提供者使用:http://www.litespeedtech.com/php-litespeed-sapi.html从没听说过。

如果您的提供者不同意mjk的建议,您应该简单地更改您的提供者。看起来他们并没有控制住自己。

如果相同的空PHP文件在移动到另一个站点时立即加载,则不可能是由于任何框架或包含的文件,因为那时没有加载。

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

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

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