PHPでは、 disk_total_space()関数を使用して、ファイルシステムまたはディスクパーティションの合計スペースサイズを取得できます。この機能は、サーバーの監視、空間警告、その他の機能を実行する場合に非常に便利です。ただし、実際に使用すると、一部の開発者はこの問題に遭遇します。コードには明らかに構文エラーがありませんが、 disk_total_space()を呼び出すと、警告を返し、「許可拒否」または同様の許可関連エラーを促します。
それで、この許可の問題はどのようにして生じましたか?それをトラブルシューティングと解決する方法は?この記事では、この問題の考えられる原因を段階的に分析し、実用的なソリューションを提供します。
通常、次のコードを作成した場合があります。
<span><span><span class="hljs-variable">$disk</span></span><span> = </span><span><span class="hljs-string">'/var/www/'</span></span><span>;
</span><span><span class="hljs-variable">$space</span></span><span> = </span><span><span class="hljs-title function_ invoke__">disk_total_space</span></span><span>(</span><span><span class="hljs-variable">$disk</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$space</span></span><span>);
</span></span>
理想的には、パスが配置されているファイルシステム内のバイトの総数を表す整数を返す必要があります。しかし、実際のリターンは偽で、時には次の警告メッセージが伴います。
<span><span>Warning: </span><span><span class="hljs-built_in">disk_total_space</span></span><span>(): open_basedir restriction in effect. </span><span><span class="hljs-built_in">File</span></span><span>(/var/www/) is not within the allowed </span><span><span class="hljs-built_in">path</span></span><span>(s): ...
</span></span>
または:
<span><span><span class="hljs-built_in">Warning</span></span><span>: disk_total_space(): failed </span><span><span class="hljs-keyword">to</span></span><span> </span><span><span class="hljs-keyword">open</span></span><span> dir: Permission denied
</span></span>
これは最も基本的な質問です。 disk_total_space()には、既存の有効なディレクトリパスが必要です。通過するパスが存在しない場合、機能は当然機能しません。
トラブルシューティング方法:
is_dir()またはfile_exists()を使用して、パスが存在するかどうかを確認します。
特にLinuxでは、症例の感度に注意するために、パスが正しく綴られていることを確認してください。
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$disk</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ディレクトリは存在しません:<span class="hljs-subst">$disk</span></span></span><span>";
}
</span></span>
Webサーバー(ApacheやNginxなど)でPHPを実行しているプロセスユーザー( www-data 、 apacheなど)は、提供するディレクトリにアクセスする許可を持たない場合があります。
トラブルシューティング方法:
lsld/path/to/dirを使用して、このパスの権限を表示します。
whoamiおよびps aux |を使用しますPHPの実行中のユーザーを確認するためのgrep php 。
CLIモードを使用して、違いがあるかどうかをテストします。 CLIモードは、通常より高い現在のログインユーザー許可を使用します。
ディレクトリが一般的な制限であるかどうかにアクセス/コンテンツを試してみてください。
解決:
<span><span>sudo </span><span><span class="hljs-built_in">chmod</span></span><span> o+rx /var/www/
</span></span>
(注:セキュリティ上の理由から、ディレクトリ全体に書き込み許可を開くことを避けるために、アクセス許可を慎重に変更してください)
Open_Basedirは、PHPスクリプトがアクセスできるファイルシステムディレクトリの範囲を制限するPHPの構成アイテムです。着信パスがこの範囲の外側にある場合、 disk_total_space()が制限されます。
トラブルシューティング方法:
php.iniを確認するか、 phpinfo()を使用してopen_basedirの値を見つけます。
/home/user:/tmpのような制限されたパスが表示され、 $ diskが含まれていない場合、エラーがトリガーされます。
解決:
php.ini 、 .htaccess 、またはphp-fpmのプール構成を変更し、必要なディレクトリをopen_basedirリストに追加します。
仮想ホストパネル(CPanel、Pleskなど)を使用している場合は、バックグラウンドに許容パスを設定する必要があります。
<span><span>php_admin_value open_basedir "/var/www/:/tmp/"
</span></span>
SelinuxまたはApparmorが有効になっている一部のLinuxシステムでは、PHPがセキュリティポリシーの制限により特定のパスにアクセスできない場合があります。
トラブルシューティング方法:
システムが有効になっているかどうかを確認します。GetEnForceコマンド。
監査log: /var/log/audit/audit.logを表示するか、 audit2whyツールを使用して分析します。
LS -Zを使用して、パスのSELINUXコンテキストを表示します。
解決:
一時的にSelinuxをシャットダウンします(生産環境は推奨されません)。
ポリシーを変更するか、 CHCONを使用して適切なコンテキストを指定します。
Apparmorの場合、プロファイルを変更する必要があります。
<span><span>sudo </span><span><span class="hljs-built_in">chcon</span></span><span> -t httpd_sys_content_t /var/www/ -R
</span></span>
パス検証が望ましい:パスが合法であり、呼び出す前に存在することを確認してください。
ログトラッキング:PHPエラーログの表示は、問題の原因をすばやく見つけることができます。
合理的な分散化:システム全体の公開を避けるために、PHPが必要とする最小許可を付与します。
生産環境の分離:コンテナまたはクルー環境でのアクセスを制限する方が安全です。
CLIとWebの違いの分析:一部のパスはCLIモードでアクセスできますが、Webモードは制限されているため、テストポジショニングの問題を比較できます。
disk_total_space()は、小規模で一般的に使用される機能ですが、ファイルシステムアクセス許可、PHPセキュリティ構成、さらにはシステムセキュリティポリシーが含まれます。したがって、誤って誤っているか、エラーを報告する遭遇に遭遇した場合、PHPコード自体に焦点を合わせるだけでなく、オペレーティングシステムのアクセス許可、Webサービスの構成、セキュリティポリシーなどの複数の次元から始めて、問題を効率的に見つけて解決します。
この記事が、あなたが同様の問題にもっと落ち着いて対処し、対処するのに役立つことを願っています。