to clarify:
in unix/linux:
hardlinks (by this function) cannot go across different filesystems.
softlinks can point anywhere.
in linux, hardlinking to directory is not permited.
(PHP 4, PHP 5, PHP 7, PHP 8)
link — Erzeugt einen harten Link
target
Das Ziel des Links.
link
Der Name des Links.
Gibt bei Erfolg true
zurück. Bei einem Fehler wird false
zurückgegeben.
Die Funktion schlägt fehl und gibt einen Fehler der Stufe
E_WARNING
aus, wenn link
bereits existiert oder wenn target
nicht existiert.
Beispiel #1 Erstellen eines harten Links
<?php
$target = 'quelle.ext'; // Die ist die bereits existierende Datei
$link = 'neuedatei.ext'; // Dies ist der Dateiname, auf den verlinkt
// werden soll
link($target, $link);
?>
Hinweis: Diese Funktion kann nicht mit entfernten Dateien arbeiten, da der Zugriff auf die Datei, die bearbeitet werden soll, über das Dateisystem des Servers möglich sein muss.
Hinweis: Nur für Windows: Diese Funktion setzt voraus, dass PHP in einem erhöhten Modus oder mit deaktivierter Benutzerkontensteuerung (UAC) läuft.
to clarify:
in unix/linux:
hardlinks (by this function) cannot go across different filesystems.
softlinks can point anywhere.
in linux, hardlinking to directory is not permited.
For a backup utility I needed link-like functionality on a windows system. As it isn't availible on windows, i tried to do it myself with the help of some tools. All you need is junction.exe from sysinternals in your %PATH%.
<?php
if(!function_exists('link')){ // Assume a windows system
function link($target, $link){
if(is_dir($target)){
// junctions link to directories in windows
exec("junction $link $target", $lines, $val);
return 0 == $val;
}elseif(is_file($target)){
// Hardlinks link to files in windows
exec("fsutil hardlink create $link $target", $lines, $val);
return 0 == $val;
}
return false;
}
}
?>
http://www.sysinternals.com/Utilities/Junction.html
I noticed that, differently from Unix ln command, the second parameter can´t be a directory name, i.e., if you want to create a link with the same filename of the target file (obviously on different directories), you must specify the filename on the link parameter.
Example:
Unix ln command:
ln /dir1/file /dir2/ // ok, creates /dir2/file link
PHP link function:
link ("/dir1/file", "/dir2/"); // wrong, gives a "File exists" warning
link ("/dir1/file", "/dir2/file"); // ok, creates /dir2/file link
In at least php-5.3 (linux-2.6.38.6) a process owned by apache could make a link() in a directory owned by apache, to a file owned by webmaster to which it had group read permissions. In php-7.0 (linux-4.13.16) that results in a "permission denied". Either the target file must be owned by apache or one must use copy() instead (so that ownership changes to apache).