我用的是mac
1.去php官网https://www.php.net/ 下载最新版本的php源码
2.解压缩,tar zxvf ,cd到对应的目录
3.开始编译了
./configure --prefix=/Users/linsonggao/workspace/php-8.2.15
第三步我遇到了问题、提示缺少了iconv扩展
查资料用brew安装后,错误1:configure: error: Please specify the install prefix of iconv with --with-iconv=
装完之后依然报错,错误2:configure: error: Please reinstall the iconv library.
mac的brew安装的版本应该有问题不是最新的,也有可能是我镜像的问题下载不到最新的扩展、我试过重新下载其他版本的php源码包或者brew指定版本都没用、花了比较久的时间依然不行!!!?
最终的万能的解决方案去官方找一下最新的包、重新编译
http://ftp.gnu.org/pub/gnu/libiconv/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar -zxf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure && make && make install
完成之后再试一下成功了
/configure --prefix=/Users/linsonggao/workspace/php8215 \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/conf.d \
--enable-bcmath \
--with-curl=/usr/local/opt/curl \
--enable-filter \
--enable-fpm \
make clean; make; make install;
开始php扩展包开发
/Users/linsonggao/workspace/php8215/bin/php ext_skel.php --ext linsonggao --author sunct --std
4、编辑linsonggao文件夹下的linsonggao.c文件,此处参考一些其他教材也碰到了问题编辑不成功、估计是php版本的问题,我用的版本比较新、恶补了一下c语言的知识、然后这是我改的最终版本的c代码
修改c语言文件代码
/* linsonggao extension for PHP */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "php.h"
#include "ext/standard/info.h"
#include "php_linsonggao.h"
#include "linsonggao_arginfo.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
/* {{{ void test1() */
PHP_FUNCTION(test1)
{
ZEND_PARSE_PARAMETERS_NONE();
php_printf("The extension %s is loaded and working!\r\n", "linsonggao");
}
/* }}} */
/* {{{ string test2( [ string $var ] ) */
PHP_FUNCTION(linsonggao)
{
char *var = "linsonggao";
size_t var_len = sizeof("linsonggao") - 1;
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, "linsonggao Hello %s", var);
RETURN_STR(retval);
}
/* }}}*/
/* {{{ PHP_RINIT_FUNCTION */
PHP_RINIT_FUNCTION(linsonggao)
{
#if defined(ZTS) && defined(COMPILE_DL_LINSONGGAO)
ZEND_TSRMLS_CACHE_UPDATE();
#endif
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MINFO_FUNCTION */
PHP_MINFO_FUNCTION(linsonggao)
{
php_info_print_table_start();
php_info_print_table_header(2, "linsonggao support", "enabled");
php_info_print_table_end();
}
/* }}} */
/*声明ZEND函数块*/
/*ZEND 引擎通过zend_function_entry 结构数组把声明的导出函数引入内部*/
const zend_function_entry linsonggao_custom_functions[] = {
PHP_FE(linsonggao,NULL)
PHP_FE_END
/*必须以PHP_FE_END结尾*/
/*早期的php是以{NULL,NULL,NULL}结尾,现在ZEND把这个和宏绑定在一起了*/
/*
#define PHP_FE_END ZEND_FE_END
#define ZEND_FE_END { NULL, NULL, NULL, 0, 0 }
*/
};
/* {{{ linsonggao_module_entry */
zend_module_entry linsonggao_module_entry = {
STANDARD_MODULE_HEADER,
"linsonggao", /* Extension name */
linsonggao_custom_functions, /* zend_function_entry */
NULL, /* PHP_MINIT - Module initialization */
NULL, /* PHP_MSHUTDOWN - Module shutdown */
PHP_RINIT(linsonggao), /* PHP_RINIT - Request initialization */
NULL, /* PHP_RSHUTDOWN - Request shutdown */
PHP_MINFO(linsonggao), /* PHP_MINFO - Module info */
PHP_LINSONGGAO_VERSION, /* Version */
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_LINSONGGAO
# ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
# endif
ZEND_GET_MODULE(linsonggao)
#endif
5、编辑安装生成扩展:
在linsonggao文件夹下,运行/Users/linsonggao/workspace/php8215/bin/phpize(实际为phpize所在路径)
然后运行./configure --with-php-config=/Users/linsonggao/workspace/php8215/bin/php-config(实际为php-config所在路径)
make
make install
6、执行完后会显示扩展安装到了哪个路径下
然后修改php.ini增加扩展信息、/Users/linsonggao/workspace/php8215/bin/php -i|grep php.ini查看配置文件路径
extension=linsonggao.so
7、重启一下php-fpm,然后php -m 能看到linsonggao这个扩展了
9.写php代码,调用php扩展添加的方法
<?php
echo linsonggao("php是世界上最好的语言");
输出结果
求赞、收藏、加关注