Mac Centos下开发PHP的C扩展

2021-09-16 11:36:41 浏览数 (1)

背景介绍

用C语言写了一个库,在OC上能直接调用,在Android上打包成.so文件后也可以直接用,在PHP上想用,就要做成一个C扩展,这样一份算法就可以开开心心地在iOS、Android、H5上使用了

1.下载php原文件

http://php.net/downloads.php

2.进入下载的php原文件

进入ext文件夹

代码语言:javascript复制
cd ext

生成文件

代码语言:javascript复制
sudo ./ext_skel.php --ext test

进入生成的test文件夹

代码语言:javascript复制
cd test

设置权限

代码语言:javascript复制
sudo chmod 777 config.m4  php_test.h  test.c

3.在test文件夹中进行操作

(1).php_test.h 文件中声明函数

PHP_FUNCTION(test_add);

(2).修改config.m4文件,修改后要调用 phpize ./configure

删除dnl放开注释   __WITH 是引用的外部库文件又引用了其他链接库。 如果是引用单一的一个so文件,放开 __ENABLE注释

代码语言:javascript复制
dnl PHP_ARG_WITH([test],
dnl   [for test support],
dnl   [AS_HELP_STRING([--with-test],
dnl    [Include test support])])

代码语言:javascript复制
PHP_ARG_ENABLE([hello],
  [whether to enable hello support],
  [AS_HELP_STRING([--enable-hello],
    [Enable hello support])],
  [no])

(3).修改 test.c文件 (主函数文件)

  • 函数声明
代码语言:javascript复制
static const zend_function_entry test_functions[] = {
     PHP_FE(test_test1,     arginfo_test_test1)
     PHP_FE(test_test2,     arginfo_test_test2)
    PHP_FE(test_add,NULL)     //添加函数声明
    PHP_FE_END   
};
  • 函数实现
代码语言:javascript复制
PHP_FUNCTION(test_add)
{
long a;
long b;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a,&b) == FAILURE) {
 return;
}
long result = a b;
RETURN_LONG(result);
}

4.终端执行

代码语言:javascript复制
phpize
代码语言:javascript复制
./configure  
sudo make   
make test  
sudo make install
sudo make installsudo make install

如果./configure报如下错误,安装GCC软件套件

configure: error: no acceptable C compiler found in $PATH

代码语言:javascript复制
yum install gcc

终端执行如下,查看到php.ini地址

代码语言:javascript复制
php -i | grep php.ini
php.ini地址php.ini地址

打开php.ini文件

代码语言:javascript复制
vim /usr/local/etc/php/7.2/php.ini

extension_dir = 执行sudo make install命令之后的地址

extension=php扩展名称.so

代码语言:javascript复制
extension_dir =  /usr/local/Cellar/php@7.2/7.2.16/bin/20170718/
extension=test.so

重启,在终端执行命令:

代码语言:javascript复制
sudo /usr/sbin/apachectl restart

检测扩展是否可用,在终端执行命令:

代码语言:javascript复制
php -r 'echo tes_tadd(1,2);'

在Centos上

代码语言:javascript复制
phpize
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.

查看phpize路径

代码语言:javascript复制
which phpize

/usr/bin/phpize

代码语言:javascript复制
/usr/bin/phpize
代码语言:javascript复制
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.

没安装 php-devel 这个扩展包。phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,phpize 是属于php-devel的内容,

代码语言:javascript复制
php -v
PHP 7.0.32 (cli) (built: Sep 15 2018 07:54:46) ( NTS )
Copyright (c) 1997-2017 The PHP Group
代码语言:javascript复制
yum install php70w-devel

./configure报错,错误主要是没有C编译器.

代码语言:javascript复制
configure: error: no acceptable C compiler found in $PATH

安装C编译器:

代码语言:javascript复制
yum -y install gcc

./configure成功

sudo make报错,是因为在gcc中直接在for循环中初始化了增量,这语法在gcc中是错误的,必须先先定义i变量:

代码语言:javascript复制
'for' loop initial declarations are only allowed in C99 mode
     for(int i = (int) strlen(string); i >= len; i--){

把int 放到外边

代码语言:javascript复制
sudo make install
Installing shared extensions:     /usr/lib64/php/modules/

打开php.ini,末尾添加

代码语言:javascript复制
extension_dir =  /usr/lib64/php/modules/
extension=test.so

如果出现在命令行打印可以输出,但是在laravel里调用不到函数,我的做法是重启服务器,重新从phpize走一遍,还有ext的权限

参考文章

https://www.jianshu.com/p/3a542418d968

https://www.cnblogs.com/bugchao/p/9051859.html

https://segmentfault.com/a/1190000007575322

0 人点赞