OOPとシッターなしでYandex.DiskにWebプロジェクトをバックアップします

昨日、ポストNo. 206752のvasiatka habrayuzerはhabrasocietyと共有したため、Yandex.Diskを操作するための思慮深く高度に発達したクラスでした。 少し前に、このサービスを使用してバックアップを保存し始めました。 データベースとサイトファイルのアーカイブを作成し、WebDAV経由でアップロードするphpのスクリプトのはるかに短いバージョンを共有したいと思います。 おそらく誰かもそれを好きになるでしょう。



誰かが完全なリストをすばやく確認したい場合は、一番下にあります。

説明



私があなたの注意を引くスクリプトはかなり簡潔です。 パラメータのタスクとレポートの出力を除外すると、 約30行になります。 そして、パラメーターとその名前はそれ自体を物語っていますが、それでも私はそれらをコメントで説明します。



このスクリプトはどのクラウドで機能しますか



ファイルはWebDAVプロトコルを使用してダウンロードされるため、スクリプトはこの種類のリポジトリで動作する必要があります。

YandexとMail.Ruのみをテストしましたが、ダウンロードは成功しますが、ダウンロードフォルダーは事前にクラウド上に作成する必要があります。 2013.12.22現在、このプロトコルに対するMail.Ruのサポートはどこにも宣伝されておらず、テストモードで動作しているとのみ発表されています。 注意して使用してください。



設定



クラウド上のユーザー名とパスワードおよびパス


