摘要:起步最近在看扩展开发中文教程的版。扩展是什么用过的人一定也用过扩展。本身带有个扩展,扩展是对语言功能的一个延伸,的核心由两部分组成最底层的引擎和内核。额外不使用工具写扩展一个扩展为避免与写过的冲突,采用作为名字,至少包含个文件。
起步
最近在看 《PHP扩展开发中文教程》 的pdf版。PHP的解释器是用C语言写的,所以PHP扩展自然也是用C 语言了。
扩展是什么用过php的人一定也用过php扩展。php本身带有86个扩展,扩展是对php语言功能的一个延伸,php的核心由两部分组成:最底层的 Zend引擎 和 PHP内核 。ze把脚本解析成机器可读的符号,也会处理内存管理,变量作用域,程序调度。PHP内核则主要涉及主机环境(Apache,IIS,Nginx),处理与主机的通信。
动机当php自身不满足需求的时候就可以自己去造轮子了。采用C语言开发还能一定程度上解决性能问题,而php是我最喜欢的一门编程语言,写扩展的机会自然不放过,更重要的是可以 装逼 。
新建扩展我们要写个扩展代替以下的功能:
我的开发环境是:
系统: Ubuntu 16.04
PHP: 7.0+
gcc :4.8.4
PHP已经提供了工具用来创建扩展,并初始化代码:ext_skel$ cd php-src/ext $ ./ext_skel --extname=hello工具会在当前目录生成 hello 文件夹。
修改配置文件cd到hello,工具已经初始化了目录,打开配置文件 config.m4:
dnl If your extension references something external, use with: dnl PHP_ARG_WITH(hello, for hello support, dnl Make sure that the comment is aligned: dnl [ --with-hello Include hello support]) dnl Otherwise use enable: dnl PHP_ARG_ENABLE(hello, whether to enable hello support, dnl Make sure that the comment is aligned: dnl [ --enable-hello Enable hello support])dnl 是注释符,表示当前行是注释。这段话是说如果此扩展依赖其他扩展,去掉PHP_ARG_WITH段的注释符;否则去掉PHP_ARG_ENABLE段的注释符。显然我们不依赖其他扩展或lib库,所以去掉PHP_ARG_ENABLE段的注释符:
PHP_ARG_ENABLE(hello, whether to enable hello support, Make sure that the comment is aligned: [ --enable-hello Enable hello support])书写代码工具生成的hello.c,写上我们的实现:
PHP_FUNCTION(hello) { zend_string *strg; strg = strpprintf(0, "hello world."); RETURN_STR(strg); }添加到编译列表里:
const zend_function_entry hello_functions[] = { PHP_FE(hello, NULL) /*添加这行*/ PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */ PHP_FE_END /* Must be the last line in hello_functions[] */ };编译与安装$ phpize $ ./configure --with-php-config=/usr/local/php7/bin/php-config $ make & make install修改php.ini,开启扩展,若找不到可以用phpinfo()查看使用哪个配置文件.
extension=hello.so写个脚本: 不出意外就能看到输出了。
额外:不使用工具写扩展一个扩展(为避免与写过的hello冲突,采用world作为名字),至少包含3个文件: config.m4、 php_world.h 、 world.c 。一个是phpize用来准备编译扩展的配置文件,一个是引用包含的头文件,一个是源码文件。
config.m4
PHP_ARG_ENABLE(world, whether to enable world support, Make sure that the comment is aligned: [ --enable-world Enable hello support]) if test "$PHP_WORLD" != "no"; then AC_DEFINE(HAVE_WORLD,1,[ ]) PHP_NEW_EXTENSION(world, world.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fiphp_world.h
#ifndef PHP_WORLD_H #define PHP_WORLD_H extern zend_module_entry hello_module_entry; #define phpext_hello_ptr &hello_module_entry #define PHP_WORLD_VERSION "0.1.0" #define PHP_WORLD_EXTNAME "world" #endifworld.c
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_world.h" PHP_FUNCTION(world) { zend_string *strg; strg = strpprintf(0, "hello world. (from world module)"); RETURN_STR(strg); } const zend_function_entry world_functions[] = { PHP_FE(world, NULL) PHP_FE_END }; zend_module_entry world_module_entry = { STANDARD_MODULE_HEADER, PHP_WORLD_EXTNAME, world_functions, NULL, NULL, NULL, NULL, NULL, PHP_WORLD_VERSION, STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_WORLD #ifdef ZTS ZEND_TSRMLS_CACHE_DEFINE() #endif ZEND_GET_MODULE(world) #endif编译安装:
$ phpize $ ./configure --with-php-config=/usr/local/php7/bin/php-config $ make & make install测试:
一样需要在php.ini添加extension=world.so不使用工具的精简的一个扩展完成。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22067.html
摘要:下载源代码要开发扩展,需要先下载的源代码,一方面是因为我们的扩展一般会用到自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量。重点关注,,即可,最简单的场景下这三个文件就是一个扩展的全部组成部分了。 下载PHP源代码 要开发PHP扩展,需要先下载PHP的源代码,一方面是因为我们的扩展一般会用到PHP自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量。我下载了...
摘要:四使用语言开发是我重点推荐的扩展开发框架,简明易懂,功能强大,开发效率高,代码易维护,执行速度快。优点三支持,的扩展开发有两套扩展开发框架,分别支持,,虽然框架代码有两个,但是接口却是一样的。 PHP扩展是高级PHP程序员必须了解的技能之一,对于一个初入门的PHP扩展开发者,怎么才能开发一个成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将手把手带您从入门进入高级阶段。本教程系列...
摘要:简介通过扩展,我们可以在代码中使用一些特定的方法大部分的扩展都是用写的。这个目录与我们的扩展同名。我们先来在扩展中创建一个类,使用此类来渲染。接下来命令行执行以下命令来编译扩展第一次运行以上命令时,会初始化一些东西。 showImg(https://segmentfault.com/img/remote/1460000018698586); 简介: 通过 PHP 扩展, 我们可以在 p...
摘要:什么是是一种中间语言,以接近的语法来编写代码,然后转换编译成扩展,旨在简化扩展的创建和可维护性。如果成功,会自动生成文件到目录你需要编辑填加扩展测试一下就这样,你也会扩展开发了附附编译扩展的方法 什么是 Zephir Zephir 是一种中间语言,以接近 PHP 的语法来编写代码,然后转换编译成 PHP 扩展,旨在简化 PHP 扩展的创建和可维护性。利用编译来提高性能和资源消耗,又不需...
摘要:在安装及各种扩展的过程中,如果你是用源码安装,会注意到在成功之后总会有一句提示这个就是运行的自动化测试了。本文转自官方博客 在安装 PHP7 及各种扩展的过程中,如果你是用源码安装,会注意到在 make 成功之后总会有一句提示:Dont forget to run make test. 这个 make test 就是运行 PHP 的自动化测试了。 如果你刚刚安装完 PHP7,直接运行 ...
阅读 1623·2021-11-16 11:41
阅读 2441·2021-11-08 13:14
阅读 3063·2019-08-29 17:16
阅读 3057·2019-08-29 16:30
阅读 1804·2019-08-29 13:51
阅读 326·2019-08-23 18:38
阅读 3202·2019-08-23 17:14
阅读 612·2019-08-23 15:09