4

好的,我可能不是第一个尝试将基于 PHP 的 Web 界面与 rsync 放在一起以简化部署的人,但确实如此。

我们在本地有一个“QA”服务器,在 Rackspace 有一个“Staging”服务器。我已经设置了 SSH 密钥配对,所以我可以在两台服务器之间进行 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/”将显示一个缩进,而“/newfolder/file1.php”和“/newfolder/file2.php”将分别在“/newfolder/”下方显示两个缩进。“/newfolder/”旁边的复选框会自动选择两个“子”文件,每个人都很高兴。

但是,如果它只是将文件添加/更新到文件夹,它会忽略文件夹本身:

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

...

这意味着“/oldfolder/”中的所有文件都将有两个缩进,但是没有可见的机制来选择文件夹中的所有文件。

所以我的问题是:在可用的 rsync 参数中我是否缺少某些东西,我可以强制它包含任何更新文件的文件夹,还是我必须在循环遍历数组时添加它们?如果是后者,那么最好的方法是什么?

帮助我 Obi Stack Overflowbi,你是我唯一的希望......

4

1 回答 1

2

由于该目录不需要创建或删除,它会从 rsync 返回的列表中丢失。我不相信有任何方法可以解决这个问题。

我认为你最好的选择是获得这样的路径

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

其中 $filename 是您的文件名。

于 2009-11-26T05:16:20.437 回答