【问题标题】:backup files to google drive using PHP使用 PHP 将文件备份到谷歌驱动器
【发布时间】:2018-03-31 10:21:41
【问题描述】:

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

我想为要上传到Google Drive的文件创建备份

这样我所有的文件和数据库的数据都在Google Drive

我将PHPMySQL 用于我的数据库

经过一番研究,我找到了“Automatically backing up your web server files to GoogleDrive with PHP”并照他说的做了。

我已经从backuptogoogledrive repository 下载了文件google-api-php-client

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

我编辑了 setting.inc 并添加了自己的客户端 ID客户端密码身份验证码。我还输入了我的MySQL 用户名、密码和主机名。

在这个页面backuptogoogledrive 它应该创建一个.tar.gz 文件夹并且这个文件夹应该包含我的网站文件。然后,这个文件夹应该将它上传到我的Google Drive 并为我的数据库做同样的事情。

<?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");

?>

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

我该如何解决这个问题?

// 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/"; 

【问题讨论】:

  • @DaImTo 你能解释一下吗
  • 你是说它适用于数据库文件夹备份,但不适用于文件?
  • @Don'tPanic 是的,我说的是
  • 我没有看到任何创建文件夹的代码,只有.gz 文件。你能澄清一下吗?
  • @Don'tPanic 在我检查了我认为数据库工作的文件后,因为它创建了一个文件而不是文件夹,你可以检查上面的 2 张图片

标签: php mysql google-drive-api


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我按照你的建议做了 shell_exec("cd ".$homedir." && tar -cf - ".$sitedir." -C ".$homedir." | gzip -9 > ".$ homedir.$fprefix.$uid.".tar.gz");但我也没有任何 tar.gz 文件
    • 如果您将-z 与 tar 命令一起使用,则可以使用“gzip”丢弃该部分。此外,我刚刚注意到问题在于 tar 没有输入数据。 tar 的使用是tar [OPTIONS] input_data。所以你的应该是这样的:shell_exec("cd" . $homedir . " &amp;&amp; tar -czf " . $prefix.$uid . ".tar.gz input_file_or_directory");
    • input_file_or_directory 应该是什么??
    • 在您的情况下,我猜它应该是您存储网站文件的目录。比如:shell_exec("cd" . $homedir . " &amp;&amp; tar -czf " . $prefix.$uid . ".tar.gz public_html/");。不要忘记目录末尾的斜线或包含的数据,并且不会包含子文件夹!
    • 我试过这样 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 ERROR 500
    【解决方案3】:

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

    引用您遵循的备份教程:

    // 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 正确设置了站点文件目录的相对路径(从主目录)。

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

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


    更新

    $homedir 是主目录,$sitedir 是相对于$homedir 的网站根目录

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

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

    这假设您的网站根目录是public_html,并且位于您的主目录mhmd2991

    再次确保您的网站根目录实际上是 public_html 而不是 wwwhtml 或其他任何内容。使用终端检查一下。

    【讨论】:

    • 感谢您的回复我按照您的建议做了我将 $sitedir 更改为 public_html/ 并且我在 $homedir 之前已经做过我将主目录的绝对路径放在上面但问题没有解决当我下载站点备份文件时它是空的,但是对于我的数据库,我有一个包含我的数据库数据的文件
    • @mohamadmohamad 嗨,我试过这个脚本,它在我的机器上运行良好。我假设$sitedir 仍然没有指向网站根文件夹。如果您可以编辑您的问题并发布目录树结构,这将有助于我们为您提供帮助
    • 你能检查一下上面我放了$sitedir和$homedir
    • 我确定我的网站根目录是 public_html/ 在我更改 $homedir 后,我的服务器中没有任何用于数据库或网站备份的 .gz 文件。在我更改 $homedir 之前,我的浏览器上会出现此消息。此页面不工作,目前无法处理此请求。 HTTP ERROR 500,但在我更改 $homedir 后,我没有收到此错误,并且页面加载正常,没有任何错误消息
    • @mohamadmohamad:你确定你没有忘记一些;吗? 2:在您的提供商信息中找到如何访问php_error.log
    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多