前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mac Centos下开发PHP的C扩展

Mac Centos下开发PHP的C扩展

原创
作者头像
无忧366
修改2021-09-16 11:36:41
1.2K0
修改2021-09-16 11:36:41
举报
文章被收录于专栏:Hello worldHello world

背景介绍

用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 install
sudo 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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 1.下载php原文件
  • 2.进入下载的php原文件
  • 3.在test文件夹中进行操作
    • (1).php_test.h 文件中声明函数
      • (2).修改config.m4文件,修改后要调用 phpize ./configure
        • (3).修改 test.c文件 (主函数文件)
        • 4.终端执行
          • 终端执行如下,查看到php.ini地址
            • 打开php.ini文件
              • 重启,在终端执行命令:
                • 检测扩展是否可用,在终端执行命令:
                  • 查看phpize路径
              • 在Centos上
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档