【发布时间】:2018-06-23 04:02:23
【问题描述】:
这是我上一个帖子 (PHP CURL Chunked encoding a large file (700mb)) 的延续,但我现在即兴创作了一些其他内容。
现在,我正在尝试使用fread,然后通过 CURL 逐块(每个块大约 1MB)发送文件,虽然这个想法很好并且确实有效。它确实使服务器超时,所以我想知道是否有任何方法可以减少它每秒发送一个块的次数,或者有一种方法可以使它不会完全使我的 PHP 进程过载。
$length = (1024 * 1024) * 1;
$handle = fopen($getFile, "r");
while (($buffer = fread($handle, $length)) !== false) {
if ($response = sendChunk($getServer, $buffer)) {
$chunk++;
print "Chunk " . $chunk . " Sent (Code: " . $response . ")! \n";
}
}
函数sendChunk是
function sendChunk($url, $chunk) {
$POST_DATA = [
'file' => base64_encode($chunk)
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 2048);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $POST_DATA);
curl_exec($curl);
$response = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close ($curl);
return $response;
}
我尝试制作它,以便您可以逐行读取文件,但它不起作用,因为视频文件(mp4,wmv)有很多随机字符,什么不是。
更新:我发现了这个问题,超时实际上是 CloudFlare 在没有这样的 HTTP 响应时超时的结果。所以我决定使用 SSH 运行脚本,它运行良好....除了一件事。
在文件成功发送之后,它只会在这个无限循环中继续发送 0 字节的块,我被告知这是因为feof() 在衡量这一点时并不总是准确的。所以我尝试使用($buffer = fread($handle, $length) !== false) 技巧,它仍然重复同样的事情。有什么想法吗?
【问题讨论】: