给PHP7.4编写扩展

简介: 给PHP7.4编写扩展

给PHP7.4编写扩展

本文是以 PHP7.4 作为基础,讲解如何从零开始创建一个 PHP 扩展。本文主要讲解创建一个扩展的基本步骤都有哪些。示例中,我们将实现如下功能:

<?php
echo hello();

输出内容:

// $ php74 ./hello.php
$ hello word

在扩展中实现一个 hello 方法,调用 hello 方法后,输出 hello word!

生成扩展骨架

首先我们要有一份 php-src

git clone https://github.com/php/php-src.git 
cd php-src
git checkout PHP-7.4.5
cd php-7.4.10/ext
ls

可以看到有一个 ext_skel.php 文件

bcmath    com_dotnet  date  enchant       ffi       ftp      gmp    imap  ldap      mysqli   odbc     pcntl  pdo_dblib     pdo_oci    pdo_sqlite  posix     reflection  simplexml  soap     spl       sysvmsg  tidy       xmlreader  xsl        zlib
bz2       ctype       dba   exif          fileinfo  gd       hash   intl  libxml    mysqlnd  opcache  pcre   pdo_firebird  pdo_odbc   pgsql       pspell    session     skeleton   sockets  sqlite3   sysvsem  tokenizer  xmlrpc     zend_test
calendar  curl        dom   ext_skel.php  filter    gettext  iconv  json  mbstring  oci8     openssl  pdo    pdo_mysql     pdo_pgsql  phar        readline  shmop       snmp       sodium   standard  sysvshm  xml        xmlwriter  zip

这个已经文件已经跟 php 一起发布了,所以我们自定义起来非常方便

php ext_skel.php --ext hello --author aoppp --std
Copying config scripts... done
Copying sources... done
Copying tests... done
Success. The extension is now ready to be compiled. To do so, use the
following steps:
cd /path/to/php-src/hello
phpize
./configure
make
Don't forget to run tests once the compilation is done:
make test
Thank you for using PHP!

ext 目录下便生成 hello 目录

扩展骨架说明

-rw-r--r--   1 longshilin  staff   405 Feb 27 16:07 .gitignore
-rw-r--r--   1 longshilin  staff    11 Feb 27 16:07 CREDITS
-rw-r--r--   1 longshilin  staff  3231 Feb 27 16:07 config.m4
-rw-r--r--   1 longshilin  staff   204 Feb 27 16:07 config.w32
-rw-r--r--   1 longshilin  staff  3355 Feb 27 16:07 hello.c
-rw-r--r--   1 longshilin  staff  1425 Feb 27 16:07 php_hello.h
drwxr-xr-x   5 longshilin  staff   160 Feb 27 16:07 tests
  • config.m4配置文件

扩展的 config.m4 文件告诉 UNIX 构建系统哪些扩展 configure 选项是支持的,你需要哪些扩展库,以及哪些源文件要编译成它的一部分。对所有经常使用的 autoconf 宏,包括 PHP 特定的及 autoconf 内建的。

config.m4 的作用就是配合 phpize 工具生成 configure 文件。configure 文件是用于环境检测的。检测扩展编译运行所需的环境是否满足。现在我们开始修改 config.m4 文件。

image.png

其中,dnl 是注释符号。

上面的代码说,如果你所编写的扩展如果依赖其它的扩展或者 lib 库,需要去掉 PHP_ARG_WITH 相关代码的注释。否则,去掉 PHP_ARG_ENABLE 相关代码段的注释。我们编写的扩展不需要依赖其他的扩展和 lib 库。因此,我们去掉 PHP_ARG_ENABLE 前面的注释。

上图生成的时候就已经指定是不依赖其他的扩展。

  • php_hello.h 头文件
    类似于C语言的头文件,包含了一些自定义的结构和函数声明,在这个demo中暂时不需要改动
  • hello.c代码文件

真正的逻辑代码都在这个文件中

编写代码

hello.c 里面都是逻辑代码,所以我们增加代码在这个文件中操作即可

了解扩展入口

整个扩展的入口是 zend_module_entry 这个结构,具体的定义可以在 Zend 目录下的zend_modules.h 文件中看到,一共有十几个属性,快速跳过,我们暂时只需要 hello

