extension,zend_extension和zend_extension_ts

extension是php扩展

zend_extension为zend engine扩展

zend engine是php脚本解释引擎,zend engine 2(ZE2)与php 5同时发布,php 5开始使用ZE2作为脚本解释引擎;php 6目前还处于开发阶段,但已经引入zend engine 3(ZE3)。

所以,php有2种扩展,一个基于zend engine引擎的,一个是php自身的。才会出现有些扩展使用extension,有些使用zend_extension来引用。

与zend_extension相关的,还有以下指令:

  • zend_extension
    (non ZTS, non debug build)
  • zend_extension_ts
    ( ZTS, non debug build)
  • zend_extension_debug
    (non ZTS, debug build)
  • zend_extension_debug_ts
    ( ZTS, debug build)

ZTS全称为:ZEND Thread Safety(线程安全)

查看你的php是否为线程安全,可以检查phpinfo()中的Thread Safety的值,enable为线程安全,disable为非线程安全。

PHP5.4中while和for的性能对比

测试代码:

<?php

require 'Benchmark/Iterate.php';

$benchmark = new Benchmark_Iterate();


function fun_while() {
    $i = 0;
    while($i<=10000) {
        $i++;
    }
}

function fun_for() {
    for($i=0; $i<=10000;$i++) {}
}

$benchmark->run(50, 'fun_while');

print_r($result = $benchmark->get());

$benchmark->run(50, 'fun_for');

print_r($result = $benchmark->get());

结果:

while执行时间:0.00026299476623535

for执行时间:0.00044032096862793

PHP 5.4简单性能测试

测试PHP版本分别为:PHP 5.3.10和 PHP 5.4.3,PHP 5.3使用apt-get安装,PHP 5.4使用编译安装,测试页面代码,只有一行phpinfo(); php设置均为默认,没有调整。

测试环境:

  • 操作系统:ubuntu 12.04
  • CPU:Pentium(R) Dual-Core CPU E6600 @ 3.06GHz × 2
  • 内存:4GB
  • HTTP服务器:Apache 2.2
  • 测试工具:ab (ab -n 1000 -c 100 url)

测试数据:

