使用C/C++编写PHP Extension
来源:互联网 发布:本地mysql如何配host 编辑:程序博客网 时间:2024/06/05 07:45
和Python,JavaScript等高级语言一样,PHP也可以通过C/C++编写扩展功能。这里分享下如何构建一个简单的PHP扩展,以及如何调用第三方DLL库。
参考原文:Making PHP Barcode Extension with Dynamsoft Barcode SDK
使用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。
添加头文件路径:
12345F:\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
添加库路径:
1F:\php_pack\php-5.6.10-Win32-VC11-x86\dev
添加依赖:
1php5ts.lib
创建php_dbr.h:
1234#pragma once
#include "zend_config.w32.h"
#include "php.h"
创建php_dbr.cpp:
1234567891011121314151617181920212223#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
);
}
添加宏定义:
1234ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32
如果不添加,会出现很多错误。
现在build工程就可以生成php_dbr.dll了。
使用Dynamsoft Barcode SDK创建PHP Barcode Extension
来看一下如何通过PHP扩展调用第三方的DLL库:
添加Dynamsoft Barcode SDK的头文件和库文件路径到工程属性中
通过SDK的C/C++接口解码Barcode,并把结果转换成PHP可读数据:
#include "php_dbr.h"
#include "If_DBR.h"
#include "BarcodeFormat.h"
#include "BarcodeStructs.h"
#include "ErrorCode.h"
#ifdef _WIN64
#pragma comment(lib, "DBRx64.lib")
#else
#pragma comment(lib, "DBRx86.lib")
#endif
void
SetOptions(pReaderOptions pOption,
int
option_iMaxBarcodesNumPerPage,
int
option_llBarcodeFormat){
if
(option_llBarcodeFormat > 0)
pOption->llBarcodeFormat = option_llBarcodeFormat;
else
pOption->llBarcodeFormat = OneD;
if
(option_iMaxBarcodesNumPerPage > 0)
pOption->iMaxBarcodesNumPerPage = option_iMaxBarcodesNumPerPage;
else
pOption->iMaxBarcodesNumPerPage = INT_MAX;
}
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){
array_init(return_value);
// Get Barcode image path
char
* pFileName = NULL;
int
iLen = 0;
if
(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"s"
, &pFileName, &iLen) == FAILURE) {
RETURN_STRING(
"Invalid parameters"
,
true
);
}
// Dynamsoft Barcode Reader: init
int
option_iMaxBarcodesNumPerPage = -1;
int
option_llBarcodeFormat = -1;
pBarcodeResultArray pResults = NULL;
ReaderOptions option;
SetOptions(&option, option_iMaxBarcodesNumPerPage, option_llBarcodeFormat);
// decode barcode image file
int
ret = DBR_DecodeFile(
pFileName,
&option,
&pResults
);
if
(ret == DBR_OK)
{
int
count = pResults->iBarcodeCount;
pBarcodeResult* ppBarcodes = pResults->ppBarcodes;
pBarcodeResult tmp = NULL;
// loop all results
for
(
int
i = 0; i < count; i++)
{
tmp = ppBarcodes[i];
// convert format type to string
char
format[64];
sprintf
(format,
"%d"
, tmp->llFormat);
// (barcode type, result)
add_assoc_string(return_value, format, tmp->pBarcodeData, 1);
}
// Dynamsoft Barcode Reader: release memory
DBR_FreeBarcodeResults(&pResults);
}
else
{
RETURN_STRING(
"No Barcode detected"
,
true
);
}
}
现在我们需要写一个PHP的测试脚本,并把DLL部署到PHP中。
一个简单的PHP Barcode Reader:
<?php
$filename
=
"F:\\git\\Dynamsoft-Barcode-Reader\\Images\\AllSupportedBarcodeTypes.tif"
;
if
(
file_exists
(
$filename
)) {
echo
"Barcode file: $filename \n"
;
$resultArray
= DecodeBarcodeFile(
$filename
);
if
(
is_array
(
$resultArray
)) {
foreach
(
$resultArray
as
$key
=>
$value
) {
print
"format:$key, result: $value \n"
;
print
"*******************\n"
;
}
}
else
{
print
"$resultArray"
;
}
}
else
{
echo
"The file $filename does not exist"
;
}
?>
打开php.ini初始化文件,加入:
[Dynamsoft Barcode Reader]
extension=php_dbr.dll
现在要把生成的DLL拷贝到{PHP root directory}\ext。如果你同时把DynamsoftBarcodeReaderx86.dll也拷贝到这个目录下,PHP会找不到这个DLL,报出如下错误:
如何修复这个问题?你只要把第三方的DLL拷贝到PHP根目录下即可。现在再试一次:
源码
https://github.com/yushulx/Dynamsoft-Barcode-Reader/tree/master/samples/PHP
- 使用C/C++编写PHP Extension
- php C extension扩展
- 为python编写c/c++ 的extension
- PHP Extension 开发(C语言版本)
- C#Extension Methods 扩展方法使用
- 编写php的extension实例
- 使用C语言编写PHP 5.5.4的扩展函数
- 使用C编写shellcode
- 用Gdb+Nm调试Php C Extension程序
- 用gdb+nm调试php c extension程序
- 用gdb+nm调试php c extension程序
- 用gdb+nm调试php c extension程序
- [转]用gdb+nm调试php c extension程序
- 编写PHP的C扩展
- Objective-c - 延展:extension
- Objective-C Extension用法
- 使用Delphi 编写Python Extension
- 使用Delphi 编写Python Extension
- 直接插入排序,折半插入排序,2-路插入排序,希尔排序
- Android的5个进程等级
- 黑马程序员--基本数据类型
- Hash树
- 44444
- 使用C/C++编写PHP Extension
- GRE词汇记忆捷径
- 阿里云服务器cpu连续n天使用率为100%问题解决方案!
- 2232
- mac 启动php-fpm
- STL学习笔记之容器--优先队列
- 8种Nosql数据库系统对比
- selenium学习之路
- Vmware vSphere 5.0系列教程之六 虚拟机及主机配置文件的创建和模板部署