php官网源码编译、以及php扩展开发

本文讲述了作者在Mac上安装PHP时遇到iconv扩展缺失的问题,通过下载GNUlibiconv源码编译并解决编译错误,最后成功创建并安装自定义PHP扩展的过程。
摘要由CSDN通过智能技术生成


我用的是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是世界上最好的语言");

输出结果
在这里插入图片描述
求赞、收藏、加关注

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兰博lamb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值