编写第一个php扩展

你的第一个扩展

每一个php扩展的构建至少需要两个文件: 一个configuration文件, 它告诉编译期要构建哪些文件以及需要什么外部的库, 还需要至少一个源文件, 它执行实际的工作.

剖析扩展

实际上, 通常会有第二个或第三个配置文件, 以及一个或多个头文件. 对于你的第一个扩展, 你需要添加每种类型的一个文件并使用它们工作.

配置文件

要开始了, 首先在你的php源代码目录树的ext/目录下创建名为sample的目录. 实际上这个新的目录可以放在任何地方, 但是为了在本章后面演示win32和静态构建选项, 我们还是先建立在源代码目录下吧.

下一步, 进入这个目录, 创建一个名为config.m4的文件, 键入下面内容:

PHP_ARG_ENABLE(sample,
  [Whether to enable the "sample" extension],
  [  enable-sample        Enable "sample" extension support])  

if test $PHP_SAMPLE != "no"; then
  PHP_SUBST(SAMPLE_SHARED_LIBADD)
  PHP_NEW_EXTENSION(sample, sample.c, $ext_shared)
fi

这是./configure时能够调用enable-sample选项的最低要求.PHP_ARG_ENABLE的第二个参数将在./configure处理过程中到达这个扩展的配置文件时显示. 第三个参数将在终端用户执行./configure --help时显示为帮助信息.

有没有想过为什么有的扩展配置使用enable-extname, 而有的扩展则使用with-extname? 功能上两者没有区别. 实际上, enable表示启用这个特性不需要其他任何第三方库, 相比之下, with则表示要使用这个特性还有其他先决条件

现在, 你的sample扩展并不需要和其他库链接, 因此只需要使用enable版本. 在第17章"外部库"中, 我们将介绍使用with并指示编译器使用额外的CFLAGS和LDFLAGS设置.

如果终端用户使用enable-sample选项调用了./configure, 那么本地的环境变量$PHP_SAMPLE, 将被设置为yes. PHP_SUBST()是标准autoconf的AC_SUBST()宏的php修改版, 它在将扩展构建为共享模块时需要.

最后但并不是不重要的, PHP_NEW_EXTENSION()定义了模块并枚举了所有必须作为扩展的一部分编译的源文件. 如果需要多个文件, 它可以在第二个参数中使用空格分隔列举, 例如:

PHP_NEW_EXTENSION(sample, sample.c sample2.c sample3.c, $ext_shared)

最后一个参数是对应于PHP_SUBST(SAMPLE_SHARED_LIBADD)命令的, 在构建共享模块的时候同样需要它.

头文件

当使用C开发的时候, 将数据的类型定义放到外部的头文件中隔离起来, 由源文件包含是常见的做法. 尽管php并不要求这样, 但是这样做在模块增长到不能放到单个源文件时是有简化作用的.

在你的php_sample.h头文件中, 以下面内容开始:

#ifndef PHP_SAMPLE_H
/* 防止重复包含 */
#define PHP_SAMPLE_H  

/* 定义扩展的属性 */
#define PHP_SAMPLE_EXTNAME    "sample"
#define PHP_SAMPLE_EXTVER    "1.0"  

/* 在php源码树外面构建时引入配置选项 */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif  

/* 包含php的标准头文件 */
#include "php.h"  

/* 定义入口点符号, Zend在加载这个模块的时候使用 */
extern zend_module_entry sample_module_entry;
#define phpext_sample_ptr &sample_module_entry  

#endif /* PHP_SAMPLE_H */

这个头文件完成了两个主要的任务: 如果扩展使用phpize工具构建(本书通常都使用这种方式), 那么HAVE_CONFG_H就是已定义的, 这样config.h就会被正常的包含进来. 无论扩展怎样编译, 都会从php源码树中包含php.h. 这个头文件中包含了php源码中访问大部分PHPAPI要使用的其他头文件.

接下来, 你的扩展使用的zend_module_entry结构定义为外部的, 这样当这个模块使用extension=xxx加载时, 就可以被Zend使用dlopen和dlsym()取到.

译注: 关于模块的加载过程, 请参考译者的一篇博客<从dl('xxx.so');函数分析PHP模块开发>(http://blog.csdn.net/lgg201/article/details/6584095)

头文件中还会包含一些预处理, 定义将在原文件中使用的信息.

源代码

最后, 最重要的你需要在sample.c中创建一个简单的源码骨架:

#include "php_sample.h"  

zend_module_entry sample_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
     STANDARD_MODULE_HEADER,
#endif
    PHP_SAMPLE_EXTNAME,
    NULL, /* Functions */
    NULL, /* MINIT */
    NULL, /* MSHUTDOWN */
    NULL, /* RINIT */
    NULL, /* RSHUTDOWN */
    NULL, /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
    PHP_SAMPLE_EXTVER,
#endif
    STANDARD_MODULE_PROPERTIES
};  

