文档章节

PHP扩展开发与实践

Juzhang
 Juzhang
发布于 2015/07/20 09:40
字数 834
阅读 141
收藏 10

PHP扩展开发与实践

  • C扩展原生开发
  • Zephir语言开发扩展

Hello World!示例

C 扩展原生开发

优点:性能,操作底层接口(内存),修改内核行为 缺点:对于不熟c语言,难上手,同时还需要阅读ZEND_API

参考文档:

PHP扩展开发及内核应用

深入理解PHP内核

实现过程:

  1. 下载php-src源码

  2. 编译工具

    • gcc c语言编译器
    • make c/c++自动构建工具
    • autoconf 检查系统环境与编译参数
  3. 进入php-src

    目录结构
    bulid
    ext(php自带扩展)
    	ext_skel(创建扩展工程脚本)
    	....
    main
    netware
    ....	
    
  4. 执行./ext_skel --extname=test 创建一个test扩展工程

    juzhag@juzhag-virtual-machine:/mnt/hgfs/ubuntu/php/php-5.5.27/ext$ ./ext_skel --extname=test
    Creating directory test
    Creating basic files: config.m4 config.w32 .svnignore test.c php_test.h CREDITS EXPERIMENTAL tests/001.phpt test.php [done].
    
    To use your new extension, you will have to execute the following steps:
    
    1.  $ cd ..
    2.  $ vi ext/test/config.m4
    3.  $ ./buildconf
    4.  $ ./configure --[with|enable]-test
    5.  $ make
    6.  $ ./sapi/cli/php -f ext/test/test.php
    7.  $ vi ext/test/test.c
    8.  $ make
    
    Repeat steps 3-6 until you are satisfied with ext/test/config.m4 and
    step 6 confirms that your module is compiled into PHP. Then, start writing
    code and repeat the last two steps as often as necessary.
    
    juzhag@juzhag-virtual-machine:/mnt/hgfs/ubuntu/php/php-5.5.27/ext$ cd test/
    juzhag@juzhag-virtual-machine:/mnt/hgfs/ubuntu/php/php-5.5.27/ext/test$ ll
    total 24
    drwxrwxrwx 1 root root 4096  7月 19 13:39 ./
    drwxrwxrwx 1 root root 8192  7月 19 13:39 ../
    -rwxrwxrwx 1 root root 1986  7月 19 13:39 config.m4*
    -rwxrwxrwx 1 root root  282  7月 19 13:39 config.w32*
    -rwxrwxrwx 1 root root    4  7月 19 13:39 CREDITS*
    -rwxrwxrwx 1 root root    0  7月 19 13:39 EXPERIMENTAL*
    -rwxrwxrwx 1 root root 2812  7月 19 13:39 php_test.h*
    -rwxrwxrwx 1 root root   16  7月 19 13:39 .svnignore*
    -rwxrwxrwx 1 root root 5044  7月 19 13:39 test.c*
    -rwxrwxrwx 1 root root  496  7月 19 13:39 test.php*
    drwxrwxrwx 1 root root    0  7月 19 13:39 tests/
    
  5. 注意到config.m4,autoconf的配置文件,编写test扩展配置dnl 注释去除

     PHP_ARG_WITH(test, for test support,
     [  --with-test             Include test support])
    
  6. 执行phpize命令,根据php的版本信息,生成configure文件

  7. 执行./configure shell脚本检查编译环境

  8. 产生Makefile编译的配置文件

  9. make && make install

  10. 在php.ini添加 test.so

  11. 测试test目录下的test.php文件即可证明是否生效confirm_test_compiled函数

接下来进行hello world 示例编写

注意刚才test目录下有php_test.h头文件,test.c源文件

  1. php_test.h 声明一个函数

     PHP_FUNCTION(test_hello);
    
  2. test.c 编写源码

     PHP_FUNCTION(test_hello)
     {
     	int len;
     	char *strg;
     	len = spprintf(&strg, 0, "Hello World");
     	RETURN_STRINGL(strg, len, 0);
     }
    
  3. test.c 编写源码,注册函数

     const zend_function_entry test_functions[] = {
     	PHP_FE(test_hello, NULL)
     }
    
  4. 重新make && make install

  5. 编写php脚本,执行 echo test_hello();

上述RETURN_STRINGL,PHP_FE...具体代码使用api,请参考zend API,在php源码根目录下的zend目录zend_API.h文件

Zephir语言开发扩展