ログインは完全な形式で示されます。 犬とドメインで。 パスワードは、自尊心のあるパスワードのように完全に指定されます。
$WebDAV = [ 'login'=>'', 'password'=>'', 'url'=>'https://webdav.yandex.ru/backups/sites/',//  'url'=>'https://webdav.cloud.mail.ru/backups/sites/',// Mail.Ru ];
      
      



クラウドへのパスとターゲットフォルダーへのパスを完全に指定する必要があります。 貴重なアーカイブを保存する予定のフォルダは、事前に自分で作成する必要があります。 確認したところ、彼女が自動的に表示されないことは確かです。 これが行われない場合、ダウンロードは続行します。 Yandexの場合、結果の重みで判断すると、ダウンロードしたファイルは1つの大きなファイルに接着されます。 Mail.Ruの場合、何も表示されません。 閉じスラッシュが必要です。



アーカイブを作成するローカルパス


サービスへのアーカイブとアップロードは1行で実行できますが、ファイルをアップロードする前のスクリプトでは、どこかに作成する必要があります。 アーカイブを作成するためのパスは、この変数で指定されます。

 $backupPath
      
      





ローカルコピーリポジトリをサイト内に配置し、アーカイブから除外するパスのリストにパスを追加できます。



データベースのリスト


アーカイブするデータベースを$ databases配列に書き込みます。 おそらく、変更せずにデータベースにユーザーを作成し、そのような使用のための許可を書き込む価値があります。

 $databases = [['login' => '', 'password' => '', 'dbname' => '']];
      
      







サイトのリスト


$ sites配列のメンバーの1つの標準ビューは、アーカイブされたサイトのリストです。

  'name' => 'site1.ru', 'path' => '/var/www/site1.ru', 'exclude' => []
      
      





最初のパラメーターはサイトの名前です。 サイトのアーカイブ名に割り当てられる文字列。

2番目は、サイトファイルへのパスです。

3番目は、アーカイブから除外する必要があるディレクトリのリストです。 個々のファイルを除外することは規定していませんが、自分で簡単に追加できます。 いずれかのサイト内にアーカイブを作成する場合、このストレージを除外できます。

例:
  'exclude' => [ $backupPath, //   ,        '/var/www/site2.ru/temp' // -  ]
      
      







これでスクリプトの構成が完了し、彼は革命 ... 社会 ...ウェブ管理者のために働く準備ができました。



データベースが小さく、ファイルの重量が重すぎない場合は、少なくとも1時間ごとに冠を付けてスクリプトを呼び出すことができます。 同じ名前のファイルは、ローカルストレージとYandex.Diskの両方で上書きされます。 翌日、新しい日付とほぼ同じ名前のファイルが作成されます。

site1.ru.2013-12-20.zip





アーカイブに毎回一意の名前を付けたい場合は、次の行を置き換える必要があります

 $date = date('Ym-d');
      
      



 $date = date('YmdHi-s');
      
      



日付は最大数秒になります。



聞いて、言わなかったと言わないで



このスクリプトは、頻繁に変更されるサイト、重いデータベースを持つサイト、またはその他の成人向けの深刻なWebプロジェクトのための信頼できるバックアップ方法のふりをしないことを警告します。 しかし、名刺サイトの場合-それだけです。

重要な注意:ユーザー名とパスワードは、ダウンロード中に実行中のプロセスのリストに表示されます。



実際にすべて



ご清聴ありがとうございました。この投稿をお読みください。 誰かが私の人生を楽にし、心の安らぎを与えてくれるかもしれません。 頑張って



UPD: Mail.Ru について言及してくれたlolipopに感謝します。 スクリプトを変更して、テラバイトストレージで動作するようにしました。 今、彼を獲得するものがあります! 検索の過程で、最初にWebDAVがサポートされていないという情報に出会いましたが、 ここで目的のアドレスの言及を見つけました 。 これまでのところ、テストモードでのみ。 これが今だけ明らかになったことは残念です-私のトピックはすでに新しいもののリストから出ています。 そして、すでにそれを読んだ人はおそらくそれを知らないでしょう。 そして、テラバイトのスペースでのアクションの観点から、これは非常に重要です。



UPD:パスワードとログインがプロセスリストのサーバーに表示されるという正しい コメントvk2に感謝します。



UPD: kosenkaに感謝します。WebDAVパスにはスラッシュが必要です。 実際、これは同じフォルダーです。 見逃しましたが、例とスクリプトの両方で修正しました。

また、curlが証明書を誓う場合、-kスイッチを指定する必要があります。これにより、間違った証明書の有無にかかわらずサイトに接続できます。

彼はまた、すべてのホスティングがzipを持っているわけではないことを正しく指摘しました。 私は近い将来にコーシャgzipの行を追加しようとします。



全リスト
 $WebDAV = [ 'login'=>'', 'password'=>'', //url         ,        //'url'=>'https://webdav.yandex.ru/backups/sites/',//     ,      . 'url'=>'https://webdav.cloud.mail.ru/backups/sites/',//     ,     . ]; $backupPath = 'path to backups'; //,      ,     WebDAV $databases = [['login' => '', 'password' => '', 'dbname' => '']]; $sites = [ //  : [ 'name' => 'site1.ru', 'path' => '/var/www/site1.ru', 'exclude' => [] ], //     ['name' => 'site2.ru', 'path' => '.', //   'path' => '.'   ,     . 'exclude' => [ //   - ,     .      ,       . $backupPath, //   ,        '/var/www/site2.ru/temp' // -  ] ], ]; //     . ///////////////////////////////////////////////////////////////////////////////////////// //       ,     ,    .  . //.     ,       . //      . $date = date('Ym-d'); $errors = []; $success = []; $files_to_send = []; foreach ($databases as $db) { $filename = "$backupPath/bases/{$db['dbname']}.$date.sql.gz"; $output = `mysqldump --user={$db['login']} --password={$db['password']} {$db['dbname']} | gzip -f > $filename`; if (!file_exists($filename)) { $errors[] = 'Dump ' . $db['dbname'] . ' failed: ' . $output; } else { $success[] = 'DB ' . $db['dbname'] . ' dumped'; $files_to_send[] = $filename; } } foreach ($sites as $site) { $filename = "$backupPath/files/{$site['name']}.$date.zip"; $exclude = ''; if ($site['exclude']) { $exclude = '-x ' . implode('\* -x ', $site['exclude']) . '\*'; } $cmd = "zip -r \"$filename\" {$site['path']} $exclude"; echo $cmd . "<br>\n"; $output = `$cmd`; if (!file_exists($filename)) { $errors[] = 'Site backup ' . $site['name'] . ' failed: ' . $output; } else { $success[] = 'Site ' . $site['name'] . ' saved'; $files_to_send[] = $filename; } } foreach ($errors as $e) { echo ': ' . $e . "<br>\n"; } echo "<br>\n"; foreach ($success as $s) { echo ': ' . $s . "<br>\n"; } echo "<br>\n"; echo "   :<br>\n"; foreach ($files_to_send as $f) { echo $f . "<br>\n"; } echo "<br>\n"; if (!empty($files_to_send)) { foreach ($files_to_send as $file) { echo shell_exec("curl --user {$WebDAV['login']}:{$WebDAV['password']} -T \"$file\" {$WebDAV['url']}") . "<br>\n";//   ,    -k } }
      
      





投稿の先頭へ↑



All Articles