• ベストアンサー

file_get_contents()の動きが読めません…。

いつもお世話になっております。(環境:PHP5.2.5) file_get_contents()を外部ファイル(クラス)の中で使ってデータを取得し、 そのクラスをメインファイルで読み込み、 メインの方で、その得たデータを使おうとしています。 (仮に、メインファイルの名前をmain.phpとしておきます。) その際、クラスの中に書くコードについてですが、 下記のように、2通りの書き方が浮かびました。 (仮に、このクラスファイルの名前をclass.phpとしておきます。) //------------------------------------------------------------ $url= 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; $html = file_get_contents($url); //------------------------------------------------------------ $url= $_SERVER['SCRIPT_FILENAME']; $html = file_get_contents($url); //------------------------------------------------------------ で、パターン2の方は、うまく行くのですが、 パターン1の方の処理だと、なぜか、 その処理を行おうとしているファイル(main.php)のダウンロードを開始しようとするのです! ブラウザに「ダウンロードウィンドウが立ち上がる…」という状況です。 パターン1では、 $url_1 = "http://example.com"; のような、「http://」で始まる書式のURLを file_get_contents()の引数に入れることになりますが、 これ自体は問題ないと思っています。 実際、クラスで読み込む方法ではなく、file_get_contents()を使う方法では、 問題なく動いたからです。 つまり、 メインファイルに、 上記の2パターンを書いて試した場合には、問題なくうまくいったのです。 言い換えれば、 メインファイルだけで完結している場合には、 どうも問題は起こらないようで、 クラスなどで引っ張ってくると、問題が起こるようなのです。 (私の勘違いの可能性もありますが…。) 以上、まとりのない文章で、申し訳ありません。 自分でも、なにがなにやら、よく分かっていないため、 多くの情報を提供することで、なんとかアドバイスを頂けないかと思い、 ひとまず、使えそうな情報を並べてみました。 チェック項目など、提示いただければ、 適宜、それに従って対応致しますので、 どうかご助言をよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.12

1ヶ月ほど、時間が空いてしまいましたが、 //---(2)--------------------------------------------------------- $url= $_SERVER['SCRIPT_FILENAME']; $html = file_get_contents($url); //------------------------------------------------------------ この方法ですと、PHPのスクリプトのソースコード全てを取得することになってしまうように思えますがそれでいいのでしょうか。 そうするとページタイトルを取得したいというオーダーでは多少面倒が生じるように思えますがいかがでしょう。 前回回答では「ページタイトルを取得したい」という意図までが見えなかったために、 ob_startで全HTMLを取得して、Sessionに渡しておいてやり、次のPHPスクリプト内でソレを確認すればよいのではないか、という提案をしました。 ページタイトルだけでよいのであれば、ob_startを使わずに、はなから、ページタイトルの文字列をSessionに渡してやればよいのではないかと思います。 具体的な流れとして、 march4さんの作成されたサイト内では常にSession、またはCookieに、最終到達時点のページタイトルを格納するようにして、 ・どこかのサイトからそのページにアクセスされる ・どこから来たかをリファラーなりを見て確認 ・リファラー情報が自サイトのものであれば、Session又はCookieに格納しておいたページタイトルを取得する。そうでなければfile_get_contentsで外部サイトのHTMLを取得してページタイトルを取得する。 ・上記が全て完了したら、Session又はCookieに現在のページタイトルを格納する というようにすれば良いのではないでしょうか。

march4
質問者

お礼

hogehogeさん、おかえりなさい! ご無事のようで、安心致しました。 またこちらへ戻ってきて頂き、本当に嬉しいです。 hogehogeさんのいらっしゃらない間に、 私はちょこちょこ質問をしており、 まだ締め切っていないものも中にはありますので、 もしよろしければ、ご助言頂けると嬉しいなと思います。 今後とも、どうぞ宜しくお願い致します。 さて、こちらの質問に話を移しまして、 今回頂いた回答をざっと読ませて頂きましたが、 大変分かりやすくまとまっているな、という印象を受けました。 まだしっかりとは読んでいませんが、おそらく問題なく理解でき、 また、疑問の解決にも至れそうです。 頂いた回答をしっかり読み終えましたら、 改めて補足蘭にて、返事をさせて頂く予定です。 ホゲホゲさんが復帰されて、本当に嬉しいです、はい。(^_^)ノ

march4
質問者

補足

しっかり、理解してまいりました。 >この方法ですと、PHPのスクリプトのソースコード全てを取得することになってしまうように思えますがそれでいいのでしょうか。 そうですね。 スマートな方法とは言えないですよね。 >ページタイトルだけでよいのであれば、ob_startを使わずに、はなから、 ページタイトルの文字列をSessionに渡してやればよいのではないか はい、この方法でやってみようと思います! スッキリ理解できました。 どうもありがとうございます!

