文档章节

Windows上PHP扩展的实现,部署及应用

yushulx
 yushulx
发布于 2015/12/18 15:15
字数 769
阅读 68
收藏 4

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


© 著作权归作者所有

yushulx
粉丝 29
博文 107
码字总数 60955
作品 0
杭州
私信 提问
swoole/framework

SwooleFramework: PHP的高级开发框架 与其他Web框架不同,SwooleFramework是一个全功能的后端服务器框架。除了Web方面的应用之外,更广泛的后端程序中都可以使用。 内置PHP应用服务器,可脱离...

swoole
2017/02/05
0
0
osgi.net从入门到精通系列之一

osgi.net是一个动态的模块化框架。它向用户提供了模块化与插件化、面向服务构架和模块扩展支持等功能。该平台是OSGi联盟定义的服务平台规范移植到.NET的实现。 简介 尤埃开放服务平台是一个基...

wmsw
2018/11/07
0
0
使用 Phalanger 整合 PHP 和 .Net

Phalanger 是一种 PHP 语言编译器,也是针对 .NET 的 PHP 运行时。 它可以用于把 PHP web 项目编译成 .NET 字节码,并在 Windows 中使用 IIS 或者在 Linux 上使用 Mono 和 Apache 作为 ASP....

墙头草
2012/04/11
1K
14
MapGuide Open Source

MapGuide Open Source 是个基于 web 的平台,允许用户快速开发和部署 web 地图应用和地理空间 web 服务。MapGuide 有个交互式查看器,支持选项,属性,检测,地图提示和操作(缓冲区,测量等...

seismic
2014/03/11
610
0
nginx+redis +lua脚本实现nginx 302临时跳转

实现过程: nginx+redis +lua的环境,前一篇博文已经部署好 在服务器上安装好redis后,记得要安装php的redis扩展,由于开发语言是php,所以要安装redis的扩展,这样才能php程序操作redis, ph...

wjw555
2018/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

从0搭建自己的webpack开发环境(五)

往期回顾: 从0搭建自己的webpack开发环境(一) 从0搭建自己的webpack开发环境(二) 从0搭建自己的webpack开发环境(三) 从0搭建自己的webpack开发环境(四) 前四篇文章我们已经掌握了w...

前端优选
昨天
4
0
docker 构建php-fpm 7.2(swoole) 镜像

mkdir -p ~/mnt/docker/phpmkdir -p ~/mnt/docker/php#下载swoole-2.2.0.tgz安装包到software 下载地址:http://pecl.php.net/package/swoole/2.2.0#创建Dockerfilevim ~/docker/......

Jack088
昨天
3
0
简单工厂

定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象,不关心...

东风破2019
昨天
4
0
SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

Linux就该这么学
昨天
7
0
聊聊nacos的TcpSuperSenseProcessor

序 本文主要研究一下nacos的TcpSuperSenseProcessor TcpSuperSenseProcessor nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/TcpSuperSenseProcessor.java @Compon......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部