优点:类似php语言书写,易上手,快速生成c扩展

缺点:还是得看文档

文档:http://zephir-lang.com/

安装需求(http://zephir-lang.com/install.html):

  • gcc >= 4.x/clang >= 3.x
  • re2c 0.13 or later
  • gnu make 3.81 or later
  • autoconf 2.31 or later
  • automake 1.14 or later
  • libpcre3
  • php development headers and tools

安装成功:

编写hello world 案例

实现过程(http://zephir-lang.com/tutorial.html#checking-installation):

  1. zephir init utils 初始化工程,命名为utils

  2. cd utils

  3. vi utils/greeting.zep

     namespace Utils;
    
     class Greeting
     {
    
         public static function say()
         {
             echo "hello world!";
         }
    
     }
    
  4. zephir build

  5. vi php.ini

     extension=utils.so
    
  6. php test.php

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

Hello World就是这么简单易用,具体开发细节请查看手册


@author 詹巨章 zhanjuzhang@gmail.com

@date 2015/7/19 16:27:25

© 著作权归作者所有

共有 人打赏支持
Juzhang
粉丝 8
博文 29
码字总数 15122
作品 0
湛江
程序员
私信 提问
[Zephir开发实践]用Zephir编写PHP扩展实践

场景描述 首先,还是强烈推荐一下Phalcon这个框架。 由于对这个框架很感兴趣,所以看了其官方文档,并在先前用PHP根据其思想写了两个Phalcon核心类,见链接: #年前福利#Phalcon框架部分核心...

暗夜在火星
2014/06/26
0
0
轻量级PHP开发框架--CookPHP

CookPHP 开发框架是一个基于PHP7的自由、免费开源、快速、简单的面向对象的轻量级PHP开发框架,并由珠海旭爱科技有限公司团队开发与维护。 CookPHP一直也实践与众筹系统、多用户商城等商业项目...

费尔
2016/09/02
961
0
Smarty前端模板引擎 - 我看过的PHP开源框架

Smarty Smarty可以说是我接触PHP这门语言用到的第一个开源框架,当时在Smarty的帮助下,很好地完成了项目的开发,也很好地遵循了MVC的模式。但是到了后来,慢慢地发现,很多人都很熟悉Smart...

暗夜在火星
2014/12/25
0
0
PHP扩展实现的框架--ZoeeyPHP

ZoeeyPHP 是PHP扩展实现的Web开发框架底层,特点是较大限度的将控制权释放给了程序员。 建议PHP版本 >= 5.2.0 。 为经验丰富的开发人员设计。 提供最基础的开发功能如字符串控制、客户端数据...

moxie
2012/01/05
1K
0
PHP Socket 网络应用框架 - beyod

beyod: 一个高性能分布式、事件驱动、异步非阻塞php socket网络应用框架 beyod是基于Libevent/epoll/Yii2 Framework的高性能分布式、事件驱动、异步非阻塞php实现的socket网络服务开发框架。...

月影又无痕
2018/12/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AWS的自动部署工具codedeploy 部署前的准备工作

开始部署codedeploy: 1.先预置IAM用户: 创建一个IAM用户或使用一个与AWS相关联的用户; 复制以下的策略附加到IAM用户,向IAM用户赋予对codedeploy(及codedeploy所依赖的AWS服务和操作)的...

守护-创造
23分钟前
0
0
这可能是最详细的一线大厂Mysql面试题详解了

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后...

Java干货分享
33分钟前
1
0
人的精力是什么?如何强化精力

人的精力是什么? 人的精力是什么? 精力指精神和体力。精神包括一个人的精神状态,兴奋度,做事情的投入度,专注度,持续时间等。 人的精力来源 人的精力有4种来源,身体的、情感的、思想的和...

莫库什勒
52分钟前
1
0
JFinal开发的旅游线路营销Saas平台演示系统我部署了一个

今天部署了一个旅游线路营销管理系统的演示版: 演示地址:http://lvyou.jfinalxueyuan.com 演示账号:(暂时只给一个门店版的吧,批发商和总部的如果需要 演示看看 单独联系我微信:1876673...

山东-小木
今天
2
0
如何学习大数据技术

学习大数据技术,首先要明确大数据的概念。 大数据的概念作者认为有如下几点: 1.数据的来源多样性。例如关系数据库+文本+excel等 2.数据量大。TB级别的数据。 3.业务应用领域。实时性高与实...

董黎明
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部