服务器上 php 脚本的执行速度非常慢

Very slow execution of php scripts on the server

这个问题与我的另一个问题有关,found here

起初我认为这是一个网络问题,但似乎越来越有可能,这与我的 php 配置有关,并且 运行ning php 文件。我做了以下测试用例:

我创建了一个 php 文件,将其命名为 test.php,内容如下:

 <?php
 echo 'test';
 ?>

并创建了两个 bash 文件,内容如下:

//bash1.sh
#!/bin/bash
/usr/bin/php /testFirstByte/test.php

另一个用

//bash2.sh
#!/bin/bash
echo Test;

然后我开始为他们的 运行、运行 计时,并在其之前使用 'time' 命令,即:time php test.php

结果如下:

 // time php test.php
 test
 real    0m0.548s
 user    0m0.445s
 sys     0m0.101s

 // time sh bash2.hs
 Test
 real    0m0.002s
 user    0m0.002s
 sys     0m0.000s

 // time sh bash1.hs
 X-Powered-By: PHP/5.5.30
 Content-type: text/html; charset=utf-8
 test
 real    0m0.539s
 user    0m0.429s
 sys     0m0.108s

对我来说,每当我尝试 运行 一个 PHP 脚本时,运行时间都会增加至少半秒,无论哪个 php 脚本我尝试 运行。我不知道如何解决这个问题,所以任何帮助将不胜感激!

编辑 1: 我制作了一个简单的脚本,我希望这就是内部测试 @Eineki 的意思。脚本如下:

$timer = microtime(true);
require('test_simple.php');
$end = microtime(true) - $timer;
echo "Require test duration was: " . $end . " seconds\n";

$timer = microtime(true);
exec('php test_simple.php');
$end = microtime(true) - $timer;
echo "Exec test duration was: " . $end . " seconds\n";

结果如下:

Require test duration was: 0.00102400779724 seconds
Exec test duration was: 0.61318397522 seconds

EDIT 2:加载的扩展列表如下:

Array
(
    [0] => Core
    [1] => date
    [2] => ereg
    [3] => libxml
    [4] => openssl
    [5] => pcre
    [6] => sqlite3
    [7] => zlib
    [8] => bcmath
    [9] => bz2
    [10] => calendar
    [11] => ctype
    [12] => curl
    [13] => dom
    [14] => hash
    [15] => fileinfo
    [16] => filter
    [17] => ftp
    [18] => gd
    [19] => gettext
    [20] => SPL
    [21] => iconv
    [22] => session
    [23] => json
    [24] => mbstring
    [25] => mcrypt
    [26] => standard
    [27] => mysql
    [28] => mysqli
    [29] => mysqlnd
    [30] => Phar
    [31] => posix
    [32] => Reflection
    [33] => imap
    [34] => SimpleXML
    [35] => sockets
    [36] => exif
    [37] => tokenizer
    [38] => xml
    [39] => xmlreader
    [40] => xmlwriter
    [41] => zip
    [42] => cgi-fcgi
    [43] => PDO
    [44] => pdo_sqlite
    [45] => pdo_mysql
    [46] => mailparse
    [47] => Zend OPcache
)

这是我的 php 版本,截至 php -v:

PHP 5.5.30 (cgi-fcgi) (built: Dec  3 2015 06:55:27)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend    Technologies

编辑 3: 运行 一个 strace 正如 @voter 在 php 文件上所建议的,两者都在生产服务器上(有问题的服务器),而在我们的开发服务器上,则不会发生此问题。 strace 输出的所有内容在生产服务器上基本上是开发服务器上的 10 倍。或许熟悉strace的人可以由此得出结论?

编辑 4:

vmstat 1命令中提取:

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  0 3163644 5410932 2522564 13417292    0    1    22    62    1    0 18  6 75  1  0   
 2  0 3163644 5845884 2522568 13406468    0    0     0   916 31787 5966  9  6 85  0  0  
 8  0 3163644 5439468 2522572 13406840    0    0     8   432 50513 5322 12  6 82  0  0  
 4  0 3163644 5750124 2522572 13407624    0    0     4   232 54417 5615  8  7 86  0  0  
 4  0 3163644 5748608 2522576 13407480    0    0     4   760 118206 5736  7  9 83  0  0 
 3  0 3163644 5742648 2522576 13418040    0    0     0   244 68462 6689 10  7 83  0  0  
 4  0 3163644 5671104 2522576 13407620    0    0    40   568 34157 4222  7  5 87  0  0  
 4  0 3163644 5980828 2522580 13401712    0    0    16   524 43754 6391 17  6 77  0  0  
 5  0 3163644 5506988 2522592 13418868    0    0   264   280 59452 5955 16  7 77  0  0  
 5  0 3163644 5577116 2522600 13417800    0    0    32   540 68056 8968 11  6 83  0  0  
 7  0 3163644 4747580 2522612 13451468    0    0    16   376 241800 7107 12 13 75  0  0 
 4  0 3163644 4948548 2522616 13440832    0    0    12   468 354599 5155  7 16 77  0  0 

编辑 5:

服务器上 top 命令的结果:

top - 09:17:58 up 15 days,  1:53,  8 users,  load average: 6.90, 6.22, 5.34
Tasks: 687 total,   3 running, 683 sleeping,   0 stopped,   1 zombie
Cpu(s): 15.0%us,  3.4%sy,  0.0%ni, 80.7%id,  0.8%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  49390000k total, 43364688k used,  6025312k free,  2697344k buffers
Swap: 16482300k total,  3495772k used, 12986528k free, 11878096k cached

对我来说这很好。

/usr/bin/php -q script.php > /dev/null &

试一试,我想看看你的配置结果。由于它是命令行触发的,我怀疑你不需要输出。您可以将输入作为参数发送。

您的 php -v 输出看起来像是您从命令行调用 php cgi。

对于命令行,通常有php的CLI版本,可以单独安装,例如apt-get install php5-cli.

这会对性能产生相当大的影响。在 medium-sizes linux 服务器上的快速测试给了我

#time php-cgi test.php
X-Powered-By: PHP/5.5.26
Content-type: text/html

test
real    0m0.117s
user    0m0.036s
sys     0m0.076s

# time php test.php
test
real    0m0.074s
user    0m0.040s
sys     0m0.036s

可以看到,cgi版本的时间翻倍了。 您可以尝试使用 CLI 版本,看看差异是否仍然很大?

这可能无法帮助您解决您提到的另一个线程中的问题,除非您也在那里使用 CGI 模块并且没有正确配置它。

终于找到了导致问题的原因:它是扩展之一,即 browsecap 扩展,或者更有可能是缺少它。

在某些时候,它被安装了,但当我们意识到我们不会使用它时,由于各种原因,我们卸载了它,但它并没有从 php.ini 文件中删除。通过从 ini 文件中删除与 browsecap 相关的一行,问题就完全解决了。

我要感谢@Pampy 为我指明了正确的方向,并提供了扩展。如果有人在未来遇到类似的事情,如果问题是类似的,调试的选项是从命令行 运行 php,使用 -n 参数,这实际上禁用了它的 ini , 以及所有已加载的扩展程序。