在 oss php sdk进行crc64校验

背景

  • 使用oss php sdk上传下载文件时为了确保数据的一致性,可以使用crc64校验,与使用md5相比,crc64可以便上传/下载边校验。oss是同时支持这两种校验的
  • 总所周知,php计算能力弱的特征,本文章还提供一种在php中嵌入c代码实现crc64校验算法,以大幅提升上传下载性能

使用php实现crc64检验算法

<?php
/**
* @return array
*/
function crc64Table()
{
    $crc64tab = [];
    // ECMA polynomial
    $poly64rev = (0xC96C5795 << 32) | 0xD7870F42;
    //printf("poly:%x\n", $poly64rev);
    // ISO polynomial
    // $poly64rev = (0xD8 << 56);
    for ($n = 0; $n < 256; $n++)
    {
        $crc = $n;
        for ($k = 0; $k < 8; $k++) {
            if ($crc & 1 === 1 ) {
                    $crc = ($crc >> 1) & ~(0x8 << 60) ^ $poly64rev;
            } else {
                $crc = ($crc >> 1) & ~(0x8 << 60);
            }
        }
        $crc64tab[$n] = $crc;
    }
    return $crc64tab;
}
/**
* @param string $string
* @param string $format
* @return mixed
* Formats:
*  crc64('php'); // afe4e823e7cef190
*  crc64('php', '0x%x'); // 0xafe4e823e7cef190
*  crc64('php', '0x%X'); // 0xAFE4E823E7CEF190
*  crc64('php', '%d'); // -5772233581471534704 signed int
*  crc64('php', '%u'); // 12674510492238016912 unsigned int
*/
function crc64 ($crc, $string)
{
    static $crc64tab;
    if ($crc64tab === null) {
        $crc64tab = crc64Table();
    }

    for ($i = 0; $i < strlen($string); $i++) {
        $crc = ~$crc;
        $crc = $crc64tab[($crc ^ ord($string[$i])) & 0xff] ^ (($crc >> 8) & ~(0xff << 56));
        $crc = ~$crc;
    }
    return $crc;
}
printf("%u\n", crc64(1, "12345678"));
?>

function crc64 ($crc, $string)支持边上传边校验, 但由于php是在不擅长做计算密集型的工作(如果这个也算的话),加上校验会拖慢上传/下载将近10倍,没有实际应用的价值。可以选用c实现算法在嵌入php中运行。

php嵌入c语言的方法

方法概述:用c语言实现crc64校验算法生成一个.so的动态库放到php可以调用的路径

  • 用C开发PHP扩展的时候如果用动态链接库的方式编译扩展模块,需要用到phpize. phpize -v 一下查看下有没有安装。
    没有安装phpize的话, ubutun下apt-get install php5-dev
  • 根据自己的php版本下载php源码(可以用php -v查看php版本), 例如你的php版本是5.4.12,要下载版本号为5.4.xx的php源码, 比如我的php版本为5.4.32, 以此版本为例。
  • 下载php源码
    wget http://museum.php.net/php5/php-5.4.32.tar.gz
  • 解压
    tar zxvf php-5.4.32.tar.gz
  • cd php-5.4.32/ext
    ./ext_skel --extname=crc64
  • cd crc64
    vim crc64.c
    在 const zend_function_entry crc64_functions[] = {中增加
    PHP_FE(crc64_sum, NULL)
    在PHP_FUNCTION(confirm_crc64_compiled)上面增加下面代码

    PHP_FUNCTION(crc64_sum)
    {
     char *data;
     int data_len;
     char *init_crc64;
     int init_crc64_len;
    
     char result[100];
    
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &init_crc64, &init_crc64_len, &data, &data_len) == FAILURE) {
          return;
      }
     crc64_init_once();
     crc64(init_crc64, data, result, data_len);
    
     RETURN_STRINGL(result, strlen(result), 1);
    }
    
  • 对php7来说, RETURN_STRINGL由三个参数改为两个参数, 如果你的是php7, 上句为 RETURN_STRINGL(result, strlen(result));
    vim ./php_crc64.h
    找到PHP_FUNCTION(confirm_crc64_compiled); 在上面添加一行
    PHP_FUNCTION(crc64_sum);
  • 把oss提供的c语言实现的crc64代码拷贝到当前目录下
    cp crc64_ecma.c ./
  • vim config.m4
    找到PHP_ARG_ENABLE这一行, 把这行及下面两行的注释去掉。dnl就是注释的意思,修改后如下:

    PHP_ARG_WITH(crc64, for crc64 support,
    Make sure that the comment is aligned:
    [  --with-crc64             Include crc64 support])
    找到PHP_NEW_EXTENSION这行,修改后如下:
    PHP_NEW_EXTENSION(crc64, crc64.c crc64_ecma.c, $ext_shared)
    

    phpize
    ./configure
    make
    sudo make install
    依次执行后可以检查一下, 这三个命令后会生成一个crc64.so文件并安装到 $extension_dir中,可以用 php -i | grep extension_dir 找到扩展目录。对于我这里就是/usr/lib64/php/modules目录, ll /usr/lib64/php/modules/crc64.so 果然在里面。

  • vim /etc/php.ini
    找到 ; Dynamic Extensions, 在下面添加一行:
    extension=crc64.so

    这样整个php嵌入c语言就完成了。使用php -m检验下成果, 发现crc64出现在模块列表中,这说明php嵌入c动态库成功。

  • 打开oss php sdk crc64校验的开关
    vim samples/Common.php
    找到$ossClient = new OssClient... 这行, 增加两个参数, 修改后如下:
    $ossClient = new OssClient(self::accessKeyId, self::accessKeySecret, self::endpoint, false, NULL, true);
    这样sample下的示例就会打开crc64校验进行上传或下载。
