ドキュメントルートの取得 - PHPプロ!Q&A掲示板

1219

  • 0P

ドキュメントルートの取得

質問日時 / 2008年6月8日 19:49    回答数 / 6件

Questioner:  yuu_a0  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません


はじめまして。
PHP をはじめたばかりの初心者ですがよろしくお願いいたします。

トップページのパスを取得するために $_SERVER['DOCUMENT_ROOT'] を使用したのですが、

 ローカル環境の XAMPP ではちゃんと取得できるんですが、レンタルサーバーにアップたところ var/www/html となって期待したものが取得できませんでした。

試しに __FILE__ と  $_SERVER['PHP_SELF'] を使用して取得しようとしたのですが、__FILE__ はそのファイル自身のパスが取得されるのに対し、$_SERVER['PHP_SELF'] では、実行側のパスになってしまうためうまくいきません

今やろうとしていることは、クラスを作成して、他のファイルから呼び出すということをしてます。
クラスの中で、他のファイルを相対パスで呼び出しているため、クラスを呼び出すファイルごとにパスが変わってしまって、エラーになってしまいます。

それで、include_path を指定しようとしたのですが、パスの取得で行き詰ってしまいました。


ファイルの構成の抜粋ですが下のようになっています。

/cgi/ ← cgi はドキュメントディレクトリに置いてあります。
  + class/
      + csv_class.php
  + data/
      + data.csv
  + admin/
      + admin.php
  + show.php

/cgi/class/csv_class.php で data フォルダ内の data.csv を読み書きを行っています。
/cgi/class/csv_class.php を読み込んで /cgi/admin/admin.php で data.csv の編集を行い、cgi/show.php で data.csv の表示をしようとしているのですが、data フォルダのパスがずれてしまいうまくいきません。

レンタルサーバーなので、php.ini も httpd.conf も編集できないので何かよい方法はありますでしょうか。

実行環境のバージョンはローカル側は PHP5.2.5、 サーバー側は PHP4.3.10 です。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01kaitau案1. .htaccessファイルの設置が許可されているな
┃┗A01-1yuu_a0返信ありがとうございます。 結局 案2のような方
┃ ┗A01-1-1kaitauんんん? > csv_class.php で  > $cgi_path = st
┗A02pascalとりあえずドキュメントルートの話に絞って。 var/
 ┗A02-1yuu_a0$_SERVER['DOCUMENT_ROOT'] の認識が間違ってたみた
  ┗A02-1-1NurseAngelDocumentRootはインターネットに公開するサイトトップ

回答一覧

並び替え:

A01 満足
answererkaitau [6月9日 10:24]

案1. .htaccessファイルの設置が許可されているなら、 .htaccess で php_value include_path してみる
案2. admin.php の中でbasename(__FILE__)してからstr_replace('admin/','class/',取得パス)とかしてみる
案3. 特定のディレクトリ以下のファイル構成がいつも同じなのであれば、開き直って admin.phpで include_path '../class/csv_class.php' など、全部「一回階層上+ディレクトリ名」の相対パスで記述とかしてみる

ところで、ローカルとサーバのPHPのバージョンは合わせた方がいいと思いますよ。
まぁ、マイナーverとまでは言わずとも、ローカル環境をPHP4.4.8位にはしておいた方が良いかと。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryuu_a0 [6月10日 11:41] (最終編集:6月10日 11:58)

返信ありがとうございます。

結局 案2のような方法でパスを取得することにしました。

csv_class.php で 
$cgi_path = str_replace('class','',__FILE__);
$cgi_path = strtr($cgi_path, '\\', '/'); ← windows 対策

csv_class が色んなところから呼ばれるし、__FILE__は固定なので、csv_class.php を移動しないかぎりどこから呼ばれても、同じパスが得られるからです。

トップのパスが得られる関数があるのかと思っていたんですが無いんですね。

.htaccess で include_path の指定もできるんですね & XAMPP で PHP のバージョンの変更ができるんですね。知りませんでした。

ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerkaitau [6月11日 10:24]

んんん?

> csv_class.php で 
> $cgi_path = str_replace('class','',__FILE__);
> $cgi_path = strtr($cgi_path, '\\', '/'); ← windows 対策

csv_class.phpの中で操作して達成できてますか?
やろうとしていたことは、「クラスを作成して、他のファイルから呼び出す」ですよね?
だから、(csv_class.phpでなく)呼び出す他のファイルが、自分の位置を割り出して、
csv_class.php がどこにあるか見つけないといけないはずですよね?

その一つの手段として、DOCUMENT_ROOTからの位置で探そうと思ったけど、
今回のレンタルサーバはDOCUMENT_ROOTは静的htmlしか置けない場所で、PHPを置く場所
が(RewriteRuleやAliasで)全然違うから困ることなっている
ということだと思ったのですが。。。

この意見に回答する

ツリーへ TOPへ

A02 参考になった
answererpascal [6月9日 13:00]

とりあえずドキュメントルートの話に絞って。

var/www/html で正しいと思いますが・・・
(正確には /var/www/html だと思いますが。)

どんなパスを想定していたのでしょう?
ローカルはWindowsでサーバはLinux(?)なので、$_SERVER['DOCUMENT_ROOT']で返ってくるパスが全然違うのは当たり前です。

この意見に回答する

ツリーへ TOPへ

A02-1
replyeryuu_a0 [6月10日 11:55]

$_SERVER['DOCUMENT_ROOT'] の認識が間違ってたみたいです。

今のところ $_SERVER['DOCUMENT_ROOT'] はトップのパスとは限らないって認識なんですが、大丈夫でしょうか

それから /var/www/html を眺めてて思ったんですが、これはサーバ側パスのフォーマットか何かでしょうか

/var/www/html
      ↓
/home/(サイトID)/public_html/ ← 取得したかったのはこれです
var が home になって、www がサイトIDになって、html がトップフォルダの public_html になるとか。


それともインターネットアドレスで、
/var/www/html
      ↓
http://(サイトID)/index.html

で、ユーザーごとにサーバー側で値を代入してる?今のところドキュメントルートって何って感じです。
自分でもちょっと調べてみます。

すみません環境書き忘れてました
ローカル側が WindowsXP
サーバー側が UNIX (バージョンはわかりません)
です。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerNurseAngel [6月10日 15:10] (最終編集:6月10日 15:15)

DocumentRootはインターネットに公開するサイトトップの、「サーバ内の」パスです。
URLとは直接は関係ありません。
両者を結びつけるのは別のプログラムの仕事です。


DocumentRoot以下は共通しています。
/var/www/htmlがDocumentRootであり、
http://hoge.com/がURLならば、
/var/www/html/index.html→http://hoge.com/index.html
/var/www/html/a/b/c/d.html→http://hoge.com/a/b/c/d.html
と位置づけられます。


DocumentRootはApacheの設定で好きなところに置けます。
フリーのHPスペースなど多くのサーバでは
/home/hogehoge/public_html
ですが、これはユーザが複数いる場合にユーザ毎に振り分けるためです。

商用サイトやレンタルサーバ等では
/var
以下にDocumentRootを設定している場合もあります。

ちなみに
/var/www/html
は、Apache2をインストールする際のデフォルトのDocumentRootです。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)