• 締切済み

phpの処理を中断する方法を教えてください。

PEARのHTTP_Requestを用いて,指定したURLのHTMLを読み込むというプログラムをPHPで組んでいます。 一部のサイト(以下のソース内の$urlに格納したURLなど)は,サイト自体が重いせいなのか,表示にとても時間がかかってしまいます。 『表示にある一定の時間以上かかる場合は読み込みを中止したい(別処理をしたい)』のですが,どのように書けばよろしいでしょうか。 $optionでHTTP_Requestのタイムアウトを指定しても,その時間でタイムアウトしませんでした。 set_time_limit()を使って実行可能な秒数を指定しようかとも考えたのですが,読み込み中止後に別処理をしたいので,何か良い方法はないかと悩んでいます。 初歩的な問題なのかもしれませんが,開発経験が少ないため解決策がわかりません。是非宜しくお願い致します。 ------------------ソース------------------ <?php require_once "HTTP/Request.php"; $url = "http://bmw.jugem.cc/?search=%C3%E6%B9%F1&mySearch="; $option = array("timeout" => "20"); // HTTP_Requestの初期化 $http = new HTTP_Request($url, $option); // HTTPのヘッダー設定 $http->addHeader("User-Agent", "My PEAR PROGRAM"); $http->addHeader("Referer", "http://www.yahoo.co.jp/"); // HTTPリクエスト実行 $response = $http->sendRequest(); if (!PEAR::isError($response)) { $ret1 = $http->getResponseCode();// ResponseCode(200等)を取得 $ret2 = $http->getResponseHeader();// ResponseHeader(レスポンスヘッダ)を取得 $ret3 = $http->getResponseBody();// ResponseBody(レスポンステキスト)を取得 $ret4 = $http->getResponseCookies();// クッキーを取得 } echo $ret3; ?> ------------------ソース------------------

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

curlが使える環境ならcurlを使うと良いんじゃないかと思います。 pcntlが使えるならpcntlでも代用できると思います。 それも出来ない場合は別プロセスで動くようにしてやって、 echo $ret3;をファイル保存に変更。 それを取得するまで待ち続けるなんてことも出来ると思います。 HTTP::Requestはfsockopenを使ってたと思いますが、何か上手い方法で回避できるんですかね? 同僚はpcntl_forkあたりで回避してたと記憶してますが。。 便乗ですが、素敵な情報をお持ちの方がいたら教えてください。

参考URL:
http://jp.php.net/manual/ja/ref.curl.php

