老司机php源码,JeRuen

PHP扩展开发系列01 - 我要成为一名老司机

1. 关于扩展的教程貌似挺全了,为啥还写?记录下我写扩展的历程

自认为会写的更容易理解

我的宗旨就是 "先用再识" 代码写着写着就知道原理了 或者说边写边学, 边学边写

2. 那么你首先要具备哪些预备知识? 答:你需要先过科目一C 为啥放第一位?

PHP 不会?那写什么PHP扩展?

PHP的编译安装

phpize 和 php-config 这个靠你们自己去了解了

关于PHP编译 前期非必须,但是要知道的 (no-debug, non-zts, debug, zts)

问?搜? -- 有时候不一定要问或者搜才能找到解决的答案。

找! --- 找出别人扩展真么写的 (php-src/ext)。不但有答案,还有思想。

至于 PHP ZEND 原理啥的, 很重要, 很重要, 很重要, 但是这里暂时放一边,没事可以去了解了解。

3. 先看看刚上车的司机是什么样的? (示例代码) 最后有注释版的

代码说明这是一个很简单的扩展, 简单到没有功能

扩展名称 laosiji

目前看来 这只是一个只会装B(啥都不会)的司机

三个文件

config.m4

php_laosiji.h

laosiji.c

config.m4PHP_ARG_ENABLE(

laosiji,

whether to enable laosiji support,

[ --enable-laosiji Enable laosiji support]

)

if test "$PHP_LAOSIJI" != "no"; then

PHP_NEW_EXTENSION(laosiji, laosiji.c, $ext_shared)

fi

php_laosiji.h#define PHP_LAOSIJI_EXTNAME "laosiji"

#define PHP_LAOSIJI_VERSION "1.0.0"

// 加载config.h,如果配置了的话

#ifdef HAVE_CONFIG_H

#include "config.h"

#endif

// 加载php头文件

#include "php.h"

laosiji.c#include "php_laosiji.h"

// module entry

zend_module_entry laosiji_module_entry = {

#if ZEND_MODULE_API_NO >= 20010901

STANDARD_MODULE_HEADER,

#endif

PHP_LAOSIJI_EXTNAME, /* 扩展名称 */

NULL, /* Functions */

NULL, /* MINIT */

NULL, /* MSHUTDOWN */

NULL, /* RINIT */

NULL, /* RSHUTDOWN */

NULL, /* MINFO */

#if ZEND_MODULE_API_NO >= 20010901

PHP_LAOSIJI_VERSION, /* 扩展版本 */

#endif

STANDARD_MODULE_PROPERTIES};

#ifdef COMPILE_DL_LAOSIJI

ZEND_GET_MODULE(laosiji)

#endif

5. 作为司机的一本基本开车动作 (扩展的编译安装等)phpize

./configure 这里要注意下 php-config

make

make install

加载 .so 扩展文件

6. 点火启动 试试我们的扩展<?php

var_dump(extension_loaded('laosiji'));

// 自己去了解下 dl 函数

// @ 只是为了不出现那烦人的 提示

// 为了避免不必要的麻烦 建议在 php.ini 加载 扩展

@dl('laosiji.so');

var_dump(extension_loaded('laosiji'));

7. 小节

差不多就到这里了。这次主要说了下写PHP扩展要准备的一些基本知识。当然有些人可能对上面提到部分概念没深入了解。

比如 PHP不同编译方式(debug, nts..)、phpize、php-config 具体作用。

phpize、php-config 一定要注意,这里提醒你这回遇到坑。

后面再来慢慢学习老司机的各种姿势。包括,函数,函数参数,函数返回值,对象,类,命名空间等等等。

8. 注释版代码

config.m4dnl dnl 开头的语句 属于注释内容

dnl PHP_ARG_ENABLE 函数有三个参数

dnl 第一个参数 laosiji 扩展名称 (不用加引号)

dnl 第二个参数 运行 ./configure 脚本时显示的内容

dnl 第三个参数 调用 ./configure --help 显示的帮助信息

dnl 最后去了接下 PHP_ARG_WITH 这里就先不提了

PHP_ARG_ENABLE(

laosiji,

whether to enable laosiji support,

[ --enable-laosiji Enable laosiji support]

)

if test "$PHP_LAOSIJI" != "no"; then

dnl PHP_NEW_EXTENSION 函数声明 扩展的名称、需要的源文件名、扩展的编译形式

dnl 第一个参数 扩展的名称

dnl 第 2 。。 n-1 个参数 需要的源文件名

dnl 最后的$ext_shared参数用来声明这个扩展不是一个静态模块,而是在php运行时动态加载的。

dnl 如果我们的扩展使用了多个文件,便可以将这多个文件名罗列在函数的参数里,如:

dnl PHP_NEW_EXTENSION(laosiji, laosiji.c, laosiji_2.c, laosiji_3.c, $ext_shared)

PHP_NEW_EXTENSION(laosiji, laosiji.c, $ext_shared)

fi

php_laosiji.h// 定义 扩展相关的宏 比如版本号 扩展名称等等。。

#define PHP_LAOSIJI_EXTNAME "laosiji"

#define PHP_LAOSIJI_VERSION "1.0.0"

// 加载config.h,如果配置了的话

#ifdef HAVE_CONFIG_H

#include "config.h"

#endif

// 加载php头文件

// 这个 很有必要哈

#include "php.h"

laosiji.c#include "php_laosiji.h"

// module entry

// 1. laosiji_module_entry 扩展名称_module_entry

// 2. PHP_LAOSIJI_EXTNAME /* 扩展名称 */

// 3. PHP_LAOSIJI_VERSION, /* 扩展版本 */

// 那些 NULL ?

// 第一个你要记住 /* Functions */ 这行 想想 php 中的函数

// 第二个你要记住 /* MINIT */ 想想 class && object

// 第三个你要记住 MINIT MSHUTDOWN RINIT RSHUTDOWN MINFO 慢慢来 不着急

zend_module_entry laosiji_module_entry = {

#if ZEND_MODULE_API_NO >= 20010901

STANDARD_MODULE_HEADER,

#endif

PHP_LAOSIJI_EXTNAME, /* 扩展名称 */

NULL, /* Functions */

NULL, /* MINIT */

NULL, /* MSHUTDOWN */

NULL, /* RINIT */

NULL, /* RSHUTDOWN */

NULL, /* MINFO */

#if ZEND_MODULE_API_NO >= 20010901

PHP_LAOSIJI_VERSION, /* 扩展版本 */

#endif

STANDARD_MODULE_PROPERTIES};

#ifdef COMPILE_DL_LAOSIJI

ZEND_GET_MODULE(laosiji)

#endif

参考查看原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值