• PHP 扩展开发之Zephir


    最近对代码进行性能分析后,发现两个耗时的地方:自动加载文件数太多;参数验证函数调用超过1000次。这也是许多php语言框架面临的问题,所以发展出来诸如YafSwoolePhalcon这些C语言扩展框架,或者类似workermanreactphpphpdaemon这些一次加载的框架。总之减少加载文件,使用内置函数,减少损耗,以提升性能。
    相比之下,PHP扩展的框架性能还是要比PHP语言框架还要好不少。以往PHP扩展的开发方式就是C/C++SWIG,现在还多了一个选择:zephir,从Phalcon发展出来的项目,采用类似PHP语法的中间语言,将代码编译为高性能的C扩展。zephir支持面向对象编程,变量类型除了类似PHP的动态类型,还支持静态类型(有点像FackBook的hack了),而且可以调用php内置或其他C扩展的函数。zephir编译流程如下
    scheme
    整个过程是zephir和底层编译器自动进行编译优化的,当然也可以自己调整以获得更好的性能。
    在ubuntu下的安装如官方教程即可,在centos下的安装如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    su -c 'yum update'
    sudo yum install -y wget
    sudo yum install -y vim
    sudo yum install -y libtool
    sudo yum install -y gcc
    sudo yum install -y make
    sudo yum install -y re2c
     
    sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
    sudo yum install -y php55w
    sudo yum install -y php55w-devel
    sudo yum install -y php55w-json
     
    sudo yum install -y git-core
     
    git clone https://github.com/json-c/json-c.git
    cd json-c
    ./autogen.sh
    ./configure
    make
    make install
     
    git clone https://github.com/phalcon/zephir
    cd zephir
    ./install -c
    zephir help

    安装完成如下:
    zephir10
    按照教程创建示例:

    1
    2
    3
    zephir init utils
    cd utils
    sudo vim utils/greeting.zep

    greeting.zep代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    namespace Utils;
     
    class Greeting
    {
     
        public static function say()
        {
            echo "hello world!";
        }
     
    }

    编译安装

    1
    $ zephir build

    注意,我在php5.3下面这么编译都不行,在php5.5/php5.4的版本基本没有碰到什么问题。
    然后更改php.ini:

    1
    sudo vim /etc/php.ini

    在php.ini中加上以下内容

    1
    2
    3
    4
    5
    6
    7
    ;zephir编译的扩展需要依赖json.so,需要提前加载
    [json]
    ;如果php.ini中没有则加上,有则去掉;
    extension=json.so
     
    [utils]
    extension=utils.so

    查看php可用扩展

    1
    php -i

    注意:如果提示’undefined symbol: php_json_decode_ex in Unknown on line 0’,则是php json扩展未加载,在php.ini打开就行了。加载了json.so后又提示’PHP Warning: Module ‘json’ already loaded’,则是已经在其他地方加载了该扩展,找出并注释掉。我的是在php.d下面的json.ini里面:

    1
    sudo vim /etc/php.d/json.ini
    1
    2
    3
    [json]
    ;已经在php.ini中加载了,为避免重复加载注释掉
    ;extension = json

    加载成功后的效果:
    zephir3
    创建一个php脚本来试一下

    1
    2
    cd ~/utils
    sudo vim greeting.php

    greeting.php代码如下:

    1
    2
    3
    <?php
     
    echo UtilsGreeting::say(), " ";

    保存并运行:
    zephir11
    zephir5
    zephir6
    至此你的zephir编译的扩展已经成功了,赶紧翻译你的PHP代码去吧。
    参考这篇教程,计算斐波拉契数列在我的环境下是这样的:
    zephir13
    性能提升还是挺明显的,而且在静态类型(强类型)下面还能比动态类型再提升。

  • 相关阅读:
    第一次作业
    C语言I博客作业04
    C语言I博客作业05
    c语言l博客作业02
    C语言I博客作业06
    linux下递归删除目录下所有exe文件
    CSS高级
    CSS样式
    CSS框模型
    Oracle的用户、角色和权限
  • 原文地址:https://www.cnblogs.com/cnsanshao/p/8857948.html
Copyright © 2020-2023  润新知