加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP比它应该慢

发布时间:2020-12-13 13:54:13 所属栏目:PHP教程 来源:网络整理
导读:我有一台服务器,双Xeon四核L5420运行在2.5GHz.我一直在优化我的服务器,并且已经到了我最后的瓶颈: PHP. 我非常简单的PHP脚本: ./test.php ?php print_r(posix_getpwuid(posix_getuid())); 我不那么科学 – 因为他们不注意线程锁定但科学足够给我一个合理的
我有一台服务器,双Xeon四核L5420运行在2.5GHz.我一直在优化我的服务器,并且已经到了我最后的瓶颈: PHP.

我非常简单的PHP脚本:

./test.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

./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个请求.

在supite或mysql驱动的Drupal实例上运行相同的脚本会返回~1.5 req / s.

我安装了APC和mem_cache,并且我已经验证它们是在默认情况下运行的. (是的,APC的enable_cli也开启了.)有人知道魔术“让PHP执行更快”的开关吗?

我有一个替代的配置设置(FPM / FastCGI),可以为140 Drqal安装提供~140 req / s …如果PHP本身甚至无法从命令行提供2个req / s,那怎么可能呢?

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

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

如果您的Web服务器配置为执行相同的操作,那么神奇的“使PHP更快的切换”可能会切换到使用mod_php,FastCGI或类似的东西,这使得单个PHP解释器可以提供多个请求. (请注意,每个解释器只能同时提供一个请求;启动多个PHP解释器的责任在于您的web服务器,用于mod_php或启动FastCGI的任何事情.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读