使用fread发送大数据块

时间:2018-06-23 04:02:24

标签: php fwrite fread

这是我上一个主题(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)技巧,但仍然重复了同样的事情。有什么想法吗?

1 个答案:

答案 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使用它的人提供的课程。

  • 在我看来,有比仅使用CURL更好的方法,但是客户已要求通过这种方式完成此操作,但是它可以正常工作。
  • 对于免费用户,Cloudflare的最大上传限制为250MB,您无法通过CURL支持的流功能进行分块上传,因为Cloudflare在标题中仍读取大于250MB的内容。
  • 当我设法使此代码正常工作时,它将在某些块上超时,这是因为Cloudflare在100秒内需要HTTP标头或超时。幸运的是,我的脚本将通过CRON执行,因此不需要通过Cloudflare即可工作。但是,如果您要在浏览器中执行代码,则可能需要看一下。 https://github.com/marcialpaulg/Fixing-Cloudflare-Error-524