Windows 및 Linux에서 PHP 바코드 QR 코드 읽기 확장 프로그램을 빌드하는 방법
다운로드
윈도우의 PHP
php-sdk-binary-tools
bison
및 re2c
와 같은 일부 Windows용 빌드 필수 바이너리를 포함합니다.PHP 7.4 source code
소스 코드를 사용하여 확장을 정적으로 빌드할 수 있습니다.
PHP 7.4
Windows용 사전 빌드된 PHP 7.4.
Development package (SDK to develop PHP extensions)
사전 빌드된 바이너리로 PHP 확장을 빌드하는 데 사용되는 포함
phpize
.리눅스의 PHP
php7.4-dev php7.4 libxml2-dev
Dynamsoft C++ Barcode Reader v9.2
C++ 바코드 SDK에는 Windows 및 Linux용 공유 라이브러리가 포함되어 있습니다.
비주얼 C++ 컴파일러
PHP online tutorial 에 따르면 지원되는 Visual C++ 컴파일러는 다음과 같습니다.
Visual C++ 14.0 (Visual Studio 2015) for PHP 7.0 or PHP 7.1.
Visual C++ 15.0 (Visual Studio 2017) for PHP 7.2, PHP 7.3 or PHP 7.4.
Visual C++ 16.0 (Visual Studio 2019) for master.
Windows에
Visual Studio 2022
만 있는 경우 Visual Studio Installer
에서 해당 Visual C++ 빌드 도구를 설치해야 합니다.그런 다음
vcvars64.bat
파일을 찾아 실행하여 환경 변수를 설정합니다.예를 들어
여기서는 PHP 7.4를 사용하므로
Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat
를 통해 cmd.exe
를 실행해야 합니다.참고: 일치하는 Visual C++ 컴파일러 버전을 사용하는 것이 중요합니다. 그렇지 않으면 생성된 확장을 PHP에서 로드할 수 없습니다.
PHP 바코드 QR 코드 확장 프로젝트 만들기
다음 명령을 사용하여 PHP 확장 프로젝트를 스캐폴딩합니다.
cd php-7.4.30-src/ext
php ext_skel.php --ext dbr
cd dbr
그런 다음
DynamsoftCommon.h
, DynamsoftBarcodeReader.h
및 DBRx64.lib
를 프로젝트 디렉토리에 복사합니다.dbr.c
에서 확장 기능 DBRInitLicense()
및 DecodeBarcodeFile()
를 구현합니다.#include "DynamsoftBarcodeReader.h"
static void *hBarcode = NULL;
#define CHECK_DBR() \
if (!hBarcode) \
{ \
hBarcode = DBR_CreateInstance(); \
const char* versionInfo = DBR_GetVersion(); \
printf("Dynamsoft Barcode Reader %s\n", versionInfo); \
}
PHP_FUNCTION(DBRInitLicense)
{
CHECK_DBR();
char *pszLicense;
size_t iLen;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &pszLicense, &iLen) == FAILURE)
{
RETURN_STRING("Invalid parameters");
}
char errorMsgBuffer[512];
// Click https://www.dynamsoft.com/customer/license/trialLicense/?product=dbr to get a trial license.
DBR_InitLicense(pszLicense, errorMsgBuffer, 512);
printf("DBR_InitLicense: %s\n", errorMsgBuffer);
}
PHP_FUNCTION(DecodeBarcodeFile)
{
CHECK_DBR();
array_init(return_value);
// Get Barcode image path
char *pFileName;
long barcodeType = 0;
size_t iLen;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &pFileName, &iLen, &barcodeType) == FAILURE)
{
RETURN_STRING("Invalid parameters");
}
if (hBarcode)
{
int iMaxCount = 0x7FFFFFFF;
TextResultArray *pResults = NULL;
// Update DBR params
PublicRuntimeSettings pSettings = {0};
DBR_GetRuntimeSettings(hBarcode, &pSettings);
pSettings.barcodeFormatIds = barcodeType;
char szErrorMsgBuffer[256];
DBR_UpdateRuntimeSettings(hBarcode, &pSettings, szErrorMsgBuffer, 256);
// Barcode detection
int ret = DBR_DecodeFile(hBarcode, pFileName, "");
DBR_GetAllTextResults(hBarcode, &pResults);
if (pResults)
{
int count = pResults->resultsCount;
int i = 0;
char strLocalization[128];
for (; i < count; i++)
{
zval tmp_array;
array_init(&tmp_array);
add_next_index_string(&tmp_array, pResults->results[i]->barcodeFormatString);
add_next_index_string(&tmp_array, pResults->results[i]->barcodeText);
add_next_index_stringl(&tmp_array, pResults->results[i]->barcodeBytes, pResults->results[i]->barcodeBytesLength);
memset(strLocalization, 0, 128);
sprintf(strLocalization, "[(%d,%d),(%d,%d),(%d,%d),(%d,%d)]", \
pResults->results[i]->localizationResult->x1, pResults->results[i]->localizationResult->y1, \
pResults->results[i]->localizationResult->x2, pResults->results[i]->localizationResult->y2, \
pResults->results[i]->localizationResult->x3, pResults->results[i]->localizationResult->y3, \
pResults->results[i]->localizationResult->x4, pResults->results[i]->localizationResult->y4);
add_next_index_string(&tmp_array, strLocalization);
add_next_index_zval(return_value, &tmp_array);
}
DBR_FreeTextResults(&pResults);
}
}
}
static const zend_function_entry dbr_functions[] = {
PHP_FE(DBRInitLicense, NULL)
PHP_FE(DecodeBarcodeFile, NULL)
PHP_FE_END
};
Windows용 config.w32
DBRx64.lib
를 연결하려면 LDFLAGS
파일에서 linker options으로 config.w32
를 지정합니다.ARG_ENABLE('dbr', 'dbr support', 'no');
if (PHP_DBR != 'no') {
lib_path = "ext\\dbr";
ADD_FLAG("LDFLAGS", '/libpath:"' + lib_path + '" /DYNAMICBASE "DBRx64.lib"');
AC_DEFINE('HAVE_DBR', 1, 'dbr support enabled');
EXTENSION('dbr', 'dbr.c', null, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
}
리눅스용 config.m4
Linux에서 공유 라이브러리를 연결하기 위해
config.m4
파일을 편집합니다.PHP_ARG_ENABLE([dbr],
[whether to enable dbr support],
[AS_HELP_STRING([--enable-dbr],
[Enable dbr support])],
[no])
if test "$PHP_DBR" != "no"; then
LIBNAME=DynamsoftBarcodeReader
LIBSYMBOL=DBR_CreateInstance
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, /usr/lib, DBR_SHARED_LIBADD)
AC_DEFINE(HAVE_DBRLIB,1,[ ])
],[
AC_MSG_ERROR([wrong dbr lib version or lib not found])
],[
-L$DBR_DIR/$PHP_LIBDIR -lm
])
PHP_SUBST(DBR_SHARED_LIBADD)
AC_DEFINE(HAVE_DBR, 1, [ Have dbr support ])
PHP_NEW_EXTENSION(dbr, dbr.c, $ext_shared)
fi
그런 다음
libDynamicPdf.so
, libDynamsoftBarcodeReader.so
, libDynamsoftLicenseClient.so
를 /usr/bin
디렉토리에 복사합니다.PHP 확장 빌드 및 설치 단계
확장을 빌드하는 방법에는 두 가지가 있습니다. 하나는 소스 코드를 사용하는 것이고 다른 하나는 미리 빌드된 바이너리를 사용하는 것입니다.
소스 코드에서 PHP 확장 빌드
윈도우
cd php-7.4.30-src
buildconf
configure --disable-all --enable-cli --enable-dbr
nmake
리눅스
cd php-7.4.30-src
./buildconf
./configure --disable-all --enable-cli --enable-dbr
make
기본적으로 확장은 정적으로 연결됩니다. 공유 라이브러리를 빌드하기 위해 다음 행을 수정할 수 있습니다.
- configure --disable-all --enable-cli --enable-dbr
+ configure --disable-all --enable-cli --enable-dbr=shared
phpize로 PHP 확장 빌드
윈도우
cd php-7.4.30-src/ext/dbr
phpize
configure --enable-dbr
nmake
리눅스
cd php-7.4.30-src/ext/dbr
phpize
./configure --enable-dbr
make
*.dll 및 *.so 파일을 사용하여 PHP 확장 설치
윈도우
extension=dbr
에 php.ini
를 더합니다. 생성된
php_dbr.dll
를 php/ext/
폴더에 복사하고 DynamicPdfx64.dll
, DynamsoftBarcodeReaderx64.dll
, DynamsoftLicenseClientx64.dll
및 vcomp110.dll
를 PHP 루트 디렉터리에 복사합니다.리눅스
extension=dbr
에 /etc/php/7.4/cli/php.ini
를 더합니다. make install
. PHP 바코드 QR 코드 리더 확장 테스트
로컬 이미지에서 바코드 및 QR 코드를 읽는 PHP 스크립트
reader.php
를 생성합니다.<?php
$filename = "AllSupportedBarcodeTypes.tif";
if (file_exists($filename)) {
echo "Barcode file: $filename \n";
// Get license key from https://www.dynamsoft.com/customer/license/trialLicense/?product=dbr
DBRInitLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ==");
//Best coverage settings
DBRInitRuntimeSettingsWithString("{\"ImageParameter\":{\"Name\":\"BestCoverage\",\"DeblurLevel\":9,\"ExpectedBarcodesCount\":512,\"ScaleDownThreshold\":100000,\"LocalizationModes\":[{\"Mode\":\"LM_CONNECTED_BLOCKS\"},{\"Mode\":\"LM_SCAN_DIRECTLY\"},{\"Mode\":\"LM_STATISTICS\"},{\"Mode\":\"LM_LINES\"},{\"Mode\":\"LM_STATISTICS_MARKS\"}],\"GrayscaleTransformationModes\":[{\"Mode\":\"GTM_ORIGINAL\"},{\"Mode\":\"GTM_INVERTED\"}]}}");
$resultArray = DecodeBarcodeFile($filename, 0x3FF | 0x2000000 | 0x4000000 | 0x8000000 | 0x10000000); // 1D, PDF417, QRCODE, DataMatrix, Aztec Code
if (is_array($resultArray)) {
$resultCount = count($resultArray);
echo "Total count: $resultCount\n";
for ($i = 0; $i < $resultCount; $i++) {
$result = $resultArray[$i];
echo "Barcode format: $result[0], ";
echo "value: $result[1], ";
echo "raw: ", bin2hex($result[2]), "\n";
echo "Localization : ", $result[3], "\n";
}
} else {
echo "$resultArray[0]";
}
} else {
echo "The file $filename does not exist";
}
?>
터미널에서 PHP 스크립트를 실행합니다.
php reader.php
소스 코드
https://github.com/yushulx/php-laravel-barcode-qr-reader/tree/main/ext/dbr
Reference
이 문제에 관하여(Windows 및 Linux에서 PHP 바코드 QR 코드 읽기 확장 프로그램을 빌드하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yushulx/how-to-build-php-barcode-qr-code-reading-extension-on-windows-and-linux-5bc2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)