php upyun sdk 大文件上传错误 分析 排查 解决

问题引入与分析

[0] ConnectException in CurlFactory.php line 185
cURL error 28: Operation timed out after 60000 milliseconds with 0 bytes received (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
php upyun sdk 大文件上传错误 分析 排查 解决_第1张图片

因为视频点播需要,我使用了upyun做点播服务,用upyun-php-sdk上传文件。
我是HTTP post请求上传500mb视频文件时,出现错误。http响应错误是错误码500。
排查步骤:

  • 先文件上传到服务器,不处理文件上传到又拍云,【没有问题】
  • 使用FTP工具,本地500mb文件上传又拍云,【没有问题】
  • 使用接口测试工具,本地测试接口上传又拍云,【出错】

主要是百度差不到。。。
分析了一下,觉得是http协议响应超时错误,
再来一次排查步骤:
- nginx HTTP响应timeout设置3600s,【没有用】
- php.ini 设置页面timeout,size等,【没有用】【不过出现过502,这里不做解释,统一用我的解决方案】
- php-fpm 设置响应timeout,【没有用】
- upyun-sdk设置上传timeout,【没有用】【好像又有用】【多次修改】【后来证明有用】
- 尝试php-sdk开发文档各种参数接口,【成功???】

解决方案

upyun-sdk代码超时修改

进入vendor/upyun/sdk/src/Upyun/Config.php
修改public $timeout = 60;public $timeout = 3600;

php代码

mediumUpYun($mediumPath, $savePath)接口说明
$mediumPath文件本地地址
$savePathupyun服务器相对地址,以根目录问相对路径
返回参数,为upyun服务器相对地址,如果要浏览器查看上传的文件,还要加上upyun服务器网址前缀

function mediumUpYun($mediumPath, $savePath) {
    set_time_limit(0); // 设置脚本最大执行时间 为0 永不过期
    $bucketConfig = new Config('server name', 'operater', 'password');
    $client = new Upyun($bucketConfig);
    $file = fopen($mediumPath, 'r'); // 读取本地文件
    $res = $client->write($savePath, $file, [], true); // 文件上传
    unlink($mediumPath); // 删除本地文件
    return $savePath;
}

参考文献

又拍云文档中心
又拍云php-sdk

你可能感兴趣的:(PHP)