[PHP] Windows版PHPのsymlink()の挙動について

Windows版PHPでsymlink()が常にエラーになるという現象に直面。

たとえば以下のようなPHPファイルをブラウザから実行すると

以下のようなエラーメッセージが表示される。

$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()を使ったスクリプトをテストする場合には注意が必要だな。