tau
tau

Reputation: 6749

Change the target of a symlink with PHP

How can I change the target of a symlink with PHP? Thanks.

Upvotes: 6

Views: 4531

Answers (3)

Walf
Walf

Reputation: 9278

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.

Upvotes: 0

codaddict
codaddict

Reputation: 454960

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.

Upvotes: 12

nickf
nickf

Reputation: 546005

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.

Upvotes: 3

Related Questions