PHPでは、 MD5_FILE関数を使用して、指定されたファイルのMD5ハッシュ値を計算します。これは、ファイルの整合性検証によく使用されます。しかし、ファイルパスが問題に見えても、 MD5_Fileはまだ正常に機能しないため、誤った値または空の値を返します。この状況は混乱する可能性があります。この記事では、問題を見つけて解決するのに役立つ詳細な調査のアイデアを紹介します。
パスは大丈夫だと思いますが、次の方法を使用して検証することをお勧めします。
<?php
$file = '/path/to/your/file.txt';
if (file_exists($file)) {
echo "ファイルが存在します";
} else {
echo "ファイルは存在しません";
}
?>
file_existsがfalseを返す場合、パスの問題がまだ存在することを意味します。知らせ:
パスは絶対ですか?相対パスは正しい作業ディレクトリに基づいていますか?
パスには中国語または特殊文字があり、パスが失敗を解決する可能性がありますか?
RealPath()関数を使用して、パスの実際の位置を確認します。
<?php
echo realpath('/path/to/your/file.txt');
?>
ファイルが存在していても、PHP Runユーザーに読み取り権限がない場合、 MD5_FILEは失敗します。許可を確認してください:
Linuxでは、 LS -Lを使用してファイル許可を表示して、PHPユーザー(www -dataなど)が読み取り許可があることを確認します。
PHPでファイルを読むことができるかどうかをテストします。
<?php
$file = '/path/to/your/file.txt';
$content = @file_get_contents($file);
if ($content === false) {
echo "ファイルを読み取れません,許可を確認してください";
} else {
echo "読み取り可能なファイル";
}
?>
一部のPHP構成は、ファイルアクセスを制限する場合があります。
Open_basedir制限:有効にすると、PHPは指定されたディレクトリのみにアクセスでき、スコープがなくても失敗します。 phpinfo()を使用して、 open_basedir設定を表示できます。
SAFE_MODE (古いPHPバージョン):ファイルアクセスも制限します。
ファイルパスが許容範囲内にあることを確認してください。
まれに、ファイルが別のプロセスによってロックされているか、書かれている場合、読み取り障害を引き起こす可能性があります。占有プロセスを閉鎖するか、後で再試行することを試みることができます。
極端なまたは特別なフォーマットファイルは、まれですが、 MD5_FILEを失敗させる可能性もあります。最初に他の小さなファイルでテストを実行することを試みることができます:
<?php
echo md5_file('/path/to/smallfile.txt');
?>
小さなファイルが正常な場合、問題はファイル自体にある可能性があります。
エラーレポートをオンにして、関連するエラープロンプトがあるかどうかを確認します。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$file = '/path/to/your/file.txt';
$result = md5_file($file);
if ($result === false) {
echo "計算に失敗しました,ファイルにアクセスできない場合があります";
} else {
echo "MD5: $result";
}
?>
MD5_Fileが常に機能しない場合は、ファイルの内容を手動で読み取り、 MD5計算を使用して成功するかどうかを確認できます。
<?php
$file = '/path/to/your/file.txt';
$content = @file_get_contents($file);
if ($content === false) {
echo "読み取り失敗";
} else {
echo md5($content);
}
?>
これが成功した場合、それはMD5_FILEがファイルを読み取ることに問題があることを意味します。これは、基礎となるIOまたは権限が原因である可能性があります。
<?php
$file = '/path/to/your/file.txt';
if (!file_exists($file)) {
die("ファイルは存在しません");
}
if (!is_readable($file)) {
die("ファイルは読み取りできません");
}
$md5 = md5_file($file);
if ($md5 === false) {
die("md5_file 計算に失敗しました");
}
echo "書類 $file の MD5 値はです:$md5";
?>
MD5_FILEはURL経由でリモートファイルへのアクセスもサポートしていますが、これはAlow_url_fopenの構成に依存します。次のようなものを使用する場合:
<?php
echo md5_file('http://m66.net/path/to/file');
?>
確認する必要があります:
Allow_url_fopenはPHP構成で有効になります。
リモートサーバーは正常に応答します。
ネットワーク接続は正常です。
それ以外の場合は、失敗を返します。