和Python,JavaScript等高级语言一样,PHP也可以通过C/C++编写扩展功能。这里分享下如何构建一个简单的PHP扩展,以及如何调用第三方DLL库。
使用Visual Studio 2012构建PHP扩展
Windows PHP的安装包本身不包涵头文件,所以要构建PHP扩展,必须下载PHP的源码。在Windows上,要编译PHP,以及构建PHP扩展都必须使用对应的Visual Studio,不然会出现大量的错误。在这里我们使用Visual Studio 2012去构建PHP 5.6的扩展。步骤如下:
下载PHP 5.6的源码以及VC11 build版本。
创建一个空的Win32工程,应用类型选择DLL。
添加头文件路径:F:\php_pack\php-5.6.10-src
F:\php_pack\php-5.6.10-src\Zend
F:\php_pack\php-5.6.10-src\win32
F:\php_pack\php-5.6.10-src\TSRM
F:\php_pack\php-5.6.10-src\main
添加库路径:F:\php_pack\php-5.6.10-Win32-VC11-x86\dev
添加依赖:php5ts.lib
创建php_dbr.h:#pragma once
#include "zend_config.w32.h"
#include "php.h"
创建php_dbr.cpp:#include "php_dbr.h"
ZEND_FUNCTION(DecodeBarcodeFile);
zend_function_entry CustomExtModule_functions[] = {
ZEND_FE(DecodeBarcodeFile, NULL)
{NULL, NULL, NULL}
};
zend_module_entry CustomExtModule_module_entry = {
STANDARD_MODULE_HEADER,
"Dynamsoft Barcode Reader",
CustomExtModule_functions,
NULL, NULL, NULL, NULL, NULL,
NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(CustomExtModule)
ZEND_FUNCTION(DecodeBarcodeFile){
RETURN_STRING("No Barcode detected", true);
}
添加宏定义:ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32
如果不添加,会出现很多错误。
现在build工程就可以生成php_dbr.dll了。
使用Dynamsoft Barcode SDK创建PHP Barcode Extension
来看一下如何通过PHP扩展调用第三方的DLL库:
通过SDK的C/C++接口解码Barcode,并把结果转换成PHP可读数据:
现在我们需要写一个PHP的测试脚本,并把DLL部署到PHP中。
一个简单的PHP Barcode Reader:
打开php.ini初始化文件,加入:
现在要把生成的DLL拷贝到{PHP root directory}\ext。如果你同时把DynamsoftBarcodeReaderx86.dll也拷贝到这个目录下,PHP会找不到这个DLL,报出如下错误:
如何修复这个问题?你只要把第三方的DLL拷贝到PHP根目录下即可。现在再试一次:
源码