PHP比它应该慢

我有一个运行在2.5GHz双核至强四核L5420的服务器。 我一直在优化我的服务器,并已经到了我的最后瓶颈:PHP

我非常简单的PHP脚本:

./test.php

<?php print_r(posix_getpwuid(posix_getuid())); 

我不那么科学,因为他们不会注意线程locking,但是不够科学的给我一个合理的multithreading请求每秒的结果脚本:

./benchmark-php

 #!/bin/bash if [ -z $1 ]; then LIMIT=10 else LIMIT=$1 fi if [ -z $2 ]; then SCRIPT="index.php" else SCRIPT=$2 fi START=$(date +%s.%N) COUNT=0 while (( $COUNT < $LIMIT )) do php $SCRIPT > /dev/null COUNT=$(echo "$COUNT + 1" | bc) done END=$(date +%s.%N) DIFF=$(echo "$END - $START" | bc) REQS_PER_SEC=$(echo "scale=2; $COUNT / $DIFF" | bc) echo $REQS_PER_SEC 

./really-benchmark-php

 #!/bin/bash if [ -z $1 ]; then LIMIT=10 else LIMIT=$1 fi if [ -z $2 ]; then THREADS=16 else THREADS=$2 fi if [ -z $3 ]; then SCRIPT="index.php" else SCRIPT=$3 fi PIDS="" echo '' > results for thread in `seq 1 $THREADS`; do ./benchmark-php $LIMIT $SCRIPT >> results & PIDS="$PIDS $!" done for PID in $PIDS; do wait $PID done RESULTS=`cat results` MATH="0" for RESULT in $RESULTS; do MATH="$MATH + $RESULT" done echo "$MATH" | bc 

运行./really-benchmark-php 100 8 test.php的结果是每秒约137个请求。

在Drupal的sqlite或mysql驱动的实例上运行相同的脚本返回〜1.5 req / s。

我已经安装了APC和mem_cache,并且已经validation它们正在默认运行。 (是的,APC的enable_cli也打开了。)有人知道“让PHP更快地执行”这个奇妙的开关吗?

我有一个替代的configuration设置(FPM / FastCGI),服务于MySQL Drupal安装〜140 req / s …如果PHP本身甚至不能从命令行服务2 req / s,这怎么可能?

ab工具的结果对我来说同样重要:

静态页面: ab -n 1000 -c 100 http://xxxx/每秒请求数:683.71

testingphp: ab -n 100 -c 5 http://xxxx/每秒请求数:41.38

drupal-mysql: ab -n 100 -c 10 http://xxxx/drupal/每秒请求数:0.24

drupal-sqlite: ab -n 100 -c 10 http://xxxx/drupal-test/每秒请求数:4.92

如果您从命令行启动PHP,则每次运行都需要加载整个PHP解释器,所有必需的库,文件等,这有很大的开销。

如果您的Web服务器configuration为执行相同的操作,那么“使PHP更快地切换”的魔术可能会转换为使用mod_php ,FastCGI或类似的东西,这使得单个PHP解释器可以处理多个请求。 (请注意,每个解释器只能同时提供一个请求;启动多个PHP解释器的责任在于你的web服务器的mod_php或任何启动你的FastCGI的东西。)