PHPでは、チャウン関数を使用して、ファイルまたはディレクトリの所有者を変更するために使用されます。これはLinux/Unixシステムでは非常に実用的ですが、Windows環境でPHPを使用する場合、この関数の動作は予想ほど明確ではありません。この記事では、複数の視点からWindowsシステムのchown関数の有効性とその動作の詳細について説明します。
chown(string $ filename、string | int $ user):bool
この関数は、指定されたファイルの所有者を指定されたユーザーに変更しようとします。成功した場合はtrueを返し、失敗した場合はfalseを返します。オペレーティングシステムの基礎となる許可管理メカニズムに依存しています。
Windowsシステムの権限は、Linux/UNIXシステムの権限とはまったく異なります。 WindowsはACL(アクセス制御リスト)を使用してファイル権限を管理します。所有者の概念は存在しますが、LinuxのChown Conceptと完全に同等ではありません。さらに重要なことは、WindowsのNTFS許可管理により、一般に、特にPHPの実行環境で、 Chownのようなシステム呼び出しを介してファイル所有者を変更することは許可されていません。
Windows環境でChown関数を使用する場合、通常、次の状況に遭遇します。
関数呼び出しは常に失敗します<br> chownへの直接的な呼び出しは、しばしば「操作はサポートされていない」または「許可が不十分である」と促され、警告を伴う虚偽を返します。
無効な呼び出し、エラーはありませんが、所有者への変更はありません<br> 関数呼び出しがエラーを報告しない場合がありますが、実際にはファイルの所有者が変更されていません。
特定の環境での限られたサポート<br> たとえば、POSIXシミュレーションレイヤー(Cygwin、WSLなど)を使用して一部の環境を使用すると、部分的にチャウンがサポートされる場合がありますが、これはWindowsのネイティブではなく、余分なレイヤーに依存するシミュレーションです。
次のPHPコードの例は、チャウンコールの結果を検出する方法を示しています。
<?php
$filename = 'testfile.txt';
// テストファイルを作成します
file_put_contents($filename, 'テストコンテンツ');
// 所有者を変更してみてください
$result = chown($filename, 'username');
if ($result) {
echo "所有者の変更は成功しました。";
} else {
echo "所有者は変更に失敗しました。";
// 最後のエラーメッセージを出力します
var_dump(error_get_last());
}
?>
Windowsでは、このコードは「所有者の変更が失敗した」出力を出力する可能性が高く、関連するエラー情報を提供します。
COMコンポーネントを使用して、ACL許可を操作します
Windowsでは、COMオブジェクトを使用してWin32Securityインターフェイスを介してファイルACLを変更できますが、これにはより複雑なコードが必要であり、PHPの組み込み関数のカテゴリに属していません。
コマンドラインツールを介してシステムコマンドを呼び出します<br> Execを使用してICACLSコマンドを呼び出してアクセス許可を管理します。例えば:
<?php
$file = 'testfile.txt';
$user = 'username';
exec("icacls {$file} /setowner {$user}", $output, $return_var);
if ($return_var === 0) {
echo "所有者の変更は成功しました";
} else {
echo "所有者は変更に失敗しました";
print_r($output);
}
?>
ここでは、PHPを実行するユーザーが成功するために対応する権限を持つ必要があることに注意する必要があります。
WSLまたはその他のPOSIX互換環境の使用を検討してください<br> Windows 10以降では、Linux(WSL)用のWindowsサブシステムを有効にした後、Linux環境を介して標準のチャウンを使用できます。
Windowsシステムのネイティブ環境では、PHPのchown関数は基本的に無効であり、通常、コールは失敗するか、効果がありません。
Windowsの許可モデルはUNIXとはまったく異なり、ファイルの所有権管理はACLおよびシステムツールに依存します。
Windowsファイルのアクセス許可を管理する必要がある場合は、 ICACLSやCOMインターフェイスなどのシステムコマンドの使用を検討する必要があります。
クロスプラットフォームプロジェクトでは、ファイル所有者を変更するためにチャウンに依存することを避けたり、コードに環境判断を追加したりする必要があります。
このようにして、環境に基づいて対応するソリューションを採用して、Windowsの下でのchownの破損によって引き起こされる許可管理の問題を回避できます。
サンプルソースコードとコマンドの説明を参照してください。
https://gitbox.net/php/chown-windows-behavior