将大型PHP文件上传到Google云端硬盘

时间:2015-04-23 14:14:21

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

我可以将一个大文件从我的服务器上传到Google云端硬盘,但是当我从服务器上传文件时,只要过程没有完成,我就无法访问我的网站。你知道我能做些什么吗?

我的上传脚本:

set_time_limit(0);                    
$file = new Google_Service_Drive_DriveFile();
$file->title = "title";


$chunkSizeBytes = 1 * 1024 * 1024;

// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->insert($file);

// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
  $client,
  $request,
  mime_content_type($filePath),
  null,
  true,
  $chunkSizeBytes
);
$media->setFileSize(exec('stat -c %s "'.$filePath.'"'));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen($filePath, "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;                          

}

2 个答案:

答案 0 :(得分:1)

听起来可能发生的事情是您与Google云端硬盘的连接可能会占用带宽。即使您在专用服务器上,您的内部网络连接可能受设计限制(许多连接有10Mb),并且通常还受到防火墙限制。

虽然您的服务器本身可能只是最大限度地发送文件,但这不太可能。

关于你能做些什么,这可能是一个难以破解的难题。在PHP级别,我不知道在数据包速率限制等方面对套接字连接有足够低的级别控制。

如果你能够实现带宽受限的连接,它可以为你解决问题,但是没有总是“计划B进行密集操作”,这种行为会在深夜排队,而实际上很可能没有人想要访问该网站,如果他们是,那么你正在破坏最少的人。

另一种方法是使用某种云端DNS系统进行缓存,例如cloudflare,即使在服务器退出一段时间以完成大工作时,也可以使您的内容服务于人。

将两者结合在一起虽然服务器在上传过程中停止响应但很可能会被忽视。它远非完美的解决方案,但在围绕可能无法解决的问题进行设计方面,这将是一个可靠的工作答案。

答案 1 :(得分:0)

如果我理解正确,您的问题是您上传到云端硬盘是阻止的,直到完成后您不会向浏览器发送回复。如果是这种情况,您需要将Drive上载委托给一个单独的线程,让主线程发送一个http响应并关闭。