使用PHP将文件备份到Google云端硬盘

backup files to google drive using PHP

提问人:mohamad mohamad 提问时间:10/19/2017 最后编辑:Shadowmohamad mohamad 更新时间:5/7/2023 访问量:7576

问:

我在 GoDaddy 上有服务器和域名。

我想为我的文件创建备份,以便上传到 Google 云端硬盘

因此,我的所有文件和数据库的数据都在Google云端硬盘上。

我使用和用于我的数据库PHPMySQL

经过一番研究,我发现“使用 PHP 自动将您的 Web 服务器文件备份到 GoogleDrive”并按照他说的做了。

我已经从backuptogoogledrive存储库下载了文件。google-api-php-client

我有一个客户端 ID客户端密钥和一个 authCode

我编辑了setting.inc,并输入了我自己的客户端ID客户端密钥authCode。我还输入了我的用户名、密码和主机名。MySQL

在此页面中,它应该创建一个文件夹,该文件夹包含我的网站文件。然后,这个文件夹应该把它上传到我的谷歌云端硬盘,并为我的数据库做同样的事情。backuptogoogledrive.tar.gz

<?php
  set_time_limit(0);
  ini_set('memory_limit', '1024M'); 
  require_once("google-api-php-client/src/Google_Client.php");
  require_once("google-api-php-client/src/contrib/Google_DriveService.php");
  include("settings.inc.php");

  if($authCode == "") die("You need to run getauthcode.php first!\n\n");

  /* PREPARE FILES FOR UPLOAD */

  // Use the current date/time as unique identifier
  $uid = date("YmdHis");
  // Create tar.gz file
  shell_exec("cd ".$homedir." && tar cf - ".$sitedir." -C ".$homedir." | gzip -9 > ".$homedir.$fprefix.$uid.".tar.gz");
  // Dump datamabase
  shell_exec("mysqldump -u".$dbuser." -p".$dbpass." ".$dbname." > ".$homedir.$dprefix.$uid.".sql");
  shell_exec("gzip ".$homedir.$dprefix.$uid.".sql");

  /* SEND FILES TO GOOGLEDRIVE */

  $client = new Google_Client();
  // Get your credentials from the APIs Console
  $client->setClientId($clientId);
  $client->setClientSecret($clientSecret);
  $client->setRedirectUri($requestURI);
  $client->setScopes(array("https://www.googleapis.com/auth/drive"));
  $service = new Google_DriveService($client);  
  // Exchange authorisation code for access token
  if(!file_exists("token.json")) {
    // Save token for future use
    $accessToken = $client->authenticate($authCode);      
    file_put_contents("token.json",$accessToken);  
  }
  else $accessToken = file_get_contents("token.json");
  $client->setAccessToken($accessToken);  
  // Upload file to Google Drive  
  $file = new Google_DriveFile();
  $file->setTitle($fprefix.$uid.".tar.gz");
  $file->setDescription("Server backup file");
  $file->setMimeType("application/gzip");
  $data = file_get_contents($homedir.$fprefix.$uid.".tar.gz");
  $createdFile = $service->files->insert($file, array('data' => $data, 'mimeType' => "application/gzip",));
  // Process response here....
  print_r($createdFile);      
  // Upload database to Google Drive
  $file = new Google_DriveFile();
  $file->setTitle($dprefix.$uid.".sql.gz");
  $file->setDescription("Database backup file");
  $file->setMimeType("application/gzip");
  $data = file_get_contents($homedir.$dprefix.$uid.".sql.gz");
  $createdFile = $service->files->insert($file, array('data' => $data, 'mimeType' => "application/gzip",));
  // Process response here....
  print_r($createdFile);  

  /* CLEANUP */

  // Delete created files
  unlink($homedir.$fprefix.$uid.".tar.gz");
  unlink($homedir.$dprefix.$uid.".sql.gz");

?>

现在的问题是,我有两个用于数据库的文件夹,上面没有问题,还有一个用于文件的第二个文件夹。但是这个文件夹上没有任何文件。

我该如何解决这个问题?

enter image description here enter image description here

// User home directory (absolute)
  $homedir = "/home/mhmd2991/public_html/"; // If this doesn't work, you can provide the full path yourself
  // Site directory (relative)
  $sitedir = "public_html/"; 
PHP 谷歌驱动器API

评论

0赞 mohamad mohamad 10/19/2017
@DaImTo你能解释一下吗
0赞 Don't Panic 10/23/2017
你是说它适用于数据库文件夹备份,但不适用于文件?
0赞 mohamad mohamad 10/23/2017
@Don不要恐慌,是的,我是这么说的
0赞 Don't Panic 10/23/2017
我没有看到任何创建文件夹的代码,只有文件。你能澄清一下吗?.gz
0赞 mohamad mohamad 10/23/2017
@Don 在我检查文件后,我认为数据库可以工作,因为它创建的是文件而不是文件夹,您可以检查上面的 2 张图像吗

答:

0赞 Paolo 10/24/2017 #1

备份脚本似乎找不到存储站点文件的目录。

引用您遵循的教程进行备份:

// User home directory (absolute)
$homedir = trim(shell_exec("cd ~ && pwd"))."/"; // If this doesn't work, you can provide the full path yourself
// Site directory (relative)
$sitedir = "www/";

首先,确保使用站点文件目录的相对路径(从主目录)正确设置。$sitedir

它可能与 不同,例如,对于托管在 GoDaddy 上的网站。www/public_html/

如果以上是正确的,请尝试使用主目录的绝对路径手动设置变量。$home


更新

