用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的路径,如果是对的就不改。

用VS开发PHP扩展,PHP调用C动态链接库

打开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。

用VS开发PHP扩展,PHP调用C动态链接库

生成的扩展文件目录如下:

用VS开发PHP扩展,PHP调用C动态链接库

打开VS2013, “文件”--“新建”--“从现有代码创建项目”--“C++” ,项目文件位置选择上面的test文件夹,项目名称phptest,“生成动态链接库dll项目”。

用VS开发PHP扩展,PHP调用C动态链接库

接下来开始配置我们的项目:

  1. 项目解决方案配置改为Release

  2. 项目 - 项目属性 - 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

  3. 项目 - 项目属性 - C/C++ - 预处理器 - 预处理器定义 - 添加如下内容

    ZEND_DEBUG=0

    PHP_EXTENSION

    PHP_WIN32

    ZEND_WIN32

    HAVE_TEST=1(test要改成你的扩展名称)

    COMPILE_DL_TEST(同上)

    ZTS(这一个变量加上是开启线程安全,不加是关闭线程安全)

  4. 项目 - 项目属性 - 链接器 - 输入- 添加如下内容(注意是二进制目录不是源码目录)

    ...\php-5.3.29-Win32-VC9-x86\dev\php5ts.lib

  5. 打开文件...\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.cphptest.h

phptest.h种声明方法,该文件此处原为PHP_FUNCTION( confirm_test_compiled )

我将原本的测试函数改为test_echo,也就是上面说的 confirm_test_compiled 改为test_echo。

再新建一个方法名为hello。

用VS开发PHP扩展,PHP调用C动态链接库

test.c中与头文件保持一致,上为声明,下为方法的实现。

用VS开发PHP扩展,PHP调用C动态链接库
用VS开发PHP扩展,PHP调用C动态链接库

此时再重新生成解决方案,在...\test\Release目录下找到 php_test.dll ,将该文件复制到PHP的ext文件夹(不是源码也不是二进制而是phpstudy的php文件夹)下。

用VS开发PHP扩展,PHP调用C动态链接库

大功告成,在任意站点里新建php文件进行测试。

<?php 
echo test_echo("<br>123<br>");
echo ‘<br><br><br>‘;
echo hello();
用VS开发PHP扩展,PHP调用C动态链接库

至此,可以开始PHP扩展开发了。

用VS开发PHP扩展,PHP调用C动态链接库

上一篇:JVM之Jstat 常用操作记录


下一篇:Ajax