Hash_hmac_file()は、ハッシュ値を計算するために指定されたファイルの内容を読み取る必要があります。ファイルの読み取り権限が不十分な場合、PHPはエラーを返したり、正しく実行したりしません。
<span><span><span class="hljs-built_in">Warning</span></span><span>: hash_hmac_file() [</span><span><span class="hljs-keyword">function</span></span><span>.hash-hmac-file]: open_basedir restriction </span><span><span class="hljs-keyword">in</span></span><span> effect. File(/</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/file) </span><span><span class="hljs-keyword">is</span></span><span> </span><span><span class="hljs-keyword">not</span></span><span> </span><span><span class="hljs-keyword">within</span></span><span> the allowed path(s)
</span></span>
ファイルの読み取り権限が正しく設定されていることを確認してください。次のコマンドでファイル権限を確認できます。
<span><span><span class="hljs-built_in">ls</span></span><span> -l /path/to/file
</span></span>
ファイルに読み取り許可がない場合は、 CHMODコマンドを介してファイル許可を変更できます。
<span><span><span class="hljs-built_in">chmod</span></span><span> 644 /path/to/file
</span></span>
また、共有ホスティングまたはopen_basedir制限を使用する環境でコードを実行する場合、ファイルパスが許可されたディレクトリスコープ内にあることを確認してください。この設定は、 php.iniを変更するか、システム管理者に連絡することで調整できます。
Open_Basedirは、スクリプトがアクセスできるファイルパスを制限するPHPのセキュリティメカニズムです。ファイルがopen_basedir制限の外側にある場合、 hash_hmac_file()がファイルにアクセスできないため、エラーが発生します。
<span><span><span class="hljs-built_in">Warning</span></span><span>: hash_hmac_file() [</span><span><span class="hljs-keyword">function</span></span><span>.hash-hmac-file]: open_basedir restriction </span><span><span class="hljs-keyword">in</span></span><span> effect. File(/</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/file) </span><span><span class="hljs-keyword">is</span></span><span> </span><span><span class="hljs-keyword">not</span></span><span> </span><span><span class="hljs-keyword">within</span></span><span> the allowed path(s)
</span></span>
php.iniのopen_basedir設定を確認して、アクセスするファイルへのパスが許可ディレクトリ内にあることを確認します。
共有ホスティング環境であり、 php.iniを変更できない場合は、アクセスできるディレクトリにファイルを移動するか、ホストサービスプロバイダーに連絡してopen_basedir設定を調整してください。
ファイルパスエラーは、 hash_hmac_file()が適切に機能しない一般的な理由の1つです。パスエラーは、相対パスまたは絶対パスの不適切な構成によって引き起こされる場合があります。
<span><span><span class="hljs-built_in">Warning</span></span><span>: hash_hmac_file(/invalid/</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/file): failed </span><span><span class="hljs-keyword">to</span></span><span> </span><span><span class="hljs-keyword">open</span></span><span> stream: </span><span><span class="hljs-keyword">No</span></span><span> such file </span><span><span class="hljs-keyword">or</span></span><span> directory
</span></span>
hash_hmac_file()に渡されたパスが正確であることを確認してください。相対パスを使用する場合は、現在の作業ディレクトリ( getCWD() )がファイルの実際のストレージ場所と一致していることを確認してください。
パスの問題を回避するために、絶対パスを使用してみてください。例えば:
<span><span><span class="hljs-variable">$file_path</span></span><span> = </span><span><span class="hljs-string">'/var/www/html/uploads/myfile.txt'</span></span><span>;
</span><span><span class="hljs-variable">$secret_key</span></span><span> = </span><span><span class="hljs-string">'your-secret-key'</span></span><span>;
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_hmac_file</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$file_path</span></span><span>, </span><span><span class="hljs-variable">$secret_key</span></span><span>);
</span></span>
hash_hmac_file()を呼び出す前に、ファイルが存在するかどうかを確認するのが最善です。ファイルが存在しない場合、 hash_hmac_file()を直接呼び出すとエラーが発生します。
file_exists()関数を使用して、ファイルが存在するかどうかを確認します。
<span><span><span class="hljs-variable">$file_path</span></span><span> = </span><span><span class="hljs-string">'/path/to/file'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>)) {
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_hmac_file</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$file_path</span></span><span>, </span><span><span class="hljs-variable">$secret_key</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"File does not exist!"</span></span><span>;
}
</span></span>
ファイル自体の権限に加えて、PHPスクリプトを実行しているユーザー( www-dataなど)もファイルに十分な読み取り権限を持つ必要があります。 Hash_hmac_file()は、PHPプロセスにファイルを読み取る許可がない場合にも失敗します。
PHPプロセスのユーザーがファイルに許可を読み取っていることを確認してください。次のコマンドを使用して、PHPプロセスのユーザーを確認できます。
<span><span>ps aux | grep php
</span></span>
PHPプロセスに権限がない場合は、 chownコマンドを使用して、ファイルの所有者をPHPプロセスユーザーに変更します。
<span><span>sudo </span><span><span class="hljs-built_in">chown</span></span><span> www-data:www-data /path/to/file
</span></span>
不明なエラーが発生した場合、PHPエラーレポートを有効にすることで問題をデバッグできます。次のコードをスクリプトの上部に追加すると、エラーメッセージのキャプチャと表示に役立ちます。
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'display_errors'</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">error_reporting</span></span><span>(E_ALL);
</span></span>
エラーレポートを有効にした後、PHPは詳細なエラー情報を表示して、問題をすばやく見つけるのに役立ちます。