PHP 速度比应有的慢

PHP 速度比应有的慢

我有一台双 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 的东西。)

相关内容