zend_module_entry hello_module_entry = {
  STANDARD_MODULE_HEADER,
  "hello",          /* Extension name */
  hello_functions,      /* zend_function_entry */
  NULL,             /* PHP_MINIT - Module initialization */
  NULL,             /* PHP_MSHUTDOWN - Module shutdown */
  PHP_RINIT(hello),     /* PHP_RINIT - Request initialization */
  NULL,             /* PHP_RSHUTDOWN - Request shutdown */
  PHP_MINFO(hello),     /* PHP_MINFO - Module info */
  PHP_HELLO_VERSION,    /* Version */
  STANDARD_MODULE_PROPERTIES
};

扩展相关属性说明:

  • STANDARD_MODULE_HEADER 帮我们实现了前面6个属性
  • hello 是扩展名称
  • hello_functions 是扩展包含的全部方法的集合,后面5个宏分别代表5个扩展特定方法
  • PHP_HELLO_VERSION 是扩展的版本号,定义在头文件中,如果需要修改的话直接打开php_hello.h 找到 define PHP_LZPAY_VERSION 进行修改
  • STANDARD_MODULE_PROPERTIES 帮我们实现了剩下的属性

hello_functions[] 方法数组中已经有了2个示例方法hello_test1hello_test2,我们参考它写我们的方法,首先我们写一个测试方法,放到函数 PHP_FUNCTION(hello_test2) 后面:

/*新增函数*/
PHP_FUNCTION(hello)
{
     zend_string *strg;
     strg = strpprintf(0, "hello word");
     RETURN_STR(strg);
}

然后在 hello_functions[] 数组中增加我们新写的函数

image.png

编译安装

因为我是新安装的一个独立的 php7.4,所以我的操作基本上都是带绝对路径的,如果大家就一个环境直接操作就行

cd hello/
/usr/local/Cellar/php/7.4.0/bin/phpize
./configure  --with-php-config=/usr/local/Cellar/php/7.4.0/bin/php-config
make && make install
----------------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
Installing shared extensions:     /usr/local/Cellar/php/7.4.0/pecl/20190902/

安装好了,我们配置一下这个扩展

  • ext-hello.ini
[hello]
extension="/usr/local/Cellar/php/7.4.0/pecl/20190902/hello.so"

测试

hello git:(PHP-7.4.5) $ /usr/local/Cellar/php/7.4.0/bin/php -m | grep hello
# 输出成功说明ok
hello

image.png

目录
相关文章
|
7月前
|
运维 Unix Linux
Linux系统 PHP安装expect扩展详解
Linux系统 PHP安装expect扩展详解
97 5
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
69 4
|
2月前
|
NoSQL 安全 Linux
MongoDB PHP 扩展
10月更文挑战第19天
13 0
MongoDB PHP 扩展
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
4月前
|
安全 前端开发 PHP
PHP与现代Web开发:构建高效和可扩展的应用程序
【8月更文挑战第29天】在这篇文章中,我们将深入探讨PHP如何适应现代Web开发的需求。我们将通过实际案例分析,揭示PHP的核心优势,并展示如何利用这些优势来构建高性能、可扩展的Web应用。文章不仅提供理论知识,还包括具体的代码示例,旨在帮助开发者更好地理解和运用PHP解决实际问题。
|
4月前
|
SQL 关系型数据库 MySQL
PHP与数据库交互的艺术:深入探讨PDO扩展
【8月更文挑战第28天】在数字信息时代的海洋里,PHP作为一艘灵活的帆船,承载着无数网站和应用的梦想。而PDO扩展,则是这艘帆船上不可或缺的导航仪,指引着数据安全与效率的航向。本文将带你领略PHP与数据库交互的艺术,深入浅出地探索PDO的世界,从连接数据库到执行复杂的查询,每一步都清晰可见。我们将一起航行在这段奇妙的旅程上,解锁数据的奥秘,体验编程的乐趣。
71 1
|
4月前
|
存储 安全 Linux
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
|
5月前
|
运维 Serverless API
函数计算产品使用问题之如何使用PHP Runtime非内置扩展
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
211 1