用VS开发PHP扩展,PHP调用C动态链接库
环境:
VS2013 https://blog.csdn.net/m0_37477061/article/details/83447773
Cygwin(http://www.cygwin.com/)
PHP5.3.29二进制文件(https://pan.baidu.com/s/1Fw13nu8hqhQn2Z_eDPAJow 提取码:p8io)
PHP5.3.29源码(https://pan.baidu.com/s/1RP8Q9GP9mJMDJBG-8ATO_A 提取码:b3cm)
phpstudy2016
步骤:
请确保上述软件或文件都已配置。
打开文件...\PHP-5.3.29-src\ext\ ext_skel_win32.php
修改cygwin的路径,如果是对的就不改。
打开cmd命令行,进入路径...\PHP-5.3.29-src\ext
,输入命令php ext_skel_win32.php --extname=test
生成扩展骨架,test即为php扩展名。该test文件夹位于...\PHP-5.3.29-src\ext
说明:下图为了展示成功的输出,故生成的扩展名为test_2,后续截图均使用test。
生成的扩展文件目录如下:
打开VS2013, “文件”--“新建”--“从现有代码创建项目”--“C++” ,项目文件位置选择上面的test文件夹,项目名称phptest,“生成动态链接库dll项目”。
接下来开始配置我们的项目:
-
项目解决方案配置改为Release
-
项目 - 项目属性 - C/C++ - 常规 - 附加包含目录 - 添加如下内容(...全为自己的真实路径)
...\PHP-5.3.29-src
...\PHP-5.3.29-src\main
...\PHP-5.3.29-src\TSRM
...\PHP-5.3.29-src\Zend
-
项目 - 项目属性 - C/C++ - 预处理器 - 预处理器定义 - 添加如下内容
ZEND_DEBUG=0
PHP_EXTENSION
PHP_WIN32
ZEND_WIN32
HAVE_TEST=1(test要改成你的扩展名称)
COMPILE_DL_TEST(同上)
ZTS(这一个变量加上是开启线程安全,不加是关闭线程安全)
-
项目 - 项目属性 - 链接器 - 输入- 添加如下内容(注意是二进制目录不是源码目录)
...\php-5.3.29-Win32-VC9-x86\dev\php5ts.lib
-
打开文件...\PHP-5.3.29-src\main\ config.w32.h,添加
#define PHP_COMPILER_ID "VC9"
,因为PHP-5.3.29是用VC9编译的,视自己情况修改(例如php5.6.9就是VC11编译的 )。
配置结束后点击生成解决方案,此时应该不会再报任何错误,接下来就是写我们的C函数。
需要两个文件分别为 test.c 和 phptest.h。
phptest.h种声明方法,该文件此处原为PHP_FUNCTION( confirm_test_compiled )
我将原本的测试函数改为test_echo,也就是上面说的 confirm_test_compiled 改为test_echo。
再新建一个方法名为hello。
test.c中与头文件保持一致,上为声明,下为方法的实现。
此时再重新生成解决方案,在...\test\Release目录下找到 php_test.dll ,将该文件复制到PHP的ext文件夹(不是源码也不是二进制而是phpstudy的php文件夹)下。
大功告成,在任意站点里新建php文件进行测试。
<?php
echo test_echo("<br>123<br>");
echo '<br><br><br>';
echo hello();
至此,可以开始PHP扩展开发了。