別ディレクトリから PHP を実行するとき相対パスはエラーになる


2022年6月6日

皆さんこんにちは、フロントエンドエンジニアの末ちゃんです。 つい先日、しばらくぶりに Cron を使って PHP を定期実行しようとしたのですが、その際PHPのrequire文でうっかり相対パスを使用してエラーを発生させてしまいました。

エラーの内容

PHP Warning:  require(./hogehoge.php): failed to open stream: No such file or directory in /home/hogehoge/fugafuga/foo-bar.php on line 16
ご覧の様に、require で呼びだしたファイルが開けませんでした。というエラーです。

Cron の内容

Cron には以下のように記述をしていました。
15 2 * * * php foo-bar.php

エラーの原因

シンプルにPHPの仕様の問題です。 PHPではファイルを実行したディレクトリの場所がカレントディレクトリになってしまいます。上記Cronは /home/hogehoge/fugafuga ではない場所で実行されているので、hogehoge.php は行方不明となってしまっていました。

エラーの解決方法

解決方法1 実行ディレクトリを移動する

Cron のコマンドで、実行ディレクトリを移動することで解決できます。
15 2 * * * cd /home/hogehoge/fugafuga && php foo-bar.php

解決方法2 絶対パスでrequireする

require文を絶対パスで記述することで、この問題は解決できます。通常はこの方法を使用して記述します。
require(dirname(__FILE__)."/hogehoge.php")

まとめ

久しくPHPを書いていなかったので、完全にうっかりしていました。 ファイル参照をする際は、各言語の仕様に則って正しく書くように気をつけていきたいものです。
Share Button