这是我上一个主题(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)
技巧,但仍然重复了同样的事情。有什么想法吗?
答案 0 :(得分:0)
处理了大约8个小时之后,我注意到我没有使用$buffer
发送块,所以现在我已经完成了。
while (!feof($fp) && ($buffer = fread($handle, $length)) !== false) {
if ($response = sendChunk($getServer, $buffer)) {
$chunk++;
print "Chunk " . $chunk . " Sent (Code: " . $response . ")! \n";
}
}
一切正常,我进行了一些其他润饰,例如检查响应代码200
。但是它的核心是有效的。
为任何正在使用Cloudflare并将文件(最大2GB)传输到另一台服务器并希望通过CURL使用它的人提供的课程。