zoukankan      html  css  js  c++  java
  • 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
    性能提升还是挺明显的,而且在静态类型(强类型)下面还能比动态类型再提升。

  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/cnsanshao/p/8857948.html
Copyright © 2011-2022 走看看