関連するQ&A

  • PHPのHTTP/Requesをローカルでテストする方法は?

    PHP初心者なのですが、 初めてPHPのPEARパッケージにあるHTTP/Requestクラスを使って、別サーバーのAPIに対し、XMLのリクエストをし、XMLのレスポンスを受け取るやり取りをする関数を作りたいと思い、下記のような関数を作ってみたのですが、ローカル環境でどのようにテストすれば、HTTP/Requestの挙動をうまく確認できるかが思い浮かばずに、止まってしまいました。 どのようにテストすれば挙動がローカルで確認できるか、どなたか、ご教授お願いします!!! ----------- 制作した関数 引数1:リクエスト先URL、引数2: function testHttp($requestUrl,$requestXml){ $option = array( "timeout" => "3", // タイムアウトの秒数指定 "allowRedirects" => true // リダイレクトの許可 ); // HTTP_Requestの初期化 $http = new HTTP_Request($requestUrl, $option); // HTTPのヘッダー設定 $http->addHeader("User-Agent", "My PEAR PROGRAM"); $http->addHeader("Referer", $obj->protMember('LOGIN_URL')); $http->setMethod(HTTP_REQUEST_METHOD_POST); // HTTPリクエスト実行 $response = $http->sendRequest(); if (!PEAR::isError($response)) { $responseVal['resCode'] = $http->getResponseCode(); // ResponseCode $responseVal['resBody'] = $http->getResponseBody(); // ResponseBody return $responseVal; }else{ exit(); } }

    • 締切済み
    • PHP
  • HTTPステータスコード

    phpでhttpリクエストを作成し、当該URLのステータスのチェックを行うプログラムを作成しました。 試作したプログラムの該当部分はこのようなものですが、 $response = $req->sendRequest(); if (!PEAR::isError($response)) { $ret = $req->getResponseCode } 同一サーバー内で、該当htmlが存在しないときは、サーバーは404を返すなど、$ret にしかるべきHTTPステータスコードを返してくれます。 ところが私の知識不足で不明なことがあります。 それは、そもそも該当URLのサーバー自体(ドメイン等)が存在しない時は、何がどういうコードを返してくれるのか、ということです。 先ほどの $ret には何も入ってきません。 このあたりご教授いただければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PEAR HTTP_Requestでのヘッダ送信

    PEARのHTTP_Requestを使用し、 下記処理にてTEST_URL向けにPOSTとヘッダを同時に送信する処理を行いたいのですが 411 Length Requiredで返ってきてしまします。 サーバのログには Invalid URI in request Connection: Keep-Alive というログがerrorログに出ています。 そこでRFCを読んで見ると、 転送コーディングが施されていない場合は Content-Length ヘッダは送られなければならないが、 メッセージボディ中のオクテット数と 正確に一致しなければならないとの記載がありました。 ここに引っかかっているのかもと思い対策しようと思いましたが メッセージボディのlength(下記の☆部分)をどのように拾うかがわかりません。 require_once "HTTP/Request.php"; $req = &new HTTP_Request(TEST_URL,array()); $req->setURL(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addHeader('Host',"test.hogehoge.jp\r\n"); $req->addHeader('Content-Length',"-☆-\r\n"); $req->addHeader('Connection', "Keep-Alive\r\n"); $req->addHeader('User-Agent',"TEST ABCDEFG\r\n"); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); if(PEAR::isError($result)) { echo $result->getMessage(); echo "<br />"; } else { echo $req->getResponseCode(); echo "<br />"; echo $req->getResponseBody(); echo "<br />"; } もしかして違う原因でしょうか? よろしくおねがいします。

    • 締切済み
    • PHP
  • HTTP通信の詳細を知りたい

    PHPで他ドメインのページの情報を取得しています。 その際に、HTTP通信のリクエストヘッダ、レスポンスヘッダの詳細を見たいです。 イメージとしては、firefoxの「firebug」とか「live http header」で取得できる情報量がほしいです。 現在、http通信でhttp_clientを使っています。 http_clientのcurrentResponse()でレスポンスは取得できるのですが、 クッキー情報などが入っていないです。 一番知りたいのは、リクエストヘッダです。 PHPを設置しているサーバーからどのようなリクエストヘッダを送っているのかを知りたいです。 というのは、設置しているサーバーによって同じページにリクエストを送っているのに、返ってくる情報が変わるときがあります。 PHPプログラムは全く同じです。 サーバーはさくらインターネットの共有サーバーを3つ契約しており、 3つのサーバーに同じプログラムを置いてHTTP通信しているのですが、 取得できる情報が異なっていて困っています。 恐らく、リクエストの何かが違っていると思うのでそれを調べたいと思って 質問しました。 そもそも原因が違うところにありそうであればアドバイスもお願いします。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHP stream_context_creat

    今日は、 境内のメソッドについて質問があります。 以下のスクリプトについてですが、 <?php //POSTする送信データ $postData = array ( "key_01" => "POST送信データ01&", "key_02" => "POST送信データ02&", ); //送信するデータをURLエンコードする $postData = http_build_query($postData); $header = array( "http" => array( //(1) "method" => "POST", //(2) "header" => "Content-type: application/x-www-form-urlencoded\r\nuser_name: testuser_name", //(3) "content" => $postData //(4) ) ); //上記headerという変数からHTTPリクエストのストリームを作成する $request = stream_context_create($header); $res = file_get_contents("http://localhost/stream02.php",false,$request); print $res; 上記のようなスクリプにおける、ストリームというのはいわゆるクライアント側から サーバー側へ送信するHTTPリクエストと同義のものでしょうか? であればHTTPレスポンスのようにそのヘッダーの中身を取得する getallheaders()というような感じで、実際に、送信されるHTTPリクエストの 中身を視認したいのですが可能でしょうか? 以下サイトの http://www.tohoho-web.com/ex/http.htm HTTPサンプルのように取得したいのですが・・・。 また、冒頭に記述したスクリプトですが php.iniのallow_url_fopenの箇所がonになっていないと実行できないことは 確認したのですが、もし仮にallow_url_fopenがOffになっていた場合、 上記のようにストリームと呼ばれるものを使ってHTMLフォーム以外でPOSTリクエスト したい場合は何か方法があるのでしょうか? 通常であればPEARのHTTP_Requestとかで処理するかと存じますが、 PHPの組み込み関数のみでやる場合、他に方法ってありますか? 識者の方ご教授ください。

    • ベストアンサー
    • PHP
  • PHPで画像のアップについて

    初歩的な問題で申し訳ありません。各店舗のホームページの掲示板にセールの書き込みをしたいのですが、テキスト部分はアップできるのですが、画像がどうしうてもできません。アドバイスをお願いします。 <?php require'HTTP/Client.php'; // コンストラクタに渡すパラメータの設定 $option = array( "timeout" => "10", // タイムアウト "allowRedirects" => true, // リダイレクトを許容するか?true/false "maxRedirects" => 3, // リダイレクトする場合の最大回数 ); // HTTPクライアントの作成 $client = new HTTP_Client($option); $posturl = "http://hogehoge.com/bbs.php"; //$imgUrl = $_POST['data']; // 送信パラメータの設定 $params = array( "title" => $_POST['title'], "file" => $_FILES['data'], "mes" => $_POST['mes'], "mode" => "write", ); // POSTリクエストの送信 $code = $client->post($posturl, $params); // レスポンスのチェック if ($code != "200") { echo "リクエスト失敗"; } // POSTリクエストに対して返って来たHTMLを出力 $response = $client->currentResponse(); echo $response["body"]; ?>

    • 締切済み
    • PHP
  • HTTP_Request2で検索結果を取得したい

    pearのHTTP_Request2を使ってサイト内の検索結果を取得したいのですが、 どうにもうまく取得できなくて困っております。 ■やりたいこと 対象サイトをクックパッドにしたいと思います。 http://cookpad.com/search 料理名、食材名のフリーワードのところに例えばキムチと 入力して、その検索結果を表示したい(http://cookpad.com/search/%E3%82%AD%E3%83%A0%E3%83%81)と思っているのですが、リクエストがうまくいかず、上記URLのページがそのまま返ってきてしまいます。ソースは以下です。 <?php require_once "HTTP/Request2.php"; require_once "Net/URL2.php"; $request = new HTTP_Request2('http://cookpad.com/search', HTTP_Request2::METHOD_GET, array('use_brackets' => true)); $url = $request->getUrl(); $url->setQueryVariables(array( 'keyword' => 'キムチ' )); $url->setQueryVariable('commit', 'レシピ検索'); echo $request->send()->getBody(); 一体、どこが間違っているのでしょうか? 下記URLを参照して試みたのですが、どうにもうまくいきません。 お手数ですが、ご教授いただけますと幸いです。 参照ページ http://pear.php.net/manual/ja/package.http.http-request2.request.php

    • ベストアンサー
    • PHP
  • php fsockopenの文字化けについて

    PHPプログラミングの初心者です。 現在Yahooファイナンスのページから為替情報を自動で取得するスクリプトを作成しています。 サーバーからの応答は「HTTP/1.1 200 OK」となっているのですが、取得したデータが全て文字化けして表示されます。 mb_convert_encodingを使っても結果は同じでした。 どのようにすれば文字化けを解消できるのでしょうか? 下記がスクリプトの内容です。よろしくお願いいたします。 <?php /* リクエストライン */ $request = "GET / HTTP/1.0\r\n"; $request .= "Accept: */*\r\n"; $request .= "Accept-Language: ja\r\n"; $request .= "User-Agent: PHP-".phpversion()."\r\n"; $request .= "Accept-Encoding: gzip, deflate\r\n"; $request .= "Host: finance.yahoo.co.jp\r\n"; $request .= "Connection: Keep-Alive\r\n"; $request .= "\r\n"; $fp==""; $fp =@fsockopen("finance.yahoo.co.jp", 80); /* 要求データ送信 */ fputs($fp, $request); /* 応答データ受信 */ $response = ""; while (!feof($fp)) { $response.= fgets($fp); } /* 接続を終了 */ fclose($fp); /* ヘッダ部分とボディ部分を分離 */ $DATA = split("\r\n\r\n", $response, 2); /* リクエストヘッダをコメントアウトして出力 */ echo "<!--\n".$request."\n-->\n"; /* レスポンスヘッダをコメントアウトして出力 */ echo "<!--\n".$DATA[0]."\n-->\n"; /* メッセージボディを出力 */ echo $DATA[1]; ?>

    • ベストアンサー
    • PHP
  • グーグルの検索エンジンについて

    グーグルの検索エンジンについて質問があります。 このエンジンはロボットがクロールする際、あらゆるURLにGETリクエストをおこない 膨大なHTMLのキャッシュをかき集めていくと思いますが、 その際、ロボットはリクエストを投げてHTTPレスポンスを受け取るのだとおもいますが 質問1. このときレスポンスコードが200,300,400,500系それぞれ問わずキャッシュを行っている のでしょうか?一般的にドメインの永久転居の場合301ヘッダーを返すため、300系はキャッシュするのだろうなと想像できます、が400系500系もキャッシュしているのでしょうか? 質問2. また、レスポンス200を受け取り、さあHTTPリクエストのボディ部分・・つまり肝心の HTMLデータを取得する際、完全にHTMLノ読み込みが完了するまでそのURLに滞在しているのでしょうか? 言い換えると,ロボットはかならずJavaScriptの【onload】イベントが発生後の コンテンツをキャッシュしているのでしょうか? 上記2点について、検索エンジンにお詳しいかたご教授ください。 よろしくお願いします。

  • HTTP レスポンスヘッダ

    URLを指定してHTTP レスポンスヘッダ等が確認できるサイトで、 Request typeをGETやPOSTが選択可能なところを探しています。 少し探した結果、 http://web-sniffer.net/ というところが見つかりましたが、このようなサイトが他にもあれば教えてください。 宜しくお願いします。

専門家に質問してみよう