18

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

文件名为“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/>

foob​​ar.txt的加载时间约为 0.2 秒。

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

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

MaxClients 300
MaxRequestsPerChild 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.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' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir =/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '- -cache-file=../config.cache''--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' '--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' '--启用域''--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'--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'--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'--enable-inline-optimization''--enable-gd-native-ttf'''--enable-bcmath'--enable-inline-optimization''--enable-gd-native-ttf'''--enable-bcmath'

4

4 回答 4

7

似乎很明显是一个 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 配置问题(可能是恶意扩展或配置错误的扩展)。但我猜这是框架中的东西。

于 2012-12-26T01:31:07.177 回答
4

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

因此,针对您的问题的可能解决方案包括(如果您没有更具体地说明 AJAX 的用途,我需要保持一般性):

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

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

于 2012-12-30T14:22:04.073 回答
3

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

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

另一个有趣的点是您的提供商使用: http ://www.litespeedtech.com/php-litespeed-sapi.html 从来没有听说过这种情况。

如果您的提供商愿意接受 mjk 的建议,您只需更换您的提供商。接缝似乎是他们没有控制住他们。

于 2012-12-29T13:37:23.277 回答
2

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

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

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

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

于 2012-12-29T12:17:47.143 回答