如何恢复崩溃的上传?

时间:2015-07-03 00:55:37

标签: php file-upload google-api-php-client

注意:此问题被标记为13413036的可疑副本。 情况并非如此,在该问题中,他们询问如何使用可恢复上传来上传文件。 这段代码完全正确,它可以工作。唯一的问题是图书馆会在很长一段时间后崩溃。

我正在尝试将云计算实例中的40GB文件上传到云端硬盘。

我在命令行运行了一个PHP脚本,大约一个小时左右就崩溃了。

PHP Fatal error:  Uncaught exception 'Google_Service_Exception' with message 'Error calling PUT https://www.goog
leapis.com/upload/drive/v2/files?uploadType=resumable&upload_id=AEnB2UrkY_dh7-GmPp33joiPzhBT3DHY6fg4bgN_PNWVgEYg
IBZmFf0UceJbLS1XeyaJ0bFxdMTNWtPVEAQKIf8uE7HBExuG6g: (503) Service Unavailable' in /var/www/backend/phpsdk/exampl
es/apiClient/src/Google/Http/REST.php:110
Stack trace:
#0 /var/www/backend/phpsdk/examples/apiClient/src/Google/Http/MediaFileUpload.php(183): Google_Http_REST::decode
HttpResponse(Object(Google_Http_Request), Object(Google_Client))
#1 /var/www/backend/phpsdk/examples/drive.php(95): Google_Http_MediaFileUpload->nextChunk('\xBA\x9AX\xBA\xAB\x9C
C\x91\x9E1\xDB|\xD0\xD5\xFB...')
#2 {main}
  thrown in /var/www/backend/phpsdk/examples/apiClient/src/Google/Http/REST.php on line 110

如果我再次执行脚本,则会在云端硬盘中创建一个新文件。

如何在崩溃后恢复初始上传? 初始化Google_Http_MediaFileUpload后,我可以设置resumeUri吗? 如何让PHP跳过将文件读取到特定点?

代码是示例中的复制/粘贴:

  // Create a media file upload to represent our upload process.
  $media = new Google_Http_MediaFileUpload(
      $client,
      $request,
      mime_content_type(TESTFILE),
      null,
      true,
      $chunkSizeBytes
  );
  $media->setFileSize(filesize(TESTFILE));
  // Upload the various chunks. $status will be false until the process is
  // complete.
  $status = false;
  $handle = fopen(TESTFILE, "rb");
  while (!$status && !feof($handle)) {
    $chunk = fread($handle, $chunkSizeBytes);
    $status = $media->nextChunk($chunk);
  }
  // The final value of $status will be the data from the API for the object
  // that has been uploaded.
  $result = false;
  if ($status != false) {
    $result = $status;
  }
  fclose($handle);
}

2 个答案:

答案 0 :(得分:0)

这不是重复,这是一个合法的错误。我有同样的问题,并尝试在github上发布,主要开发人员说要尝试捕获nextChunk的东西,看看是否可以在捕获异常后恢复它。到目前为止,我停止了该模块的开发,但我认为try / catch可以解决它,除非API是为了防止上传大文件。我的是17 GB,我在它停止前它已达到12 GB,并不总是在小时标记处停止,尽管它也在小时标记处停止。想发表评论,但还没有足够的回复。

答案 1 :(得分:0)

最后,我通过发送更大的块来修复它,因为我有RAM可用,我将chunkSize设置为20 * 1024 * 1024,并在40分钟左右上传。

服务器有12GB的RAM。并且迁移在Google网络中。云计算实例和Google云端硬盘。但是,速度仅为22MBps左右