4

わかりました。デプロイを容易にするために PHP の Web ベース インターフェイスを rsync にまとめようと試みたのは、おそらく私が初めてではありません。

ローカルに「QA」サーバーがあり、Rackspace に「ステージング」サーバーがあります。SSH キーのペアリングをセットアップしたので、2 つのサーバー間で rsync を実行でき、すべてうまく機能します。問題は、rsync が何を更新する必要があると判断するかについて、少し不安定であることです。

私が作成したスクリプトは、最初に「--dry-run」パラメーターを指定して rsync を実行し、転送が必要なすべてのリストを取得します。コマンドは次のとおりです。

$strCheck = shell_exec(
                       "rsync " .
                       "--verbose " .
                       "--recursive " .
                       "--safe-links " .
                       "--checksum " .
                       "--dry-run " .
                       "--delete " .
                       "--delete-excluded " .
                       "--force " .
                       "--cvs-exclude " .
                       "--human-readable " .
                       "/apps/{$system}/ " .
                       "user@liveserver:/apps/{$system}_staging/"
                       );

これですべて正常に動作し、削除が必要なものと追加/更新が必要なものに返された文字列を解析できます。次に、階層内の位置に基づいて各チェックボックスを自動的にインデントする HTML テーブルを作成します。また、ユーザーがフォルダー内のすべてのファイルを選択できるように、JavaScript を少し使用します。

フォルダ自体を追加/削除する場合は、リストに含めます。例えば:

/newfolder/
/newfolder/file1.php
/newfolder/file2.php

「/newfolder/」は 1 つのインデントで表示され、「/newfolder/file1.php」と「/newfolder/file2.php」は「/newfolder/」の下にそれぞれ 2 つのインデントで表示されるため、これはすばらしいことです。「/newfolder/」の横にあるチェックボックスは、2 つの「子」ファイルを自動的に選択し、誰もが満足します。

ただし、フォルダーにファイルを追加/更新するだけの場合は、フォルダー自体を省略します。

/oldfolder/filea.php
/oldfolder/fileb.php

...

つまり、「/oldfolder/」内のすべてのファイルには 2 つのインデントがありますが、フォルダー内のすべてのファイルを選択する目に見えるメカニズムはありません。

だから私の質問はこれです:更新されたファイルのフォルダーを強制的に含めることができる利用可能なrsyncパラメーターに欠けているものはありますか、それとも配列をループするときにそれらを追加する必要がありますか? 後者の場合、それを行うための最良の方法は何でしょうか?

助けてオビ スタック オーバーフロービ、あなただけが私の希望です...

4

1 に答える 1

2

ディレクトリを作成または削除する必要がないため、rsync が返すリストから削除されます。それを修正する方法はないと思います。

あなたの最善の策は、このようなパスを取得することだと思います

$path = explode(PATH_SEPARATOR, dirname($filename) );

$filename はファイル名です。

于 2009-11-26T05:16:20.437 に答える