$homedir是主目录,是相对于$sitedir$homedir

所以看你发布的代码很有可能有错误,两个变量应该是:

// User home directory (absolute)
$homedir = "/home/mhmd2991/"; // <-- FIXED HERE
// Site directory (relative)
$sitedir = "public_html/";

这假设您的网站根目录位于您的主目录中public_htmlmhmd2991

再次确保您的网站根目录实际上是,而不是或其他任何东西。使用终端检查一下。public_htmlwwwhtml

评论

0赞 mohamad mohamad 10/24/2017
感谢您的回复,我按照您的建议做了,我将$sitedir更改为public_html/,而且我之前已经这样做了$homedir我把主目录的绝对路径放在上面,但问题还没有解决,当我下载站点备份的文件是空的,但对于我的数据库,我有一个包含我的数据库数据的文件
0赞 Paolo 10/24/2017
@mohamadmohamad嗨,我尝试了该脚本,它在我的机器上运行良好。我假设仍然没有指向网站根文件夹。如果您可以编辑您的问题并发布目录树结构,这将帮助我们为您提供帮助$sitedir
0赞 mohamad mohamad 10/24/2017
你能检查一下上面我放$sitedir和$homedir
0赞 mohamad mohamad 10/25/2017
我确定我的网站根目录已public_html/更改$homedir我的服务器中没有任何用于数据库或网站备份的.gz文件。在我更改$homedir之前,我的浏览器上会出现此消息。此页面不起作用,当前无法处理此请求。HTTP 错误 500 但是在我更改$homedir后我没有收到此错误,并且页面加载正常,没有任何错误消息
0赞 bato3 10/26/2017
@mohamadmohamad:你确定你没有忘记一些吗?2:在您的提供商信息中了解如何访问;php_error.log
-1赞 Tamali 10/30/2017 #2

你不会错过焦油前面的连字符吗?不是应该的吗?你有。我不认为它将其识别为命令参数,因此没有创建文件。cftar -cftar cf

评论

0赞 mohamad mohamad 10/30/2017
我按照你的建议做了 shell_exec(“cd ”.$homedir.“ && tar -cf - ”.$sitedir.“ -C ”.$homedir.“ |gzip -9 > “.$homedir.$fprefix.$uid.”。tar.gz“);但我也没有任何tar.gz文件
0赞 Tamali 10/30/2017
如果与 tar-command 一起使用,则可以使用“gzip”丢弃部分。此外,我刚刚注意到问题在于没有 tar 的输入数据。焦油的用途是。所以你的应该是这样的:-ztar [OPTIONS] input_datashell_exec("cd" . $homedir . " && tar -czf " . $prefix.$uid . ".tar.gz input_file_or_directory");
0赞 mohamad mohamad 10/30/2017
input_file_or_directory它应该是什么??
0赞 Tamali 10/30/2017
就您而言,我想它应该是您存储网站文件的目录。所以像这样:.不要忘记目录末尾的斜杠或包含的数据,子文件夹将不包括在内!shell_exec("cd" . $homedir . " && tar -czf " . $prefix.$uid . ".tar.gz public_html/");
0赞 mohamad mohamad 10/30/2017
我试过那样shell_exec(“cd”. $homedir .“&&tar -czf”。$sitedir .“.$homedir.$fprefix.$uid.”。tar.gz“);就像那样 shell_exec(“cd” . $homedir .“&&tar -czf”。$sitedir .“.$homedir.$fprefix.”。tar.gz“);就像那样 shell_exec(“cd” . $homedir .“&&tar -czf”。$prefix.$uid .“.$homedir.$fprefix.”。tar.gz“);就像那样 shell_exec(“cd” . $homedir .“&&tar -czf”。$prefix.$uid .“.$homedir.”。tar.gz“);但我收到错误 HTTP 错误 500
-1赞 user20152015 12/31/2017 #3

我能够在使用root访问权限(在VPS /专用服务器中可用)时成功运行此脚本。但是在共享服务器中,如果 root 访问权限不可用,则此脚本会被服务器中止。共享服务器对脚本可以运行的最长时间有限制(通常不到一分钟 - 但取决于主机)

尝试在SSH中手动运行脚本,您将看到该脚本被服务器中止,这导致创建的文件夹中没有文件。

0赞 Vikash Mishra 4/13/2022 #4

在 GoDaddy 或任何其他平台中。共享主机通常不提供 shell 访问或不允许 ssh 访问。很多时候,您将在 shell 中运行命令时遇到问题,因为托管服务提供商禁止 shell 可执行命令。

这有助于他们以更好的方式向所有共享主机用户提供资源,而不会妨碍彼此的隔离。

您仍然可以在不同的托管平台中看到启用 SSH 和其他类似 shell 访问选项的选项。 请参阅以下链接以在 GoDaddy https://in.godaddy.com/help/enable-ssh-for-my-linux-hosting-account-16102 上激活 SSH

-1赞 Phil R 4/28/2022 #5

大多数高质量的托管站点允许用户存档他们的程序文件/目录/站点。同样,如果您使用的是数据库,则数据库程序通常有一个链接,您可以在其中存档和/或导出表或整个数据库。您必须寻找有关如何执行此操作的说明,因为它因平台和数据库系统以及托管站点而异。

存档文件/目录/站点和/或数据库后,您可以使用FTP程序将它们导出到计算机。同样,您可以将它们复制到另一台计算机或云中。

我的偏好是将我想导出的任何内容存档到 zip 或 tar 文件中。出于安全原因,我也更喜欢将数据库文件保存到外部驱动器或将它们放在可刻录的 DVD 上。