PHPでinclude関数や、require関数を使う場合、サーバー環境変数$_SERVER[‘DOCUMENT_ROOT’]と合わせて使うケースを見かけます。
しかし、レンタルサーバーの設定によっては、$_SERVER[‘DOCUMENT_ROOT’]で想定した値が取れない事があったので解決法をまとめました。
サーバー環境変数$_SERVER[‘DOCUMENT_ROOT’]はサーバーによって値が変わるため、以下のようなコードではサーバーが変わると想定したパスが取得できない場合があります。
$_SERVER[‘DOCUMENT_ROOT’]が想定した場合と異なるケース
apacheなどのバーチャルホスト環境でこの現象は発生します。
$_SERVER[‘DOCUMENT_ROOT’]はバーチャルホストでないドキュメントルートの値を返す場合があるため、以下のようなプログラムではエラーとなる場合があります。
<?php
include($_SERVER['DOCUMENT_ROOT']."/parts/header.php");
?>
$_SERVER[‘DOCUMENT_ROOT’]を変数に代入
このようなコードだと、サーバー環境変数$_SERVER[‘DOCUMENT_ROOT’]で値が正常に取得できない場合でも、直接パスを記載すれば解決できます。
<?php
$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/parts/header.php");
?>
マジカル定数「__DIR__」に置き換える
include関数を複数のファイルで利用している場合、いちいち変数に代入するのは手間がかかります。
そういった場合は以下のような定数__DIR__を利用してパスを取得します。
この定数__DIR__はdirname(__FILE__)と同じ値を返す定数です。
<?php
include(__DIR__."/parts/header.php");
?>
参考:PHP でファイルをインクルードするときは絶対パスを使おう
php.iniでauto_prepend_fileを利用する
これまではファイルを修正する方法でしたが、php.iniで設定をする方法もあります。
auto_prepend_fileを設定したファイルはPHPが実行する前に必ず読み込まれるため、このように強制的に$_SERVER[‘DOCUMENT_ROOT’]を上書きする事も可能です。
php.iniの設定
auto_prepend_file = /var/www/html/path.php
path.phpの中身
<?php
$_SERVER['DOCUMENT_ROOT'] = "/var/www/html/";
?>
コメント