PHP 5.3 PHP 5.4
Time taken for tests 0.939 seconds 0.577 seconds
Complete requests 1000 1000
Failed requests 0 105(Length: 105)
Requests per second 1065.53 [#/sec] (mean) 1733.73 [#/sec] (mean)
Time per request 93.850 [ms] (mean) 57.679 [ms] (mean)

从数据中可以看到5.4比5.3确实快了不少,有60-70%左右的提高,但是不知道怎么会有105个失败,ab显示的失败信息如下:

Failed requests:        105
(Connect: 0, Receive: 0, Length: 105, Exceptions: 0)

不知道这个Length什么意思?

ps:关于Failed requests的Length

只要出現 Failed requests 就會多出現一行要求失敗的各原因的數據統計,分別有 Connect, Length, 與 Exception 三種,分別代表的意義為:

  • Connect 無法送出要求、目標主機連接失敗、要求的過程中連線被中斷
  • Length 回應的內容長度不一致 ( 以 Content-Length 標頭值為判斷依據 )
  • Exception 發生無法預期的錯誤

而從上述說明就可以很明顯看出所有的 Failed requests 都落在 Length 這個類別上,原來這是因為受測網站的首頁是動態的內容,當第一次發出 HTTP request 與後續發出的 HTTP request 所得到回應的 HTML 長度都是不同大小的 ( 每次回應的 Content-Length 大小不一致 ),才會引發 Failed requests 的 Length 問題的失敗,因此這類 Length 不一致的失敗在進行「動態網頁」壓力測試時是合理的,可以不予理會。

這裡的 Length 是以 “第 1 次” 取得的 Content-Length 為主,如果第 2 次以後的 HTTP Request 所得到的 HTTP Response Header 得到的 Content-Length 與第 1 次取得的長度不一致,就會得到 Length 的錯誤。

PHP5.4向下不兼容的改变

升级到PHP5.4,虽然大多数现有的PHP 5中的代码应该不会改变,请注意一些向后不兼容的变化:

  • 不再支持安全模式。任何依赖安全模式的应用程序都需要在安全方面进行调整。

  • 魔术引号被删除。依赖此功能的应用程序需要更新,以避免安全问题。get_magic_quotes_gpc()和get_magic_quotes_runtime()始终返回false。set_magic_quotes_runtime()会抛出E_CORE_ERROR错误。

  • 从php.ini中删除register_globals和register_long_arrays参数。

  • Call-time pass by reference has been removed.

  • break和continue不再支持可边的参数(例如break 1 + foo() * $bar;)。静态参数仍然被支持,如break 2;

  • date和time扩展中,不再支持TZ环境变量设置,你必须指定一个时区,在php.ini中设置date.timezone或者使用date_default_timezone_set()方法。如果timezone没有设置,PHP将不再尝试猜测当前时区,默认使用UTC,同时引发一个E_WARNING。

  • 非数字的字符串偏移量,例如$a['foo'] $a是一个字符串,isset()返回false,empty返回true,如果使用他们将会产生一个E_WARNING。bool和null类型的偏移量会产生一个E_NOTICE。数字字符串(例如$a['2'])仍将工作。请注意,’12.3′和’5 foobar’偏移量视为非数字,会产生一个E_WARNING,但经过转换后得到12和5仍将向后兼容。注意,下面的代码返回不同的结果,$str=’abc’; vardump(isset($str['x'])); //php5.4(包含5.4)以后的版本得到false,5.3(包含5.3)之前的版本得到true

  • 数组转换为字符串,将产生一个E_NOTICE错误,但返回的结果仍然是一个字符串”Array”。

  • NULL,FALSE或者一个空字符串添加一个对象属性,将会产生一个E_WARNING错误,而不是E_STRICT。

  • 参数名称使用全局的变量会得到致命的错误。禁止这样的函数foo($_GET,$_POST){}

  • Salsa10和Salsa20哈希算法已被删除。

  • array_combine()函数的2个参数为空数组的时候将会返回一个array()代替FALSE。原本如果array_combine()的2个参数为空数组或者单元数不同时会返回FALSE。

  • 若果你使用htmlentities()参数为亚洲字符串,他的工作类似于htmlspecialchars(),这是以前PHP版本的处理情况,但是现在将会引发一个E_STRICT错误。

以下关键字作为保留关键字,不得用于函数、类的名字

  • trait
  • callable
  • insteadof

下面的方法从PHP中删除:

  • define_syslog_variables()
  • import_request_variables()
  • session_is_registered(), session_register() and session_unregister().
  • The aliases mysqli_bind_param(), mysqli_bind_result(), mysqli_client_encoding(), mysqli_fetch(), mysqli_param_count(), mysqli_get_metadata(), mysqli_send_long_data(), mysqli::client_encoding() and mysqli_stmt::stmt().

PHP 5.4.3和PHP 5.3.13发布

2012年5月8日PHP开发团队宣布提供可用的PHP5.4.3和PHP5.3.13。推荐所有的用户都升级到PHP5.4.3或PHP5.3.13

此版本修复了基于CGI-based(CVE-2012-2311)的漏洞。注:mod_php和php-fpm不受影响。

PHP5.4.3修复apache_request_headers()(CVE-2012-2329)的缓冲区溢出漏洞。 PHP5.3系列不受影响。

Yii Framework的性能

Yii是一个高性能的框架,下面图表显示Yii Framework和其它流行PHP框架的性能比较。在图表中,RPS表示“每秒请求数”,他描述使用不同的PHP框架写的一个应用程序的每秒处理请求数。数字越高表示框架越高效,性能越好。正如我们看到的,Yii Framework比其它框架比较性能要好。Yii性能要好于其它框架的一个重要因素是APC扩展。

性能本身并不全部(否则我们可以使用HTMLH或者PHP)。在优秀性能基础上,Yii同时提供了很多的功能、特性来提高我们的开发效率。

Yii为什么如此快

Yii如此快的一个重要原因是他使用了延时加载技术性。例如:他不包涵一个类文件,直接该类文件被首次使用时候才被包涵;他不创建一个对象直到这个对象首次必访问时候他才会必创建。其它框架慢的一个原因就是被包涵的功能过多(比如数据库连接,用户session),而每次请求中都用不到这些功能。

基准测试设置

下面我们解释我们是如何设计基准应用程序并获得RPS的数据

基准测试应用程序

由于我们的目标是测试每个框架最小的开销(minimal overhead),我们使用每个框架最简单的基准测试程序,我们使用每一个框架编写一个只输出“Hello Word”字符串的代码。禁止其它任何的功能(比如session)来确保我们的比较公平。该基准测试程序地址:phpmark project

为什么是“Hello Word”

我们选择使用“Hello Word”程序来达到我们的测试目标,即实现每个框架的最小开销(mininal overhead)。许多人抱怨“Hello Word”程序是没有意义的,因为现实世界的应用程序,往往需要更复杂的任务。这看起来不是那么真实,在现实中,尤其是一些Web 2.0应用程序,我们经常遇到和“Hello Word”非常接近的情况。例如:一个应用程序需要从AJAX请求中获取当前服务器的时间;一个页面的大部份内容必缓存,程序只需要从缓存中获取内容并显示即可。

另一个使用“Hello Word”的原因是,涉及更多的特性(比如数据库查询)是,他成为一个非常艰巨的任务。比如某个框架在执行数据库查询时非常有效,但他没有缓存功能,而另一个框架数据库查询有些慢,当他有先进的缓存功能。有太多的因素会影响性能测试的结果。

基准测试工作和环境

我们使用ApacheBench工具的”ab -t 30 -c 10 URL”命令来获得RPS数字。在获得每个框架的RPS数据之前,我们需要停止再开启Apache Web服务以避免干扰。我们也会先执行测试程序几次完成热身(warm up)。在phpmark project中,我们有一个benchmark.sh的shell脚本来完成自动化测试。

测试环境:

  • 操作系统:Red Hat Enterprise Linux Server release 5.2
  • Web服务器:Apache httpd 2.0.40
  • PHP:5.2.6, any non-essential extensions are disabled
  • CPU:Dual Intel Xeon 3.2GHz
  • 内存:2GB
  • 硬盘:73GB 15K RPM SCSI/SAS HDD

APC配置:

apc.enabled=1
apc.shm_segments=1
apc.optimization=0
apc.shm_size=32
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.cache_by_default=1
apc.stat=0

Yii Framework框架

快速、安全、专业的PHP框架

Yii是一个高性能的PHP框架,非常适合开发Web 2.0应用程序。

Yii自带丰富的功能,包括:MVC(三层架构模式), DAO/ActiveRecord(面向对象的数据访问对象接口), I18N/L10N(国际化与本地化), caching(缓存), authentication(身份验证)和role-base access control(基于角色的访问控制), scaffolding(脚手架), testing(测试)等等,他可以加快您的开发速度。

Yii Framework官方网站:http://www.yiiframework.com/

Yii Framework权威指南:http://www.yiiframework.com/doc/guide/

Yii Framework中文权威指南:http://www.yiiframework.com/doc/guide/1.1/zh_cn/index