使用PHP更改符号链接的目标

6

我该如何使用PHP更改符号链接的目标?谢谢。

3个回答

11

您可以使用unlink函数删除现有的链接,并使用symlink函数将链接重新创建到新目标。

symlink($target, $link);
.
.
unlink($link);
symlink($new_target, $link);
你需要针对每一个进行错误检查。

+1 - 这比自己编写Shell脚本要好得多。 - nickf
1
好的,我只是想看看是否有一种方法可以避免取消链接然后重新创建符号链接。谢谢! - tau
4
这意味着链接在短时间内无法使用...... 很危险 :-( - Déjà vu

3

PHP可以使用shell_exec反引号操作符执行shell命令。

因此:

<?php
`rm thelink`;
`ln -s /path/to/new/place ./thelink`;

此命令将以运行Apache服务器的用户身份运行,因此您可能需要考虑这一点。


5
当存在内置替代方案时,应避免使用Shell命令。 - too much php
4
ln -sf替换ln -s(并删除rm),这个解决方案比被接受的解决方案更好,因为它在Linux/Unix上能够原子性地替换链接目标,不会中断。似乎没有PHP函数/选项可以做到这一点(symlink()没有force选项)。 - Déjà vu

0

为了以原子方式执行此操作,而不会删除原始符号链接并无法创建新符号链接,您应该像下面这样使用ln系统命令:

system(
    'ln --symbolic --force --no-dereference ' .
        escapeshellarg($new_target) . ' ' .
        escapeshellarg($link),
    $relinked
);
if (0 === $relinked) {
    # success
}
else {
    # failure
}

force 标志是必需的,以便在不失败的情况下更新现有链接,no-dereference 可避免将链接意外放置在旧符号链接目标目录中的菜鸟错误。

如果使用相对路径,最好 chdir() 到将包含 $link 的目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接