[PHP]$_SERVER[‘DOCUMENT_ROOT’]で値が異なる場合の対処法

ホームページ作成

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/";
?>

参考:PHPマニュアル:コア php.ini ディレクティブに関する説明

コメント

タイトルとURLをコピーしました