PHP 扩展开发之Zephir

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

整个过程是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

安装完成如下:

按照教程创建示例:


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

加载成功后的效果:

创建一个php脚本来试一下


1

2

cd ~/utils

sudo vim greeting.php

greeting.php代码如下:


1

2

3

<?php

echo Utils\Greeting::say(), "\n";

保存并运行:



至此你的zephir编译的扩展已经成功了,赶紧翻译你的PHP代码去吧。
参考这篇教程,计算斐波拉契数列在我的环境下是这样的:

性能提升还是挺明显的,而且在静态类型(强类型)下面还能比动态类型再提升。

参考链接:
开源的 PHP 轻量级框架 iphp
自己写PHP扩展之创建一个类
快速开发一个PHP扩展
CentOS 5 or CentOS 6 Upgrade PHP to PHP 5.4 or PHP 5.5
PHP 開發者應該將 Zephir 列為重要觀察的專案
Hack: a new programming language for HHVM
PHP-CPP
Getting Started with PHP Extension Development via Zephir
Quick Tip: Install Zephir and Phalcon 2 on Vagrant

时间: 2024-10-06 16:38:05

PHP 扩展开发之Zephir的相关文章

Chrome扩展开发之Chrome扩展的文件结构

一个Chrome扩展包括一系列文件,HTML文件.CSS样式文件.JavaScript脚本.图片等,以及一个最有特点的manifest.json. 1. manifest.json是啥 它是每个chrome扩展有且只有一个的清单文件,它指明了该扩展的基本信息,如名称.版本.需要的权限等等,格式是json. JSON JSON是一种独立于语言和平台的数据格式,JSON对象就是一种格式化的静态的数据,接下来的chrome扩展中各模块之间交换信息就是用这种格式.传送时就是作为简单的字符串来传,js在收

一次失败的PHP扩展开发之

一次失败的PHP扩展开发之旅 By warezhou 2014.11.19 缘起 经过不断的持续迭代,我们部门的协程版网络框架(CoSvrFrame)终于出炉了!这本来是件喜大普奔的事情,但是随着新业务的不断接入,很多固有缺陷也逐渐浮出水面: 不支持"TCP连接池" 不支持"Dispatcher-Workers模型" 不支持"过载保护" 不支持"热重启" 不支持"64Bit" ... ... 对于资深后台开

PHP7扩展开发之Hello World

一.下载PHP源代码 要开发PHP扩展,需要先下载PHP的源代码,一方面是因为我们的扩展一般会用到PHP自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量. 我下载了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7.0.2.tar.gz. 解压源码压缩包, tar xzf php-7.0.2.tar.gz,我们现在只需要关注Zend和ext这两个目录. Zend目录里面包含了PHP的Zend Engine源代码,有些函数和宏的定义我们需要在这里面

一次失败的PHP扩展开发之旅

一次失败的PHP扩展开发之旅 By warezhou 2014.11.19 缘起 经过不断的持续迭代.我们部门的协程版网络框架(CoSvrFrame)最终出炉了!这本来是件喜大普奔的事情.可是随着新业务的不断接入,非常多固有缺陷也逐渐浮出水面: 不支持"TCP连接池" 不支持"Dispatcher-Workers模型" 不支持"过载保护" 不支持"热重新启动" 不支持"64Bit" ... ... 对于资深

监控开发之用python扩展dstat插件自定义实时监控

dstat是一个python开源的实时监控工具,一般是用来做系统性能监控的.咱们这里只是提他的自定义插件开发,用来打造自己的dstat. 有朋友可能还没清楚是啥意思, 咱们查看系统的状体状态有人喜欢用vmstat,也有人喜欢用dstat.相比来说dstat的功能模块更全一点是,这里还只是说查看系统性能方面的 !   如果想一边查看,系统的各方面性能指标,还想看你应用的一些个负载相关,比如某个程序的负载,mongodb的锁lock百分比,mysql连接数...   懂了吧 ! 下面是dstat的插

ArcEngine开发之Command控件使用篇

转自原文 ArcEngine开发之Command控件使用篇 在ArcEngine类库中有大量的Command控件用来与地图控件进行操作和交互.比如有一系列的地图浏览控件.地图查询控件.图斑选取控件.编辑控件来与MapControl和PageLayoutControl进行交互.这些控件被包含在ESRI.ArcGIS.Controls.dll类库中,位于ESRI.ArcGIS.Controls命名空间下. 这些内置的Command控件可以单独实例化来使用,也可以被安置在一个AxToolbarCont

Android快速开发之appBase——(6).HttpReq和APICloudSDK

Android快速开发之appBase--(6).HttpReq和APICloudSDK HttpReq和APICloudSDK都是网络请求组件,都是基于xUtils的HttpUtils重新封装的.接下来讲一下使用方法. 1.HttpReq 看以看到有这么几个方法 GET:GET方式请求 POST:普通的POST表单提交 POST:将数据以流的形式传递 /** * POST请求,用InputStream的方式传递请求参数 * * @param api * 接口地址 * @param reques

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Cocos2d-x游戏开发之lua编辑器 subime 搭建,集成cocos2dLuaApi和自有类

Sublime Text http://baike.baidu.com/view/10701920.htm?from_id=8130415&type=syn&fromtitle=Sublime&fr=aladdin 简介 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的V