How can I change the target of a symlink with PHP? Thanks.
You can delete the existing link using unlink function and recreate the link to the new target using the symlink function.
symlink($target, $link);
.
.
unlink($link);
symlink($new_target, $link);
You need to do error checking for each of these.
PHP can execute shell commands using shell_exec
or the backtick operator.
Hence:
<?php
`rm thelink`;
`ln -s /path/to/new/place ./thelink`;
This will be run as the user which is running the Apache server, so you might need to keep that in mind.
ln -s
with ln -sf
(and remove rm
) and this solution becomes better than the accepted solution, as it atomically (on linux/unix) replaces the target of the link, with no interruption. As it seems there is no PHP function/option to do that (symlink()
has no force option). –
Knighthead To do this atomically, without the risk of deleting the original symlink and failing to create the new one, you should use the ln
system command like so:
system(
'ln --symbolic --force --no-dereference ' .
escapeshellarg($new_target) . ' ' .
escapeshellarg($link),
$relinked
);
if (0 === $relinked) {
# success
}
else {
# failure
}
The force
flag is necessary to update existing links without failing, and no-dereference
avoids the rookie mistake of accidentally putting a link inside the old symlink's target directory.
It's wise to chdir()
to the directory that will contain $link
if using relative paths.
© 2022 - 2024 — McMap. All rights reserved.