在 oss php sdk进行crc64校验

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介:

背景

  • 使用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校验进行上传或下载。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
8月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之如何使用PHP SDK调用函数并在请求体(body)中传递字符串
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
9月前
|
JSON 前端开发 开发工具
对象存储oss使用问题之OSS文件下载中CRC64校验如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
654 0
|
PHP 开发工具
阿里云OpenAPI的PHP SDK
阿里云OpenAPI的PHP SDK
368 3
|
机器学习/深度学习 人工智能 PHP
百度AI开发平台图像增强与特效API-SDK接口PHP实战记录
百度AI开发平台图像增强与特效API-SDK接口PHP实战记录
174 0
百度AI开发平台图像增强与特效API-SDK接口PHP实战记录
|
PHP 开发工具 计算机视觉
PHP SDK百度人脸识别遇见的坑,BASE64识别程度高但加载慢;URL加载快,但总image download fail
PHP SDK百度人脸识别遇见的坑,BASE64识别程度高但加载慢;URL加载快,但总image download fail
150 0
|
Java 测试技术 API
工银e生活开发脱坑日志(9)JAVA版的SDK自动生成msgId,PHP如何生成消息通讯唯一编号msgId
工银e生活开发脱坑日志(9)JAVA版的SDK自动生成msgId,PHP如何生成消息通讯唯一编号msgId
200 0
|
存储 PHP 开发工具
PHP:将本地文件上传到阿里云OSS存储
PHP:将本地文件上传到阿里云OSS存储
1311 0
|
小程序 JavaScript 前端开发
微信小程序:阿里云OSS直传实践-PHP实现服务端签名
微信小程序:阿里云OSS直传实践-PHP实现服务端签名
1186 0
微信小程序:阿里云OSS直传实践-PHP实现服务端签名
|
网络协议 NoSQL 应用服务中间件
php OSS 文件读取和写入文件,workerman 生成临时文件并输出浏览器下载
php OSS 文件读取和写入文件,workerman 生成临时文件并输出浏览器下载
576 0
|
Linux API PHP
阿里云PHP SDK 使用方法
阿里云PHP SDK 使用方法
阿里云PHP SDK 使用方法

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
  • 4
    阿里云对象存储OSS收费标准,存储、流量和请求等多个计费项
  • 5
    利用阿里云OSS(对象存储服务)快速搭建私人网盘
  • 6
    轻量消息队列(原 MNS)订阅 OSS 事件实践
  • 7
    os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
  • 8
    基于Uniapp+php校园小程序,校园圈子论坛系统功能,校园跑腿二手交流功能设计
  • 9
    2025年了,PHP 还是“世界上最好的语言”吗?
  • 10
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution