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
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!