You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:24:03