好的,我可能不是第一个试图将基于PHP网络的界面组合到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,你是我唯一的希望......
答案 0 :(得分:2)
由于不需要创建或删除目录,因此rsync返回的列表中将缺少该目录。我认为没有办法解决这个问题。
我认为你最好的选择是获得类似这样的路径
$path = explode(PATH_SEPARATOR, dirname($filename) );
其中$ filename是您的文件名。