使用TwitterOAuth上传Twitter视频遇SSL错误、超时,无法传大文件如何解决
Twitter分块上传视频超时/连接重置问题解决方案
问题根因
- 分块大小超限:当前使用4MB原始数据分块,base64编码后体积膨胀33%,最终大小约为5.3MB,超出官方要求的
media_data参数最大5MB的限制,会被服务端主动断开连接,触发Connection reset by peer错误。 - 超时设置过短:TwitterOAuth默认请求超时为5秒,传输大分块时如果网络带宽不足,很容易触发超时错误。
- base64编码额外增加体积:使用
media_data需要先编码,比直接传二进制多了33%的传输量,进一步提升了超时和超限的概率。
解决方案
1. 调整分块大小
如果继续使用media_data传base64编码内容,将原始分块大小调整到3MB及以下,确保编码后的体积不超过4MB,远低于5MB的限制:
$chunk = fread($handle, 3 * 1024 * 1024); // 调整为3MB原始分块
2. 延长请求超时时间
初始化TwitterOAuth实例时,主动设置更长的连接超时和请求超时:
// 初始化TwitterOAuth后增加以下配置 $this->tw->setTimeouts(10, 30); // 连接超时10秒,请求超时30秒,可根据网络情况进一步调大
3. 改用media参数传原始二进制
按照官方建议优先使用media参数传输原始二进制,省去base64编码步骤,减少传输体积,调整后的append函数示例:
function append($mediaId, $fileUrl) { $segmentIndex = 0; $handle = fopen($fileUrl, 'rb'); // 用二进制模式打开文件,避免Windows环境下编码错误 while (!feof($handle)) { $chunk = fread($handle, 4 * 1024 * 1024); // 用原始二进制的话可以用到5MB的上限,分块可以设到4MB // 生成分块临时文件 $tempFile = tmpfile(); fwrite($tempFile, $chunk); fseek($tempFile, 0); $meta = stream_get_meta_data($tempFile); $tempPath = $meta['uri']; $params = [ 'command' => 'APPEND', 'media_id' => $mediaId, 'media' => $tempPath, 'segment_index' => $segmentIndex ]; $this->tw->uploadCustom('media/upload', $params); fclose($tempFile); $segmentIndex++; } fclose($handle); }
4. 增加请求重试机制
对APPEND请求增加重试逻辑,应对偶发的网络波动和服务端限流:
// 单个请求的重试示例,放在APPEND调用的位置 $retryTimes = 0; $maxRetry = 3; while ($retryTimes < $maxRetry) { try { $this->tw->uploadCustom('media/upload', $params); break; } catch (Exception $e) { $retryTimes++; if ($retryTimes >= $maxRetry) { throw $e; } sleep(1); // 等待1秒后重试 } }
内容的提问来源于stack exchange,提问作者Linesofcode
相关产品推荐
相关产品推荐