#ifdef COMPILE_DL_SAMPLE
ZEND_GET_MODULE(sample)
#endif

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 文件
, 模块
, 源文件
, samples
, sample
, 头文件编写
, 头文件的编写
, 一个
, sample源码
编写PHP扩展
php编写第一个api接口、编写php扩展、c编写php扩展性能、如何编写php扩展、c语言编写php扩展,以便于您获取更多的相关知识。

时间: 2024-10-27 07:49:14

编写第一个php扩展的相关文章

php 5.6版本中编写一个PHP扩展的简单示例

 这篇文章主要介绍了php 5.6版本中编写一个PHP扩展的简单示例,本文给出扩展实现代码.编译方法.配置方法和使用例子等内容,需要的朋友可以参考下     有时候在php本身没有满足需求的api时候,需要自己写相应的扩展,扩展写完之后进行编译,即可加入自己的开发环境中,扩展php的功能. 这里实现一个连接字符串和int型数的连接操作的简单扩展. 首先,下载最新的php源码安装包,进入ext/目录,新建extstrcat.def: 代码如下: string extstrcat(string st

Python中的线性优化,第 2 部分 在云中构建一个可扩展的基础架构

简介 这个由三部分组成的系列文章的第 1 部分介绍了在 Python 中使用 Pyomo 库进行线性优化的 基础知识.现在我们将介绍如何扩展它.Python 缺乏真实的操作系统线程,该如何扩展它?本文将向您介绍 如何组合使用这些技术来创建一个实际的可扩展基础架构,该架构可用于构建一个 Pyomo Web 解决方案.我 们组合使用了一个单线程事件循环.一个 AMQP 服务器和工作线程流程来创建一个模式,利用该模式扩展一个 线性优化系统.该基础架构也适用于 Python 或 Ruby 中的许多通用计

Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序

原文 Windows Phone 8初学者开发-第3部分:编写第一个Windows Phone 8应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-3-Writing-your-First-Windows-Phone-8-App 系列地址:http://channel9.msdn.com/Series/Windows-Phone-8-Developm

《C++游戏编程入门(第4版)》——1.2 编写第一个C++程序

1.2 编写第一个C++程序 C++游戏编程入门(第4版)到此为止,我们已经介绍了足够多的理论知识.现在来实践编写第一个C++程序.麻雀虽小,五脏俱全.该程序同样演示了在控制台窗口中显示文本的方法. 1.2.1 Game Over程序简介 程序员在学习新语言时,编写的第一个程序便是经典的Hello World程序,在屏幕上显示Hello World.Game Over程序打破了这个传统,显示的是Game Over!.该程序的运行结果如图1.2所示. 图1.2 您的第一个C++程序显示的是计算机游

c c++-求用c编写的一个简单的爬虫程序,高手赐教,不胜感激

问题描述 求用c编写的一个简单的爬虫程序,高手赐教,不胜感激 本人是初学者,要编写一爬虫程序,抓取60多万个网页上的信息,实在是无从下手,请高手给一个能看得懂的简单的爬虫程序学习用,多谢 解决方案 我也要写一个C爬虫,不过遇到了一些问题,比如58这样的网站,用getaddrinfo返回的ip无法连接,已经耽误了我好几天了,别的问题到还没遇到

php编写的一个E-mail验证类

 这篇文章主要介绍了php编写的一个E-mail验证类的用法,非常的简单实用,需要的小伙伴参考下,可以直接拿走使用.     这个类可以用来检查电子邮件是否有效使用SMTP协议. 它可以连接到由地址的域名来验证的MX记录中定义的SMTP服务器. 并且模拟消息的传递,以查看是否在给定的收件人地址被接受为有效. ? 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 <!DOCTYPE HTML PUBLIC "-

初学PHP,编写了一个显示天气预报的程序,还望不要见笑。

程序|初学|天气预报|显示 刚开始学PHP,先编写了一个程序,放在自己的主页上,可以显示天气预报,当然还很不完善,希望大家给提意见.程序如下:<?$fcont=file("http://www.bjmb.gov.cn/today.asp");$arr=array();for($i=0;$i<count($fcont);$i++){    $tmp=$fcont[$i];    $tmp=ereg_replace("<br>"," &

编写第一个Django app,第一部分——创建项目

编写第一个Django app,第一部分--创建项目 让我们通过例子来学习. 通过这个指导教程,我们将一步步地教你创建一个简单的投票系统. 这个系统分为两部分: 1.一个公共的页面让人们投票和查看投票结果. 2.一个管理员页面让你添加,修改和删除投票. 我们假定你已经安装了Django.你可以运行Python编译器并输入import django来测试Django是否已经安装.如果命令运行成功,没有错误,说明Django 已经安装了. 新建项目 如果你是第一次使用Django,你必须确保一些初始

myeclipse-MyEclipse中编写的一个完整的jsp程序包括后台文件的运行流程

问题描述 MyEclipse中编写的一个完整的jsp程序包括后台文件的运行流程 一个程序在MyEclipse中的运行流程,也就是先加载那个文件,后运行那个文件,求指点 解决方案 你不如找一本web开发教程的书看看 解决方案二: 去学一下jsp就知道了,,很快的,,