PHP
Apache
macos
PHP7
macOSMojave

MacOS環境におけるPHPスクリプトのrequire_onceでTHE突破ファイル


記事の概要

ここ数日、僕の前に立ちふさがっていた

PHPのrequire_onceは


  • php.iniの設定

  • パス設定に一捻り

  • Apacheのドキュメントルートの理解

が必要です。

こんな単純な事にたどり着くのに

何日掛かったやら…


環境

MacOS Mojave 10.14.4

Apache 2.4.34

PHP 7.1.23


背景

「基礎からのMySQL 改訂版」にて

練習用webアプリ内にrequire_onceを用いて

重要な情報を別フォルダ(公開されないフォルダ)から

読み込む、という内容があります。

その際に躓き、対処法を探しました。


内容

僕の環境だと、当初はこの様な記述になっていました。


kantan_insert.php

require_once "/Library/WebServer/Documents/lesson/data/db_info.php";


この行を追加した途端、

このPHPスクリプトで実行される画面には

何も表示されなくなってしまいました。

色々な可能性を手当たり次第探しましたが、

全部予想外れで、

一向に回復しそうにありません...


第一突破!!!

ふと思いついたのが、

「ブラウザ上にエラーって表示されないんだな」

って事です。

そこで、phpのエラー表示について調べたところ...


php.ini

display_errors = On


ちゃんとあるじゃないとですか。

これでブラウザ上にエラーが出る様に

なったとですよ。

Warning: require_once(/Library/WebServer/Documents/lesson/data/db_info.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/lesson/kantan/kantan_insert.php on line 13

Fatal error: require_once(): Failed opening required '/Library/WebServer/Documents/lesson/data/db_info.php' (include_path='.:') in /Library/WebServer/Documents/lesson/kantan/kantan_insert.php on line 13

しかし、

ちゃんと絶対パスで読み込みファイルの場所を指定したのに

No such file or directoryになるのはなんでだろう...

またしばらく調べると、

PHP自体にinclude(require含む)の設定が

あることを知りました。


php.ini

allow_url_include = On


これでいけるやろ、思うてましたが甘かったです。

Warning: require_once(/Library/WebServer/Documents/lesson/data/db_info.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/lesson/kantan/kantan_insert.php on line 13

Fatal error: require_once(): Failed opening required '/Library/WebServer/Documents/lesson/data/db_info.php' (include_path='.:') in /Library/WebServer/Documents/lesson/kantan/kantan_insert.php on line 13

ダメじゃん。


第二突破!!!

こちらのサイトによると、ルートパス

(「サーバのルートからの指定の場合」って

  書いてあるのを覚えておこう)

で読み込んだファイルには

$_SERVER['DOCUMENT_ROOT']

を使わないといけないそうな。

想定したファイルが読み込めない可能性があるとのこと。

そこで、僕は下記の様に記述しました。


kantan_insert.php

require_once $_SERVER['DOCUMENT_ROOT']."Library/WebServer/Documents/lesson/data/db_info.php";


すると...

Warning: require_once(/Library/WebServer/Documents/Library/WebServer/Documents/lesson/data/db_info.php): failed to open stream: No such file or directory in /Library/WebServer/Documents/lesson/kantan/kantan_insert.php on line 13

Fatal error: require_once(): Failed opening required '/Library/WebServer/Documents/Library/WebServer/Documents/lesson/data/db_info.php' (include_path='.:') in /Library/WebServer/Documents/lesson/kantan/kantan_insert.php on line 13

あれ、/Library/WebServer/Documentsが

ダブってるとじゃないですか。


第三突破!!!

...あ、さっきのサイトに「サーバのルートからの指定」って

書いてあんじゃん。

僕の環境のApacheのDocumentRootは「/Library/WebServer/Documents」。

要するに、「$_SERVER['DOCUMENT_ROOT']」は

サーバのルート(ドキュメント)ディレクトリを

動的に読み込んでくれるものだったのですね。

最終的に、下記の様になりました。


kantan_insert.php

//サーバ(ドキュメント)ルート読み込み

$webroot = $_SERVER['DOCUMENT_ROOT'];
//データベース情報取得
if(require_once($webroot . "/lesson/data/db_info.php")){
print ("データベース情報読み込み成功<br>");
}else{
print "データベース情報読み込み失敗";
exit();
}

これで、僕は気持ちよく突破!!!を果たしました。


結論

環境構築では幾多もの乗り越えるべき壁があります。

しかし、学ぶことも多いです。

粘り強く原因を探しましょう。

いいことあるかもですよ。

PHPやMySQLの文法を勉強する時間よりも

環境構築で苦戦する時間の方が長いっていう。


参考文献

基礎からのMySQL 改訂版

PHPのエラー表示設定について

https://qiita.com/shotets/items/3c95aef631b2c5eadae5

phpで、includeやrequireできないときの対処法

https://tech2.kimihiko.jp/phpで、includeやrequireできないときの対処法/

PHPのrequire()でファイルが読み込めない時に確認すべきこと

https://takuo4649design.com/weblog/note/archives/862