IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP 扩展开发 -> 正文阅读

[PHP知识库]PHP 扩展开发

系统环境

Centos 7 x86_64

PHP 编译与安装

$ cd /home/www/tools

# 下载 PHP 源码
# https://www.php.net/downloads.php
# https://github.com/php/php-src/releases/tag/php-7.4.28
$ wget https://www.php.net/distributions/php-7.4.28.tar.gz

$ tar -xzvf ./php-7.4.28.tar.gz

$ cd php-7.4.28

$ pwd
/home/www/tools/php-7.4.28

# 安装依赖
# https://blog.csdn.net/terence_csdn/article/details/105870279 
$ yum install -y gcc libxml2 libxml2-devel sqlite-devel

# 编译
$ ./configure --prefix=/home/www/install/php7.4.28--enable-fpm --enable-debug

$ make

$ make install
# 查看编译后的目录结构
$ yum install -y tree

$ tree -L 3 /home/www/install/ 

/home/www/install/
├── bin
│ ├── phar -> phar.phar
│ ├── phar.phar
│ ├── php
│ ├── php-cgi
│ ├── php-config
│ ├── phpdbg
│ └── phpize
├── etc
│ ├── php-fpm.conf.default
│ └── php-fpm.d
│ └── www.conf.default
├── include
│ └── php
│ ├── ext
│ ├── include
│ ├── main
│ ├── sapi
│ ├── TSRM
│ └── Zend
├── lib
│ └── php
│ ├── build
│ └── extensions
├── php
│ ├── man
│ │ ├── man1
│ │ └── man8
│ └── php
│ └── fpm
├── sbin
│ └── php-fpm
└── var
├── log
└── run
25 directories, 10 files

# 添加环境变量
$ echo 'PATH=$PATH:/home/www/install/php7.4.28/bin' >> /etc/profile

$ source /etc/profile

$ php -v
PHP 7.4.28 (cli) (built: Feb 20 2022 08:26:53) ( NTS DEBUG )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

# 复制配置文件
$ cp /home/www/tools/php-7.4.28/php.ini-development /home/www/install/php7.4.28/lib/php.ini

$ php --ini
...
Loaded Configuration File:         /home/www/install/php7.4.28/lib/php.ini
...

扩展开发

$ cd /home/www/tools/php-7.4.28/ext

$ php ./ext_skel.php  --ext mydemoext

$ cd mydemoext

$ tree

.
├── config.m4
├── config.w32
├── mydemoext.c
├── php_mydemoext.h
└── tests
├── 001.phpt
├── 002.phpt
└── 003.phpt
1 directory, 7 files

$ vim mydemoext.c
/* mydemoext extension for PHP */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include "php.h"
#include "ext/standard/info.h"
#include "php_mydemoext.h"

/* For compatibility with older PHP versions */
#ifndef ZEND_PARSE_PARAMETERS_NONE
#define ZEND_PARSE_PARAMETERS_NONE() \
        ZEND_PARSE_PARAMETERS_START(0, 0) \
        ZEND_PARSE_PARAMETERS_END()
#endif


/* {{{ string hello( [ string $var ] )
 *  */
PHP_FUNCTION(hello)
{       
        char *var;
        size_t var_len;
        zend_string *retval;
        
        ZEND_PARSE_PARAMETERS_START(0, 1)
                Z_PARAM_OPTIONAL
                Z_PARAM_STRING(var, var_len)
        ZEND_PARSE_PARAMETERS_END();
        
        retval = strpprintf(0, "Hello %s", var);
        
        RETURN_STR(retval);
}
/* }}}*/


/* {{{ PHP_RINIT_FUNCTION
 */
PHP_RINIT_FUNCTION(mydemoext)
{
#if defined(ZTS) && defined(COMPILE_DL_MYDEMOEXT)
        ZEND_TSRMLS_CACHE_UPDATE();
#endif

        return SUCCESS;
}
/* }}} */

/* {{{ PHP_MINFO_FUNCTION
 */
PHP_MINFO_FUNCTION(mydemoext)
{
        php_info_print_table_start();
        php_info_print_table_header(2, "mydemoext support", "enabled");
        php_info_print_table_end();
}
/* }}} */

/* {{{ arginfo
 */
ZEND_BEGIN_ARG_INFO(arginfo_hello, 0)
        ZEND_ARG_INFO(0, str)
ZEND_END_ARG_INFO()
/* }}} */

/* {{{ mydemoext_functions[]
 */
static const zend_function_entry mydemoext_functions[] = {
        PHP_FE(hello,           arginfo_hello)
        PHP_FE_END
};
/* }}} */

/* {{{ mydemoext_module_entry
 */
zend_module_entry mydemoext_module_entry = {
        STANDARD_MODULE_HEADER,
        "mydemoext",                                    /* Extension name */
        mydemoext_functions,                    /* zend_function_entry */
        NULL,                                                   /* PHP_MINIT - Module initialization */
        NULL,                                                   /* PHP_MSHUTDOWN - Module shutdown */
        PHP_RINIT(mydemoext),                   /* PHP_RINIT - Request initialization */
        NULL,                                                   /* PHP_RSHUTDOWN - Request shutdown */
        PHP_MINFO(mydemoext),                   /* PHP_MINFO - Module info */
        PHP_MYDEMOEXT_VERSION,          /* Version */
        STANDARD_MODULE_PROPERTIES
};
/* }}} */

#ifdef COMPILE_DL_MYDEMOEXT
# ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
# endif
ZEND_GET_MODULE(mydemoext)
#endif
$ yum install -y autoconf
# yum install -y m4

$ /home/www/install/php7.4.28/bin/phpize

$ ./configure --with-php-config=/home/www/install/php7.4.28/bin/php-config

$ make

$ ls modules/
mydemoext.la  mydemoext.so

$ make install
Installing shared extensions:     /home/www/install/php7.4.28/lib/php/extensions/debug-non-zts-20190902/

$ vim /home/www/install/php7.4.28/lib/php.ini
# 追加
extension=/home/www/install/php7.4.28/lib/php/extensions/debug-non-zts-20190902/mydemoext.so

$ php -m
[PHP Modules]
...
mydemoext
...

测试

$ vim test.php
<?php

echo hello('xchenhao') . "\n";

$ php test.php
Hello xchenhao

参考

  • https://www.zend.com/resources/writing-php-extensions Writing PHP Extensions
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:10:13  更:2022-02-26 11:11:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:51:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码