PHP调用Twitter API上传视频时fread忽略长度参数生成分片过多问题求助
问题根源及修复方案
核心问题:循环逻辑存在死循环缺陷
你遇到的分片数量异常问题,根源是PHP中fread和feof的判断逻辑顺序错误:
feof($fp)仅在上一次读取操作尝试读取超过文件末尾内容后才会返回true,如果某次fread因为系统IO波动、文件锁等原因返回空字符串但实际还未到文件尾,!feof($fp)仍会判定为真,导致循环无限执行,反复上传空内容的分片,这就是你出现数百次请求的原因。- Twitter的
APPEND分片上传接口成功时确实返回空响应体,json_decode解析空字符串得到null属于正常现象,你的这个判断是正确的。
修复后的代码
$fp = fopen($media_path, 'rb'); $segment_id = 0; $tmhOAuthUpload = new tmhOAuth(); // 复用实例,无需每次循环新建 while (!feof($fp)) { $chunk = fread($fp, 1048576); // 校验读取结果,未读到有效内容直接终止循环 if ($chunk === false || strlen($chunk) === 0) { break; } $tmhOAuthUpload->request( 'POST', $tmhOAuthUpload->url('/1.1/media/upload.json'), array( "command" => "APPEND", "media_id" => $media_id, 'media_data' => base64_encode($chunk), "segment_index" => $segment_id ) ); $segment_id++; $results = json_decode($tmhOAuthUpload->response['response']); var_dump($results); } fclose($fp); // 记得关闭文件句柄
额外优化建议
- 新增分片上传失败重试逻辑,避免单次网络波动导致整个上传任务失败
- 可先获取文件总大小,预计算总分片数,循环时增加分片数超过预计算值的熔断逻辑,避免极端情况下的死循环
内容的提问来源于stack exchange,提问作者LozGuiel
相关产品推荐
相关产品推荐

