关注PHP的性能

关注PHP的性能,php,performance,unix,Php,Performance,Unix,我一直在Unix命令行中运行一些测试PHP脚本(使用PHP命令),我注意到它们的运行速度非常慢。平均每12行左右的代码运行一个脚本大约需要半秒钟。这是非常令人担忧的。我的意思是,我知道PHP是一种解释性语言,它显然会比C之类的东西运行得慢,但我没想到它会这么慢。想象一下,如果我有一个几百行长的脚本,它将运行得有多慢。或者如果我必须通过TCP连接发送该脚本的输出 我想了解为什么PHP在Unix命令行中运行得如此缓慢。这是Unixphp命令特有的吗?如果由Apache这样的web服务器进行解释,它会

我一直在Unix命令行中运行一些测试PHP脚本(使用
PHP
命令),我注意到它们的运行速度非常慢。平均每12行左右的代码运行一个脚本大约需要半秒钟。这是非常令人担忧的。我的意思是,我知道PHP是一种解释性语言,它显然会比C之类的东西运行得慢,但我没想到它会这么慢。想象一下,如果我有一个几百行长的脚本,它将运行得有多慢。或者如果我必须通过TCP连接发送该脚本的输出

我想了解为什么PHP在Unix命令行中运行得如此缓慢。这是Unix
php
命令特有的吗?如果由Apache这样的web服务器进行解释,它会运行得更快吗?如果是,为什么?我不明白为什么PHP的性能会有如此大的滞后,至少在Unix实现中是如此

编辑: 好的,下面是一些运行缓慢的代码示例:

<?php
$counter = 0;
function update_counter(){
    global $counter;
    $counter++;
}
update_counter();
echo "\$counter = $counter\n";
function update_local(){
    $local_num = 0;
    $local_num++;
    echo "\$local_num = $local_num\n";
}
function update_static(){
    static $static_num = 0;
    $static_num++;
    echo "\$static_num = $static_num\n";
}
update_local();
update_local();
update_static();
update_static();
?>

我知道这段代码可能会比较慢,因为它会进行几个函数调用,但我已经用Javascript编写了这样的代码,Javascript也是一种解释语言,没有任何性能延迟。我认为问题不在于代码的质量。我应该能够在脚本中使用函数,而不会受到性能方面的影响

编辑:运行此代码大约需要半秒钟:

<?php
$x = 2;
$y = 5;
if( $x + $y < 5 )
    echo "less than 5\n";
elseif( $x + $y > 5 )
    echo "greater than 5\n";
else
    echo "equal to 5\n";
?>

运行代码很可能不需要半秒钟。生成PHP进程并编译代码需要花费大部分时间。你是怎么计时的?你打算用PHP做什么

第一次在命令行PHP上运行脚本时,将:

  • 产生一个进程
  • 从磁盘读取代码
  • 将PHP代码编译为操作码
  • 运行代码
生成PHP进程的时间是恒定的,不会随着脚本的延长而增加。当您运行Web服务器时,您可以在FastCGI中运行PHP,并将来自Web服务器的请求传递给例如PHP-FPM。在这种情况下,PHP已经在运行,您不必等待PHP进程启动

此外,第一次运行脚本时(在创建或更改脚本后),PHP会将代码编译为操作码。这些操作码被缓存。因此,当您第二次运行脚本时,它将运行得更快

最后,PHP速度很慢,但每次发布都会越来越快。新版本确实带来了巨大的性能改进,但您也会注意到性能改进

还要注意,5.5版之前的PHP默认情况下没有启用Opcache

您可以使用以下命令检查PHP版本:
$PHP-v
。您可以使用以下命令检查是否正在运行opcache:
php-r'phpinfo();'|grep opcache
(还要检查opcache.enable_cli的值)

在PHP版本5.5之前,您必须安装。您可以使用
php-r'phpinfo();'检查安装情况grep apc

让你更加放心;我正在使用PHP5.5.9运行一个PHP脚本,它每秒能够从消息队列接收和处理大约一千条复杂的json消息。这些消息在几毫秒内被解码、转换、重新编码并存储在NoSQL数据库中。PHP不是高度优化的C语言,但除非您正在执行资源密集型任务,否则您不必担心速度。只是:

  • 使用最新的PHP版本
  • 确保您正在使用操作码缓存

取决于您正在运行的代码编写得有多糟糕,或者它在做什么。。。。脚本的长度并不能影响执行速度,但PHP不是一种“解释语言”。。。。。它被编译成字节码的方式与JavaFirst的运行方式完全相同,第一个示例需要
0.0005秒
;第二个示例需要运行
0.0001秒
(在我的服务器上计时),并四舍五入到4位小数,即Apache不解释任何内容。。。。。无论是通过Apache SAPI还是CLI运行,其核心都是相同的引擎。。。。。如果您只需说“Odd”,那么服务器设置似乎有问题。为什么在我的Macbook上运行要花这么长时间?PHP是设计在具有真正快速CPU的服务器上运行的吗?这就是为什么它可以承受像调用函数这样的巨大性能损失的原因吗?好的,我使用的是PHP5.3.13。这也许可以部分解释为什么它这么慢。我还注意到,我的脚本在第二次运行时往往运行得更快,但如果我在两次运行之间等待很长时间(可能字节码在一段时间后被删除),情况就不会如此了。