Windows 및 Linux에서 PHP 바코드 QR 코드 읽기 확장 프로그램을 빌드하는 방법

PHP를 사용할 때 때때로 몇 가지 C++ 라이브러리를 통합해야 할 수도 있습니다. 이 기사는 Windows 및 Linux에서 Dynamsoft C++ Barcode SDK를 사용하여 PHP Barcode QR 코드 읽기 확장 프로그램을 구축하는 과정을 안내합니다.

다운로드



  • 윈도우의 PHP

  • php-sdk-binary-tools
    bisonre2c 와 같은 일부 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.hDBRx64.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=dbrphp.ini를 더합니다.

  • 생성된 php_dbr.dllphp/ext/ 폴더에 복사하고 DynamicPdfx64.dll , DynamsoftBarcodeReaderx64.dll , DynamsoftLicenseClientx64.dllvcomp110.dll를 PHP 루트 디렉터리에 복사합니다.



  • 리눅스
  • extension=dbr/etc/php/7.4/cli/php.ini를 더합니다.
  • 실행 make install .

  • PHP 바코드 QR 코드 리더 확장 테스트


  • A30-day FREE trial license를 신청하세요 .

  • 로컬 이미지에서 바코드 및 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

    좋은 웹페이지 즐겨찾기