时间: 2024-10-27 07:53:49

在 oss php sdk进行crc64校验的相关文章

使用oss c sdk自定义上传和下载callback

       前段时间使用阿里云官网提供的OSS C SDK上传和下载数据,想在上传和下载过程中对数据进行一些简单的自定义预处理,看了一下oss c sdk的具体实现,大致了解如何通过自定义上传和下载的callback达到上述目的,这里做一个简单的分享.        OSS C SDK在上传和下载数据时使用了CURL进行通信,之前简单学习过CURL的一些知识,知道CURL提供了一系列Callback,在上传下载时对数据进行一些处理,大家感兴趣的话可以参考: http://curl.haxx.s

拥抱ES6——OSS JavaScript SDK开发手记

JavaScript作为当下最火的语言(之一),结合OSS能够创建出非常丰富的跨前后端的应用.现在,OSS正式推出JavaScript SDK,使用OSS的 前后端 同学 都 可以方便地使用. ES6 首先,什么是ES6? 其实ES6是最新版本的ECMAScript,也就是JavaScript标准. ECMAScript 6, also known as ECMAScript 2015, is the latest version of the ECMAScript standard. > ES

Windows下编译使用Aliyun OSS C SDK

Visual Studio(VS)是win平台下,编译运行C/C++程序的首选.微软发布的VS主要版本如下表: 名称 内部版本 发布日期 支持.NET Framework版本 Visual Studio 6.0 6.0 1998-06 - Visual Studio .NET 2002 7.0 2002-02-13 1.0 Visual Studio .NET 2003 7.1 2003-04-24 1.1 Visual Studio 2005 8.0 2005-11-07 2.0 Visual

oss php sdk+laravel搭建一个简单网站

背景 目前中小型网站最流行的还是采用php搭建自己的web服务器,一个web服务器都会做动静资源分离,静态资源流量小的话,静态文件可以统一放单独目录用域名独立访问,流量稍大的时候,可以直接托管到阿里云OSS上,需要静态资源时从oss拉取,对请求延时苛刻的还可以用CDN做缓存和加速. 目的 介绍如何如何在30分钟内搭建一个简单的web服务器,采用nignx+php-fpm+laravel+oss-php-sdk 框架 ,静态资源托管到阿里云oss上.实现通过浏览器展示一张图片. 简单的服务器框图

oss php sdk基于swoole的简单HTTP服务器实现

前言 最近听说有个东东重新定义了"世界上最好的语言",激动一查原来大名叫swoole, 你看下它的官方定义: PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询. Swoole内置了Http/WebSocket服务器端/客户端.Http2.0服务器端. Swoole2.0支持了类似Go语言的协程,可

Aliyun OSS Java SDK超时时间设置

Aliyun OSS Java SDK发送一个请求,有5个阶段: 阶段Ⅰ 从连接池中获取连接,如果使用的连接已经达到最大连接数,则等待直到有连接释放,或达到最大超时时间,抛出异常ConnectionPoolTimeoutException.如果设置了比较大最大连接数,但是并不想让连接池中真正占用很多连接,SDK会自动关闭闲置时间较长的连接. 最大连接数默认1024个,使用ClientConfiguration.setMaxConnections设置. 从连接池中获取默认不超时,可以通过Clien

Windows下编译使用Aliyun OSS PHP SDK

安装环境:Win7 64 + PHP 5.6 + OSS PHP SDK 2.0.6 安装PHP 1. 下载安装包.打开 http://windows.php.net/download/ ,从PHP 5.6 (5.6.22) -> VC11 x64 Thread Safe (2016-May-26 18:22:23) -> zip下载PHP安装包,下载到本地后的文件是php-5.6.22-Win32-VC11-x64.zip. 提示: 如果您的机器是32位,下载时请选择VC11 x86 Thr

Linux下使用Aliyun OSS C SDK

OSS C SDK依赖curl.apr.aprutil.mxml四个第三方库.基于OSS C SDK的应用,依赖于C SDK和四个第三方库,共五个库.四个第三方库和SDK的安装,请参考 OSS C SDK安装 . 本文中的示例程序,在附件oss-c-sdk-demo.tar.gz中.示例是个简单的OSS C SDK应用,您可以参考.引用或直接使用. C/C++程序,从源代码到执行,需要经过编译.链接.运行三个步骤.OSS C SDK应用亦是如此,下面分别对这三个步骤详细说明. 编译 编译,将源代

OSS Java SDK夯住(Hang)问题排查

夯住(Hang)是指程序仍在运行,卡在某个方法调用上,没有返回也没有异常抛出:卡住时间从几秒到几小时不等. Java程序发生Hang时,应该首先使用 jstack 把java进程的堆栈信息保存下来 ,供后继分析使用. 调用OSS Java SDK的程序Hang,有以下可能的情况及原因. 说明: jstack -l <pid> > js.txt可以把pid的堆栈信息保存到文件js.txt中.pid可以通过jps命令查找到. 抓包工具,Windows系统下推荐使用Wireshark.捕获筛选