我有一台双 Xeon 四核 L5420 处理器的服务器,运行速度为 2.5GHz。我一直在优化我的服务器,现在遇到了最后一个瓶颈:PHP。
我的非常简单的 PHP 脚本:
./测试.php
<?php print_r(posix_getpwuid(posix_getuid()));
我的不太科学,因为他们不关注线程锁定,但足够科学,可以给我一个合理的每秒多线程请求结果脚本:
./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
./真正-基准-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 个请求。
在由 sqlite 或 mysql 支持的 Drupal 实例上运行相同的脚本将返回 ~1.5 req/s。
我已安装 APC 和 mem_cache,并已验证它们在默认状态下运行。(是的,APC 的 enable_cli 也已启用。)有人知道神奇的“使 PHP 执行速度更快”开关吗?
我有一个备用配置设置(FPM/FastCGI),可以为 MySQL Drupal 安装提供每秒约 140 个请求...如果 PHP 本身甚至无法从命令行提供每秒 2 个请求,那怎么可能呢?
ab
我觉得这个工具的效果同样很差:
静态页面:ab -n 1000 -c 100 http://x.x.x.x/
每秒请求数:683.71
测试 php:ab -n 100 -c 5 http://x.x.x.x/
每秒请求数:41.38
drupal-mysql:ab -n 100 -c 10 http://x.x.x.x/drupal/
每秒请求数:0.24
drupal-sqlite:ab -n 100 -c 10 http://x.x.x.x/drupal-test/
每秒请求数:4.92
答案1
如果您从命令行启动 PHP,每次运行都需要加载整个 PHP 解释器、所有必需的库、文件等。这会产生巨大的开销。
如果您的 Web 服务器配置为执行相同的操作,那么神奇的“使 PHP 更快的切换”可能就是切换到使用mod_php
、FastCGI 或类似的东西,这允许单个 PHP 解释器处理多个请求。(请注意,每个解释器只能同时处理一个请求;启动多个 PHP 解释器的责任在于您的 Web 服务器或mod_php
启动 FastCGI 的东西。)