谁用PHP调用过so文件,我有开发需求
php吧
全部回复
仅看楼主
level 1
rerider 楼主
找了几个开发者都调用不了。本人需要制作微信小程序,界面很简单,需要后端调用我的so文件,将返回结果展示给前端用户。请有经验者联系,以免浪费你我时间。
2023年09月10日 15点09分 1
level 16
so里的方法参数和返回值是基础数据类型还是自定义类或者结构体?
2023年09月10日 17点09分 2
基础类型,int和char
2023年09月11日 00点09分
@rerider 那就简单了,拿C扩展包个壳就是了,随php-fpm启动一起加载,也不用担心反复加载浪费性能
2023年09月11日 01点09分
@SeaDrip_Poplar 这个活你接吗 私信你了
2023年09月11日 04点09分
@rerider 没收到私信,估计被度受吞了,你也可以先简单说下so是干啥的有多少方法,技术难度不大的话我直接把示例代码截图发这贴里你让身边的技术照着搞就行了
2023年09月11日 04点09分
level 1
rerider 楼主
刚刚被吞了
2023年09月11日 04点09分 4
level 11
so需要以php扩展形式被加载就可以被php直接调用,这就得以php源码进行编译重新生成so。
2023年09月11日 06点09分 5
你的意思是,把我生成so的源码用PHP重新写一遍然后重新生成一个so文件吗。那c语言就完全用不上了。
2023年09月11日 08点09分
@rerider 不是,把你的 的C写成PHP的扩展,编译的时候可能会用到PHP的源码(不是PHP代码,是PHP的C源码)
2023年09月14日 02点09分
2023年09月14日 04点09分
level 16
才回到家,不好意思让楼主久等了
看到您说这个.so文件是你自己写的,那其实你直接把它做成C扩展会更好一点,之前我还以为那个so是别人给你的,只能用C扩展包壳呢
看了您在5楼的回复,不是把功能用PHP实现,而是直接按PHP的C扩展的规则写一个PHP能直接识别并加载的.so,反正现在包壳也是要做C扩展,接下来我带点图简单跟楼主说下怎么做,估计会在这贴多回复几层,希望楼主不要介意
2023年09月11日 12点09分 6
level 16
首先你需要按自己服务器上正在使用的PHP版本下载它的源码,因为做PHP的C扩展开发这一步是少不了的,比如我用了个更简单粗暴的方法:从git上直接clone了php/php-src,方便我需要不同版本的时候直接checkout,但你针对自己版本专门下载也是一样的,最终文件夹里的目录应该类似这样
注意图里的ext文件夹,创建扩展的工作都是在这个目录下进行的
ext目录下应该有一个ext_skel.php脚本,或者更早的版本没有.php的后缀,请按您实际版本使用命令创建一个新的扩展,然后按图里标2的地方给出的命令进行第一次编译
2023年09月11日 12点09分 7
level 16
为了截上一楼的图,我用了新名字创建了一个扩展,写示例代码的扩展不是这个,下面图里有相关代码的差异请楼主自行无视[滑稽]
新创建的扩展第一次编译是为了确认您的开发环境没有问题,过了以后就可以着手开发了
这里需要提一点,返回值用整数或bool标识运行是否成功是C和C++的风格,但PHP里的方法一般不这样做,因为PHP允许返回值类型不唯一,像楼主的需求里完全可以设计成传入一个字符串参数,成功返回结果字符串,不成功返回null,拿到结果以后判断是否是空就可以知道运行是否成功了,当然如果返回值有报错信息(类似errno)的话也是可以的,这两种写法我都会给出
2023年09月11日 12点09分 8
level 16
首先打开后缀带_arginfo的头文件,按图里定义给PHP调用的方法的函数原型,请注意下图里两段定义的名字区别,带_c的是c_style,就是楼主原方法的风格,不带的是PHP风格,
C风格第二参数是引用方式传递,PHP风格只需要一个参数
2023年09月11日 12点09分 9
level 16
然后重头戏来了,打开与你创建的扩展同名的.c文件,开始实现功能
图里给出了两种方式,一种是仍然采用已经编译好的.so文件,只做C扩展加壳,另一种是直接定义功能函数,各自问题等下说,先看加壳的代码
请楼主按之前提过的命名风格选用自己喜欢的一款
2023年09月11日 12点09分 10
level 16
然后开几楼说一下直接实现和继续使用.so文件各自的利弊,先说直接实现的
目前创建的扩展里自带的源码文件是.c,如果楼主要直接实现,需要
a - 把C++代码用C重写一遍
或者
b - 改编译C++扩展,需要做的包括但不限于修改makefile,在config中更改代码文件等等,事情过多,请楼主自行查找资料,关键词“PHP扩展”和“C++”
2023年09月11日 12点09分 11
level 16
哦似乎只说了弊,利呢就是代码部分不用做别的修改了
而继续使用.so文件包壳的做法,上面图里楼主可以看到我定义了两个指针,剩下的事当然就是初始化和关服的时候释放了
还有注册扩展的时候入口也需要把这两个方法带上:
2023年09月11日 12点09分 12
第二个截图注册扩展的代码是写在哪个文件里呢,还是.c文件还是_arginfo.h?
2023年09月13日 14点09分
@rerider .c文件,自动生成的代码最下部找一下,应该可以找到,把init和shutdown参数用定义好的相应方法替换进去就好
2023年09月13日 14点09分
level 16
包壳法的坏处从代码里您可以看到,不仅代码比直接实现多一点,还有一点:为了图方便,我把.so的位置直接写了绝对路径,如果楼主想做成可配置的,代码路径那里需要自行做一些修改
2023年09月11日 12点09分 13
level 16
最后还有一点问题,加载.so里的方法的时候写上的方法名需要是实际导出的方法,如果使用了cpp而导出函数没有写extern "C"的话有可能方法名和你直接定义的不同,请先查看.so确认好
最后的最后,如果可以,楼主这一贴如果顺利解决了问题,也请不要删除,以便其他和您有同样需求的朋友们在未来如果找来了,可以找到一个参考,谢谢
2023年09月11日 12点09分 14
非常感谢大神这么详细的解答[真棒] ,我需要慢慢消化一下。 我初步的理解是,直接实现就是把c语言代码写在扩展里,PHP会编译c文件的代码,不会生成so或者即便生成了也不用去管这个so。而包壳法是PHP采用指针调用so文件里的函数。
2023年09月11日 14点09分
我找的工程师搞不定,发你私信了,加一下啊
2023年09月19日 04点09分
1