Windows上PHP扩展的实现,部署及应用
PHP对扩展的编写要求非常严格。如果没有按照官方文档,使用对应的PHP版本,PHP源码版本,以及Visual Studio版本,即使能够在Windows上成功编译DLL,也会因为版本不匹配报错,从而无法运行。之前只写了如何编写扩展,这里会分享下如何使用Nginx+PHP+DBR(Dynamsoft Barcode Reader)来搭建一个简单的Web条形码应用。
参考原文:How to Create a Web Barcode Reader App with PHP and Nginx
作者:Xiao Ling
翻译:yushulx
软件下载
步骤1:PHP Barcode扩展实现
使用Dynamsoft Barcode SDK来快速创建一个PHP扩展php_dbr.dll。具体步骤可以参考:使用C/C++编写PHP Extension。
步骤2:PHP扩展部署和环境配置
把生成的php_dbr.dll拷贝到%PHP%\ext中。
把DynamsoftBarcodeReaderx86.dll拷贝到%PHP%根目录下。
打开%php%\php.ini文件添加扩展描述:
extension=php_dbr.dll
如果有文件上传的需求,可以修改一下最大文件上传的尺寸:
upload_max_filesize=20M
步骤3:如何在Nginx中配置PHP
为了让Nginx支持PHP,打开%nginx%\conf\nginx.conf添加:
location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME <Your Web App Folder>/$fastcgi_script_name; include fastcgi_params; }
如果上传文件尺寸太大,会出现下面的错误:
nginx 413 Request Entity Too Large
这个时候需要修改Nginx配置:
client_max_body_size 50M;
步骤4:Web条形码应用
创建index.php:
<!DOCTYPE html> <html> <head> <title>Dynamsoft PHP Barcode Reader</title> <script src="jquery-1.11.3.min.js"></script> <script src="tiff.min.js"></script> </head> <body> <H1>Dynamsoft PHP Barcode Reader</H1> <form action="dbr.php" method="post" enctype="multipart/form-data"> Select barcode image: <input type="file" name="readBarcode" id="readBarcode" accept="image/*"><br> <input type="submit" value="Read Barcode" name="submit"> </form> <div id="tiff"></div> <div id='image'></div> <script> function reset() { $("#image").empty(); $("#tiff").empty(); } var input = document.querySelector('input[type=file]'); input.onchange = function() { reset(); var file = input.files[0]; var fileReader = new FileReader(); // get file extension var extension = file.name.split('.').pop().toLowerCase(); var isTiff = false; if (extension == "tif" || extension == "tiff") { isTiff = true; } fileReader.onload = function(e) { if (isTiff) { console.debug("Parsing TIFF image..."); //initialize with 100MB for large files Tiff.initialize({ TOTAL_MEMORY: 100000000 }); var tiff = new Tiff({ buffer: e.target.result }); var tiffCanvas = tiff.toCanvas(); $(tiffCanvas).css({ "max-width": "800px", "width": "100%", "height": "auto", "display": "block", "padding-top": "10px" }).addClass("TiffPreview"); $("#tiff").append(tiffCanvas); } else { var dataURL = e.target.result, img = new Image(); img.src = dataURL; $("#image").append(img); } } if (isTiff) { fileReader.readAsArrayBuffer(file); } else fileReader.readAsDataURL(file); } </script> </body> </html>
为了支持tiff文件的加载显示,我们可以使用tiff js library.。
创建dbr.php用于接收上传文件,并且调用PHP条形码扩展接口来解码:
<?php // create absolute file path function file_build_path(...$segments) { return join(DIRECTORY_SEPARATOR, $segments); } $file = basename($_FILES["readBarcode"]["name"]); echo "<p>$file</p>"; if ($file != NULL && $file != "") { // get current working directory $root = getcwd(); // tmp dir for receiving uploaded barcode images $tmpDir = "uploads/"; if (!file_exists($tmpDir)) { mkdir($tmpDir); } $target_file = $tmpDir . basename($_FILES["readBarcode"]["name"]); $isSuccessful = true; $fileType = pathinfo($target_file,PATHINFO_EXTENSION); if (!$isSuccessful) { echo "Fail to read barcode"; } else { if (move_uploaded_file($_FILES["readBarcode"]["tmp_name"], $target_file)) { // dynamsoft barcode reader $path = file_build_path($root, $target_file); /* * Description: * array DecodeBarcodeFile( string $filename , bool $isNativeOutput [, bool $isLogOn ] ) * * Return Values: * If barcode detected, $array[0] is an array. */ $resultArray = DecodeBarcodeFile($path, false); if (is_array($resultArray[0])) { $resultCount = count($resultArray); echo "Total count: $resultCount\n"; for($i = 0; $i < $resultCount ; $i++) { $result = $resultArray[$i]; echo "<p>Barcode format: $result[0], value: $result[1]</p>"; } } else { echo "<p>$resultArray[0]</p>"; } // delete the uploaded barcode image unlink($path); } else { echo "Fail to read barcode."; } } } ?>
运行php-cgi:
%php%\php-cgi.exe -b 127.0.0.1:9000 -c %php%\php.ini
运行Nginx:
%nginx%\nginx.exe
打开localhost:8080/index.php
:
做测试:
源码
https://github.com/dynamsoftsamples/php-barcode-reader