博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用C/C++编写PHP Extension
阅读量:6249 次
发布时间:2019-06-22

本文共 4253 字,大约阅读时间需要 14 分钟。

hot3.png

和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的扩展。步骤如下:

  1. 下载的源码以及VC11 build版本。

  2. 创建一个空的Win32工程,应用类型选择DLL。16142117_C4RB.png

  3. 添加头文件路径:

    F:\php_pack\php-5.6.10-srcF:\php_pack\php-5.6.10-src\ZendF:\php_pack\php-5.6.10-src\win32F:\php_pack\php-5.6.10-src\TSRMF:\php_pack\php-5.6.10-src\main
  4. 添加库路径:

    F:\php_pack\php-5.6.10-Win32-VC11-x86\dev
  5. 添加依赖:

    php5ts.lib
  6. 创建php_dbr.h

    #pragma once #include "zend_config.w32.h"    #include "php.h"
  7. 创建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);}
  8. 添加宏定义:

    ZEND_DEBUG=0ZTS=1ZEND_WIN32PHP_WIN32

    如果不添加,会出现很多错误。16142119_BP3e.png

  9. 现在build工程就可以生成php_dbr.dll了。

使用Dynamsoft Barcode SDK创建PHP Barcode Extension

来看一下如何通过PHP扩展调用第三方的DLL库:

  1. 添加的头文件和库文件路径到工程属性中

  2. 通过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:

 $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

16142119_ENIl.png

现在要把生成的DLL拷贝到{PHP root directory}\ext。如果你同时把DynamsoftBarcodeReaderx86.dll也拷贝到这个目录下,PHP会找不到这个DLL,报出如下错误:

16142119_rEiy.png

如何修复这个问题?你只要把第三方的DLL拷贝到PHP根目录下即可。现在再试一次:

16142120_UuX8.png

源码

转载于:https://my.oschina.net/yushulx/blog/467293

你可能感兴趣的文章
Eclipse代码中中文字显示很小的解决办法
查看>>
ArchLinux and LXDE and LXDM
查看>>
藏头诗琐谈
查看>>
Python分布式+云计算
查看>>
jconsole weblogic
查看>>
VIM快捷键:
查看>>
javascript Date format(js日期格式化)
查看>>
.net中获得Java中currentTimeMillis
查看>>
经典算法题每日演练——第一题 百钱买百鸡
查看>>
DomainUpDown与NumericUpDown
查看>>
POJ-1019 Number Sequence 二分查找
查看>>
ecshop模板<!-- TemplateBeginEditable name="左上角主区域" -->用法
查看>>
Spring中使用Quartz(一)
查看>>
C#教程之自己动手写映射第六节[封装列表]
查看>>
JQuery EasyUI datagrid 批量编辑和提交
查看>>
创建自己的awaitable类型
查看>>
Wildcard Matching
查看>>
一件小事测试各个搜索引擎:谷歌、bing、有道、百度、搜狗、360
查看>>
JAX-RS 2.0 草案发布,新特性一览
查看>>
OpenCV 2.4.3 发布,开源计算机视觉库
查看>>