PHP
Heroku

初心者がherokuでrequire_onceしたときに困った話


どう困ったのか?

本当に初歩的なことだとは思いますがたとえば、下のようなファイル構造になっているとき


  • test.php

  • testfile


    • hoge.php




test.php

<?php

require_once ("./testfile/hoge.php"); //'testfile'というファイルの'hoge.php'を読み込む

echo $test; //'$test'は'hoge.php'から得る
?>



hoge.php

<?php

$test = 'hogehoge'; //'$test'に「hogehoge」を格納する
?>


ローカル環境で'test.php'を実行すると

$ php test.php

//hogehoge

このように、正常に読み込まれ実行されます。


Herokuの環境で実行すると

Herokuの環境で実行してみると'hoge.php'が読み込まれません

ファイルの階層もチェックし、ローカルと同じ状態になっているにも関わらずです。

これが無理なら、相対パスでなく絶対パスでファイルにアクセスしてみようと試みました。


相対パスから絶対パスへ

'index.php'につぎのようなプログラムを実行させ、絶対パスを調べました。


index.php

<?php

echo __DIR__;
//「/app/index.php」と出力された
?>

これを参考に'test.php'のコードを次のように書き換えました。


after__test.php

require_once ("/app/testfile/hoge.php"); // '.'を削除し、'/app'を先頭に追加

echo $test;
?>



再度、Herokuの環境で実行

書き換えたあと、再びデプロイして実行すると、読み込まれませんでした。。

絶対パスが間違えているのかと思い、ファイルの階層構造を念入りに調べましたが、

絶対パスが間違っていないことがわかっただけで読み込むための手掛かりは得られませんでした。


解決策

ここで、ふと思いつきました。

DIRをそのままrequire_onceの構文に入れてみたら、うまいこといくのでは?と。


test.php

<?php

require_once __DIR__ . ("/testfile/hoge.php") // '/app'を削除し、'__DIR__ .'を追加

echo $test;
?>


このように書き換え実行すると、正常に読み込まれました!

なぜ、直接絶対パスを書いた場合では読み込まずに、DIRをもちいると読み込むのかは初心者の私にはわかりませんでした。

(たぶん、詳しい人がコメントしてくれるのでそれを参考に追記します。)


結論

DIRを積極的に使おう!

DIRを用いれば違う環境で使用するときに、パスの書き換えの必要が(ほとんど)なくなると思います。

そして、今回のように困ることやエラーも減る要因になると思います。

ここまで読んでいただき、ありがとうございました。