Table of Contents
使用Dynamsoft Barcode SDK创建PHP Barcode Extension
源码
Home Backend Development PHP Tutorial 使用C/C++编写PHP Extension

使用C/C++编写PHP Extension

Jun 23, 2016 pm 01:32 PM

和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。

添加头文件路径:

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
Copy after login

添加库路径:

F:\php_pack\php-5.6.10-Win32-VC11-x86\dev
Copy after login

添加依赖:

php5ts.lib
Copy after login

创建php_dbr.h

#pragma once #include "zend_config.w32.h"    #include "php.h"
Copy after login

创建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);}
Copy after login

添加宏定义:

ZEND_DEBUG=0ZTS=1ZEND_WIN32PHP_WIN32
Copy after login

如果不添加,会出现很多错误。

现在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);    } }
Copy after login

现在我们需要写一个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";} ?>
Copy after login

打开php.ini初始化文件,加入:

[Dynamsoft Barcode Reader]extension=php_dbr.dll
Copy after login

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

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

源码

https://github.com/yushulx/Dynamsoft-Barcode-Reader/tree/master/samples/PHP


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How does session hijacking work and how can you mitigate it in PHP? How does session hijacking work and how can you mitigate it in PHP? Apr 06, 2025 am 12:02 AM

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How to debug CLI mode in PHPStorm? How to debug CLI mode in PHPStorm? Apr 01, 2025 pm 02:57 PM

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

Describe the SOLID principles and how they apply to PHP development. Describe the SOLID principles and how they apply to PHP development. Apr 03, 2025 am 12:04 AM

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to automatically set permissions of unixsocket after system restart? How to automatically set permissions of unixsocket after system restart? Mar 31, 2025 pm 11:54 PM

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

Framework Security Features: Protecting against vulnerabilities. Framework Security Features: Protecting against vulnerabilities. Mar 28, 2025 pm 05:11 PM

Article discusses essential security features in frameworks to protect against vulnerabilities, including input validation, authentication, and regular updates.

See all articles