最初に理解することは、WindowsとLinuxの基礎となる許可メカニズムが異なることです。
Linuxは、ユーザー(ユーザー)、グループ(グループ)、その他(その他)に基づいた許可モデルを使用し、読み取り、書き込み、実行(RWX)などの素晴らしい許可コントロールを提供します。
Windowsは、GUIまたはコマンドラインを介してオペレーティングシステムによって設定されるアクセス制御リスト(ACLS)を使用します。
PHPのChmod()関数はUNIXスタイルに従って設計されているため、Windows SystemsではPHPはこの動作をシミュレートしようとしますが、効果は非常に限られています。
Windowsで次のコードを使用します。
<?php
$file = 'C:\\xampp\\htdocs\\test.txt';
chmod($file, 0755);
?>
このコードは、Linuxのような「読み取り可能な書き込み実行」にファイル権限を変更することはありません。ほとんどのWindowsシステムでは、実際の効果はまったくありません。または、いくつかの非常に具体的なシナリオ(読み取り専用のフラグなど)のみに影響しません。
PHPのChmod()パラメーターは、 0755や0644などのオクタル数です。これらはLinuxで特定の意味を持っていますが、Windowsでは、これらの値は通常ACLルールとして解釈されません。したがって:
ファイルの実際のアクセス権限は変更されません。
ユーザーグループまたは他のユーザーへのアクセス権を制御することはできません。
一部のWindows構成では、 chmod()を使用して「読み取り専用」属性を設定または削除できます。例えば:
<?php
$file = 'C:\\xampp\\htdocs\\demo.txt';
// ファイルを読み取り専用に設定します
chmod($file, 0444);
?>
ただし、この動作は不安定で、特定のWindowsバージョンとファイルシステム(NTFSまたはFAT32)に依存します。
Windowsのファイル許可を実際に変更する必要がある場合は、システムコマンドを呼び出すことを検討できます。
<?php
$path = 'C:\\xampp\\htdocs\\secure.txt';
exec("icacls \"$path\" /grant Everyone:F");
?>
これにより、すべてのユーザーがWindows ICACLSコマンドを使用して完全な権限を提供します。このプラクティスはシステムコマンドに依存しているため、特定のセキュリティリスクがあり、慎重な使用と許可制御が必要であることに注意してください。
PHPプロジェクトがLinuxとWindowsの間で環境を切り替える必要がある場合、 chmod()を使用する場合は、次のポイントを考慮する必要があります。
chmod()に依存してビジネスロジックを実装しないでください。Windowsで有効にすることは保証できません。
システム検出を実行する: PHP_OSまたはPHP_OS_FAMILYを使用して、現在のオペレーティングシステムを決定します。
システムによると、許可ロジックは個別に処理されます。
<?php
if (PHP_OS_FAMILY === 'Windows') {
// Windows それに対処する方法
exec("icacls C:\\path\\to\\file.txt /grant Everyone:R");
} else {
// Linux / Unix それに対処する方法
chmod('/var/www/html/file.txt', 0644);
}
?>