すると、全ての回答が全文表示されます。

その他の回答 (11)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

焦点がよくわかりませんが。 クラスを書いたりしたPHPのコードを取り込みたいなら include、include_once、require、require_onceを使います。 また http:// 経由でPHPファイルを読み込む場合は PHPとして処理・出力した結果を取り込むことに注意してください。 実際のソースがわからないのでよくわかりませんすいません。 あと $url= 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']; は、ちゃんとした値になってますか?

march4
質問者

補足

アドバイスをどうもありがとうございます。 質問文をさらに補足しますと、 まず、classを作成します。 そのclassの機能は、 ・今まで居たページのhtmlソースを取得 ・今、まさにやって来ているページのhtmlソースを取得 で、それを実現するために、 file_get_contents()を使っているわけですが、 今、まさにやって来ているページのパス($url)を file_get_contents()の引数に与える際に、 (1) $url= 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ----------------- (2) $url= $_SERVER['SCRIPT_FILENAME']; (1)、(2)の両方を考えました。 しかし、実際には、(1)の形式では、質問文の通り、ダメでした。 >ちゃんとした値になってますか? はい、なっております。 この、(1)の書式をそのまま、 main.phpで使うと正常に動きますので、 問題なのはclass.phpで、この、(1)の書式を使う点にあるようです。 /***(class.php)***/ <?php class MyClass{ public function GetPageHtml(){ $url= 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; $html = file_get_contents($url); echo $html; }//end*GetPageHtml }//end*MyClass ?> //------------------- /***(main.php)***/ <?php require_once '(~~~/class.php)'; $obj = new MyClass; $obj->GetPageHtml(); ?> //------------------- ソースをざっくり書けば、こんな感じです。 ページ遷移の例として、 before_main.php ↓ main.php ↓ after_main.php のような感じを想定しております。 beforeも、afterも、ソースコード自体は、mainとほぼ同じで、 どれも、MyClassを呼び出して使っています。 ページ遷移の状況を得る事が目的ですから、当然と言えば当然ですが。 複数のphpファイル間を遷移させる様な構成となっているため、 「phpで」出力したHTMLをfile_get_contents()してくることになるわけですが、 このことと、おかしな結果 つまり、main.phpスクリプトファイルのダウンロードが始まること とが、どうも関係しているような気がするのですよね…。 気のせいかしら…。

すると、全ての回答が全文表示されます。

関連するQ&A

  • file_get_contentsについて

    file_get_contentsについて教えてください。 現在あるサイトを定期的にチェックし、特定の文字列が存在したら メールを送るというものを作っています。 そのサイトチェックの際にfile_get_contentsを使って、 サイトの中身をチェックしています。 $tmpPage = file_get_contents('~.cgi?aa=bbb'); 上記の用に記述して$tmpPage内の文字列をチェックすることで 実現できているのですが、本来このサイトは携帯向けのページのため ヘッダー情報を付加して下記のように記述しています。 $opts = array( 'http'=>array( 'method'=>'GET', 'header'=>'Host :www.XXXXX.jp' . PHP_EOL . 'User-Agent :KDDI-XXXXXXXXXXXX' . PHP_EOL . 'x-up-subno :XXXXXXXXXXXX.ezweb.ne.jp' ) ); $context = stream_context_create( $opts ); $tmpPage = file_get_contents( '~.cgi?aa=bbb', false, $context ); このように記述すると Warning: file_get_contents('~.cgi?aa=bbb') [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found とエラーが返ってきてしまいます。 アクセスするURLをYahooやGoogleにすると問題なく動いているので、 問題なのはチェックするサイトのURLが「XXX.cgi?aa=bbb」と なっているのがダメなのではないかと思っています。 アクセス先のURLが単純な「.html」ではないまたは、ヘッダー情報を 付加する場合、file_get_contentsの使い方が変わるのでしょうか。 ご存知の方がいらっしゃれば是非教えてください。 よろしくお願いします。

    • 締切済み
    • PHP
  • file_get_contents()の引数

    PHPのfile_get_contents()関数についてです。 file_get_contentsに付けるパラメータはどのようなものがありますか? 解りやすく教えて頂けると助かります よろしくお願いします!

    • 締切済み
    • PHP
  • file_get_contentsがうまくいかない

    echo $url2 = 'https://go.jp/servicef/112233'; echo $scrape2 = file_get_contents($url2); であれば上手くいきますが $aa = '112233'; echo $url2 = 'https://go.jp/servicef/'.$aa; echo $scrape2 = file_get_contents($url2); とした場合うまくいきません。原因わかる方いないでしょうか??

    • 締切済み
    • PHP
  • file_get_contentsでなにもとれない

    file_get_contentsでなにもとれない $url = 'http://xxxxxxxxxx'; $html = file_get_contents($url ); echo $html; とした時何も表示されません 他のサーバーに移植したらとれるのでインフラの問題だと思うのですが何が考えられますでしょうか。 iptablesで外部にポート80あけてもだめでした。 ちなみにうったコマンドは iptables -A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT

    • ベストアンサー
    • PHP
  • 「include」と「file_get_contents」の違いがよく

    「include」と「file_get_contents」の違いがよく分かりません。 ネットで調べてみました。 ・「include」… 指定したファイルを読み込んで評価 ・「file_get_contents」… 指定したファイルの内容を全て読み込んで文字列として返す で、実際に試してみたのですが、「file_get_contents」の方がよく分かりません。 具体的には、下記を試すと、結果が、tt string(44) "" となるのですが、ttって何ですか? 評価をしないで文字列として返したということでしょうか? それでなんで tt になるのでしょうか? ▼hoge.php <?php $s = file_get_contents("test1.php"); var_dump($s); ?> ▼test1.php <?php echo ("1どうなるのかな"); ?>

    • ベストアンサー
    • PHP
  • file_get_contents()エラー

    mysqlで構築したデータベースに画像を格納しようとしています。 ローカル環境では問題無く動作していたのですが、お名前.comのレンタルサーバーでやってみるとエラーがどうしてもでます。 レンタルサーバーの種類は【共用サーバーSD】です。 DB接続の部分のDB名、ユーザー名、パスワード等はきちんと変更しました。 【エラーの内容】 Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in /********/*****/****/****touroku.php on line 24 調べてみると、レンタルサーバーではfile_get_contents()が使えない場合があり、設定を変更剃る必要があるという記事を目にしたのですがつまづいています。 file_get_contents()を使えるようにするにはどうしらいいでしょうか。 @を前に付けてエラーをでなくするということもできるとは思うのですが、できれば@を使わずに対処できればと考えています。 今回のようなケースについては、ローカルできちんと動作していたということは、レンタルサーバー側での設定の問題なのかなと考えているのですが、いかがでしょうか。 対処法、アドバイスをいただけないでしょうか。よろしくお願いします。

    • ベストアンサー
    • PHP
  • file_get_contents()の挙動につい

    今、PHPを使用したHTTP通信につきまして困っております。 何でも結構ですのでアドバイスいただけましたら助かります。。 file_get_contents()を利用して、REST通信をしています。 200応答時は問題無いのですが、404や400応答時に file_get_contents()はfalseしか返さず、 本来受信しているはずのコンテンツを取得することができません。 色々試していたのですが、解決策が見つかりませんでした。 よろしくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • file_get_contents 画像直URL

    file_get_contents($url);した際、画像の直URLがあったら、画像をローカルに保存して、URLを書き換えたいのですが、どうやればいいでしょうか? if(preg_match("/http:\/\//", file_get_contents($url))) { ?? } また、画像をローカルに保存って、PHPで出来るのでしょうか?

    • ベストアンサー
    • PHP
  • file_get_contents()にて文字化け

    PHPにてfile_get_contents()関数を使用し、ソースを読み込んだのですが、文字化けしてしまいます。 ※読込先は海外サイトです。日本語は利用されていません。 エンコードの問題かと思い、試行錯誤しましたが、うまくいきません。 解決方法を教えてください。 ちなみに、ソースの読み込み事態はできているので、ユーゼエージェントで、はじかれていることはないと思います。 [相手サイトの情報] ・UTF-8を宣言している ・日本語は使用していない ※URLを$urlとします。 [ソース] header("Content-type:text/html;charset=UTF-8"); echo mb_convert_encoding(file_get_contents($url),'UTF-8','auto'); file_get_contents($url)単体でもアウトでした。 お願いしますm(_ _)m

    • 締切済み
    • PHP
  • file_get_contents関数で引数をURLにすれば、HTML

    file_get_contents関数で引数をURLにすれば、HTMLソースを取得できるのはわかるのですが、 例えば、URLが制限 255バイト?を超える場合、GETでなくPOSTタイプでHTMLを取得したいのですが、file_get_contents関数のように手軽にPOSTタイプで取得できる関数はありますか? PHP5を使っています。

    • 締切済み
    • PHP
このQ&Aのポイント
  • Lenovo ideapad3を使用してトリプルディスプレイを実現する方法について教えてください。
  • PCのUSB-Cポートで繋ぐハブドッキングステーションを使用しているが、モニターが識別されない問題が発生しています。
  • モニター2台とHDMIケーブル2本を直接PCのポートに繋ぐと正常に動作するため、ハブドッキングステーションの問題か、他の方法でトリプルディスプレイを実現する方法があるか教えてください。
回答を見る

専門家に質問してみよう