服务器上PHP脚本执行非常缓慢

5
这个问题与我之前的问题(在这里)有关。
起初我认为这是一个网络问题,但越来越可能是与我的php配置和php文件的运行有关。我进行了以下测试:
我创建了一个名为test.php的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脚本,其运行时间都至少增加了半秒钟。我无法解决这个问题,因此非常感谢任何帮助!
编辑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";

以下是结果:

测试结果如下:

所需测试持续时间为:0.00102400779724秒
执行测试持续时间为:0.61318397522秒

编辑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: 如@voter所建议的那样,在生产服务器(即问题服务器)和我们的开发服务器上运行strace,在这个问题不会发生的开发服务器上。 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

2
/usr/bin/php /testFirstByte/test.php 是 CLI,而不是 Apache。 - brombeer
1
嗯,有什么东西被“自动包含”了吗?http://www.php.net/manual/en/ini.core.php#ini.auto-prepend-file - brombeer
1
我同时安装了5.6和7.1版本的CLI,当运行"你的"脚本时,它们都在0.01秒至0.03秒的范围内。也许你可以尝试并行安装7.1(如果你破坏了生产服务器不要责怪我;))。另外,php -v显示"with Zend OPcache...",也许你的PHP缺少OPcache(不知道是否可能,瞎猜的)。祝好运。 - brombeer
1
你检查过在你的php.ini文件中是否启用了opcache吗?opcache.enable_cli=1 - Diogo Sgrillo
1
@AdamBaranya 如果strace显示一切都变慢了,那么检查服务器的健康状况和工作负载是很好的选择。很难具体说明——有很多可能出现问题的地方。您可以尝试查看“vmstat 1”以查找服务器的CPU利用率(id-空闲时间)、交换和IO负载。或者,如果您正在使用RAID,请查看其状态“cat /proc/mdstat”。 - voter
显示剩余18条评论
3个回答

5
你的 php -v 输出看起来像是在命令行中调用了 php cgi。
对于命令行,通常会有一个单独安装的 CLI 版本的 php,例如 apt-get install php5-cli
这可能会对性能产生相当大的影响。在一个中型 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模块并且未正确配置它。


我使用cli版本和非cli版本几乎得到了相同的结果。cli版本比非cli版本慢了约0.05秒。使用time php-cli simple_test.php测试时间如下:test real 0m0.652s user 0m0.529s sys 0m0.122s - Adam Baranyai
1
也许有一个新的想法:您是否已经尝试禁用一些扩展程序,以查看它们中的一个是否导致了问题? 如果您在谷歌上搜索,您会发现一些人遇到了某些扩展程序因某些原因减慢PHP速度的问题,例如这里的imap扩展 https://github.com/liip/build-entropy-php/issues/11 或者这里的curl扩展 https://dev59.com/yEzSa4cB1Zd3GeqPp9SM - Pampy
1
再多搜索一下,也许你需要根据这里的条目在/etc/hosts中添加你的主机名: https://laracasts.com/discuss/channels/general-discussion/php-from-the-terminal-running-very-slow-on-new-mac?page=1 - Pampy
还没有尝试过这些,稍后会尝试一下,并汇报结果,谢谢。 - Adam Baranyai
感谢您的帮助,问题出在其中一个扩展上。 - Adam Baranyai

4
最终发现导致问题的原因是其中一个扩展,即browsecap扩展,或者更可能是缺少该扩展。
在某个时候,它被安装了,但当我们意识到由于各种原因我们不会使用它时,我们卸载了它,但它没有从php.ini文件中删除。通过从ini文件中删除与browsecap相关的单行内容,问题完全解决了。
我要感谢@Pampy为我指明正确的方向,关于扩展。如果将来有人遇到类似的问题,可以通过使用-n参数从命令行运行php来调试问题,这实际上会同时禁用它的ini和所有已加载的扩展。

0

对我来说,这个工作得很好。

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

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


2
无论如何,在我看来,测试bash echo并将其与运行解释的php脚本进行比较是没有可比性的。 - Paun Narcis Iulian
1
看起来你们完全没有抓住重点。我与exec和require无关,那些只是我为原问题的评论者进行的简单测试。问题是,每次运行PHP脚本都会有0.5秒的开销,即使脚本什么也不做。这就是我的问题,也是我正在寻找解决方案的问题。 - Adam Baranyai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接