PHPでは、 MD5_FILE()は、ファイルのMD5ハッシュ値を計算するための非常に実用的な機能です。その基本的な構文は次のとおりです。
md5_file(string $filename, bool $binary = false): string|false
この関数は、ファイルパスを引数として取得し、ファイルのMD5チェックサムを返します(デフォルトは16進形式の文字列です)。ただし、多くの開発者は、 md5_file()を使用するときにfalseが返される状況に遭遇します。これは、多くの場合、いくつかのエラーが発生したことを意味します。この記事では、複数の観点からこの状況を引き起こす可能性のある理由を分析します。
これが最も一般的な理由の1つです。提供されたファイルパスが間違っている場合、タイプミス、間違ったパス形式、または存在しないディレクトリであろうと、 md5_file()は失敗し、 falseを返します。
例:
$hash = md5_file('/path/to/nonexistent/file.txt');
ここで、 file.txtが存在しない場合、またはパスが誤って綴られている場合、 falseが返されます。
ファイルパスが正しい場合でも、PHPスクリプトが配置されている実行中のユーザー(通常はwww-dataなどのWebサーバーユーザー)がターゲットファイルを読み取る許可を持たない場合、 md5_file()がfalseを返します。
解決:
ファイルの権限または属するユーザーを変更することにより、PHPにファイルを読み取るのに十分な権限があることを確認できます。
chmod 644 /path/to/file.txt
chown www-data:www-data /path/to/file.txt
一部のオペレーティングシステムおよびファイルシステムは、他のプログラムが他のプログラムによって記述またはロックされている場合、他のプログラムをファイルを読み取ることを制限しています。この場合、 MD5_FILE()がファイルを読み込もうとした場合、 Falseを返すこともあります。
例:
たとえば、FTPによってアップロードされているか、別のスクリプトに書き込まれているファイルであるPHPは、読み取り障害の問題に遭遇する可能性があります。
PHPのMD5_FILE()は、 Allow_url_fopen設定を介して有効になった後、ParameterとしてURLを使用することを理論的にサポートします。しかし、実際、この方法は、特にリモートサーバーがエラーステータスコードを返す場合、またはコンテンツが大きくて遅い場合、エラーが発生しやすいです。
例:
$hash = md5_file('https://m66.net/uploads/example.zip');
このコードは、 Allow_url_fopenがオンに設定されている場合にのみ正常に実行されます。それ以外の場合、 falseが返されます。
次の方法を使用して、コードの構成を確認できます。
if (!ini_get('allow_url_fopen')) {
echo "リモートファイルアクセス機能が有効になっていません";
}
提案:リモートURLに依存しないでください。最初にfile_get_contents()からローカルの一時ファイルをダウンロードし、次にmd5_file()を使用する方が安全です。
md5_file()は空のファイルを処理できますが、ファイルが切り捨てられたり破損したりする場合(特にバイナリファイル)、読み取りの例外を引き起こす可能性があります。これは一般的ではありませんが、ファイルステータスはfilesize()またはfopen() + fread()によって手動で検出できます。
ファイルパスに非UTF-8文字(特にWindowsシステム)が含まれている場合、またはユーザー(中国語、スペース、または特別なシンボルなど)がアップロードするとパスが構築されると、パスは誤って解析される場合があります。
例:
$hash = md5_file('/var/www/uploads/書類A.txt'); // パスエンコードは一貫性がない場合があります
RealPath()を使用してそのような問題を回避することは良い方法です:
$path = realpath('/var/www/uploads/書類A.txt');
$hash = md5_file($path);
move_uploaded_file() 、 tmpfile() 、または自動的に生成された一時パスファイルを使用する場合、これらのファイルは操作中に削除、移動、または寿命を超えて、読み込もうとするとmd5_file()が失敗します。