Windows版PHPでsymlink()が常にエラーになるという現象に直面。
たとえば以下のようなPHPファイルをブラウザから実行すると
1 2 3 4 5 |
$target = "c:/xampp/htdocs/temp/index.html"; $link = "home.html"; $result = symlink($target, $link); echo ($result ? 'success' : 'failed'); |
以下のようなエラーメッセージが表示される。
1 |
Warning: symlink(): Cannot create symlink, error code(1314) in C:xampphtdocstempsymlink.php on line 4 |
$tergetは絶対パスの必要があるようで、相対パスで指定するとerrno 2が返る。$linkは絶対パスでも相対パスでもエラー内容は変わらない。
symlink()のサポートはWindowsのバージョンによるらしい
PHPのマニュアルには以下の記述があるが、自分の環境はWindows 7なので該当しない。
注意: Windows ユーザーは注意しましょう。この関数が動作するのは、Windows Vista/Windows Server 2008 以降で PHP を動作させている場合のみです。それより前のバージョンの Windows では、シンボリックリンクをサポートしていません。
PHP: symlink – Manual
http://php.net/manual/ja/function.symlink.php
symlink()の実行には管理者権限が必要らしい
エラーメッセージに含まれるエラーコードを調べると「特権が無い」ということらしい。
ERROR_PRIVILEGE_NOT_HELD
1314 (0x522)
A required privilege is not held by the client.
System Error Codes (1300-1699) (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx
試しに、管理者で実行したコマンドプロンプトから実行したみたところ、スクリプトは正常終了した。普通に(管理者としてではなく)実行したコマンドプロンプトではエラーとなる。というわけで、どうやらsymlink()の実行には管理者権限が必要らしい。
XAMPP環境でsymlink()を使ったスクリプトをテストする場合には注意が必要だな。