質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

file_get_contentsがPHP5.3だと動かない

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 3,019

yamaotakuro

score 14

前提・実現したいこと

PHPで対象ページの中身を取得したいです。
php5.5、5.4では同様のコードで動作しています。

発生している問題・エラーメッセージ

エラーが出ずタイムアウトも表示されません。
ずっとローディング状態で遷移しません。

該当のソースコード

function get_page_title($url) {
    $html = file_get_contents($url);
    $html = mb_convert_encoding($html, "UTF-8", "auto" ); 
    if ( preg_match( "/<title>(.*?)<\/title>/i", $html, $matches) ) { //(3)
        return $matches[1];
    } else {
        return false;
    }
}

//出力する箇所
<?php for($i = 1; $i <= 47; $i++): ?>
<tr>
  <td><a href="<?php echo $url;?>" target="new"><?php echo get_page_title($url); ?></a></td>
</tr>
<?php endfor; ?>

試したこと

cURLでの取得も試しましたが同様に5.3では動作しませんでした。

function curl_get_contents( $url, $timeout = 60 ){
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_HEADER, false );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
  curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
  $result = curl_exec( $ch );
  curl_close( $ch );
  return $result;
}


php.iniの設定は
allow_url_fopen = On
allow_url_include = Off
等は確認しています。

上記のコードを踏まえ原因、対策があればご教授いただきたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2016/11/29 09:29

    PHP 5.4と5.3の比較は、「同じサーバ」で行なっての話でしょうか。

    キャンセル

  • date

    2016/11/29 09:34

    apacheのlogに何か書かれていませんでしょうか

    キャンセル

  • yamaotakuro

    2016/11/29 09:45

    >maisumakun様 同一サーバーではありません。

    キャンセル

  • yamaotakuro

    2016/11/29 09:46

    >date様 5.3のサーバーではapacheのログは見ることができません。

    キャンセル

回答 4

check解決した方法

0

PHPでの取得は諦めてjavascriptで取得するようにします。
皆さまたくさんのアドバイス本当にありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「php5.5、5.4では同様のコードで動作しています。」同じサーバー(特にネットワーク関連)でPHP5.3.xでは動作せず php 5.4.x移行では動作するのでしょうか?
単純に ネットワークに問題があるとかではないのでしょうか

Proxyサーバー経由でないとした場合
動くサーバー(php5.4.x以降がインストールされたサーバー)と動かないサーバー(php 5.3.xがインストールされたサーバー)で以下コマンドを実行し正常に接続できるか確認できます。
※www.example.comは対象のURLのFQDNを指定ください。

#DNSの正引きができるか確認
nslookup www.example.com
#対象サーバーの80ポートへ接続できるか確認(Hostヘッダー入力後は改行2回送信すること)
telnet www.example.com 80
GET / HTTP/1.1
Host: www.example.com

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 11:07

    5.4のサーバーで実行した結果です。
    5.4のドメイン(テストドメイン)をtelnetで接続した場合はcontents bodyが返ってきました。

    5.3のサーバーはそもそもルートで入ることが出来なくて
    5.4のサーバー内で5.3で使用するドメイン(本ドメイン)を叩いた結果が上記のレスポンスになります。

    わかりにくい説明ですみません。
    何卒宜しくお願い致します。

    キャンセル

  • 2016/11/29 12:17

    5.3のサーバーにはconsoleにログインできないということでしょうか?

    Fireallなどで遮断されているかProxyが必要なのでしょう。
    Proxyサーバーの設定を聞くかネットワーク管理者にFirewallの透過依頼が必要だと思います。
    5.3のサーバーを構築した方やネットワーク管理者に本番環境のネットワークの詳細を聞いてみるしかないと思います。

    キャンセル

  • 2016/11/29 13:38

    はい。ログインできません。

    やはりそうですよね・・
    色々アドバイスいただきありがとうございます。

    代替案としてjavascriptで取得する方法を試してみます。

    キャンセル

0

接続できない方のサーバー環境には外部接続用のproxyは導入されてないのでしょうか?
cURLであればproxy経由のデータ取得も可能です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 11:24

    回答ありがとうございます。

    proxyの可能性もあるのでcURLで取得を試みているのですがうまくいきません。

    拾ったコードを試してみたりはしたのですが
    うまくいきません。

    キャンセル

0

php.ini の設定が異なっているかもしれません。

http://php.net/manual/ja/filesystem.configuration.php#ini.allow-url-fopen

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 13:18

    回答ありがとうございます。

    allow_url_fopen = On
    allow_url_include = Off
    となっておりますのでphp.iniの設定は問題ないと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る