• 締切済み

PHPでのタイムアウト設定(HTTPコネクション)

PHPで、あるwebサイト(仮にfoo.comとします)にアクセスして情報を取ってくる、という スクリプトを書いています。 この際、foo.comが落ちている等の理由でアクセスできなかった場合の タイムアウトを作りたいのですが、set_time_limitを使ったところ うまくいきません。下記の例で行けば、 「5秒以内にfoo.comへコネクトし、データを512バイト読み込み終わらなければ  スクリプトを強制終了する」 ということを考えているのですが、現実にはhttpを見に行ったまま 5秒以上たって、終了されません。 何かうまい方法を教えていただけませんでしょうか? なお、バージョンはPHP4.0.4pl2, OSはredhat6.2Jです。 以下に、スクリプトを書きます。 <? set_time_limit(5); error_reporting(0); $file = fopen("http://foo.rom", "r"); $line = fread($file, 512); fclose($file); print("$line"); ?> 宜しくお願いいたします。

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

みんなの回答

  • kircher
  • ベストアンサー率47% (11/23)
回答No.1

PHPのマニュアルを見てみますと、「 fsockopen() 」という関数が あるので、それを使ったほうがいいかもしれません。 これですと、ずばりタイムアウトするまでの時間を秒単位で指定できます。 マニュアルのサンプルですと、こんなのでした。 $fp = fsockopen ("foo.com", 80, &$errno, &$errstr, 5); if (!$fp) { echo "$errstr ($errno)<br>\n"; } else { fputs ($fp, "GET / HTTP/1.0\r\n\r\n"); while (!feof($fp)) { echo fgets ($fp,4096); } fclose ($fp); }

関連するQ&A

  • file(), file_get_contents(), fopen() がタイムアウトしてしまう

    パスが正しいかどうかを何度も確認しましたが、スクリプトのURLをブラウザで開こうとすると、5~6秒した後、以下のエラーが出ます。 Warning: file_get_contents(読み込むファイルのパス): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in スクリプトのパス.php on line 16 おそらく、file_get_contentsの読み込もうとするファイルが重たすぎるのだと思います(スクリプトのファイルサイズ自体は軽いのですが処理に時間がかかってしまう)。というのも、読み込むファイルの内容を、<?php echo "hello world"; ?> とすると、エラーが出なくなり、正常に読み込んでくれます。また、読み込むファイルは php ファイルで同ドメイン上にあり、このファイルをブラウザから閲覧可能です。 他に、fopen, include, file も試しましたが、同様に上記のようなエラーがでます。これはサーバ側でスクリプトの処理の時間制限を行っているからでしょうか? ちなみに、スクリプトの冒頭に、 set_time_limit(0); 一番最後に set_time_limit(30); をおいてみましたが、結果は同様でした。 もし何か対処方法をご存知の方おられましたら、どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 「複数のPHPファイルを上から順に15秒ごとに読み

    「複数のPHPファイルを上から順に15秒ごとに読み込む」ようなPHPファイルが欲しいです。 それをcronで定期的に実行したいのですが、どうしてもエラーが出てしまい上手く動きません。 <?php ini_set('display_errors', 1); error_reporting(-1); set_time_limit(0); $list = [ 'http://xxx.com/file1.php', 'http://xxx.com/file2.php', 'http://xxx.com/file3.php', 'http://xxx.com/file4.php', 'http://xxx.com/file5.php', 'http://xxx.com/file6.php', 'http://xxx.com/file7.php', 'http://xxx.com/file8.php', 'http://xxx.com/file9.php', 'http://xxx.com/file10.php', ]; foreach ($list as $url) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, ]); sleep(15); curl_exec($ch); } ?> いちおう初心者ながらに書いてみたのですが、どこが悪いのかを教えてください。

    • 締切済み
    • PHP
  • mod_rewriteで存在するファイルの設定方法

    mod_rewriteで質問です。 http://foo.com/test.php というファイルを http://foo.com/test でアクセスできるようにしたいです。 login.phpはディレクトリに存在する状態です。。 レンタルサーバーの仕様なのか、 RewriteRule test /test.php としてもInternal Server Errorになります。 ただ、 RewriteRule aaa /test.php と設定すると、 http://foo.com/aaa でtest.phpにアクセスできることはわかりました。 test.phpが存在する状態だとこれはできないことなのでしょうか?

  • SQLiteのタイム・アウト

    Smarty + SQLiteで作成したアプリで SQLite を検索している最中の下記のエラーを表示してリスト作成が失敗します。 検索する件数が少ないと成功するので単純にタイム・アウトしていると考えていますが SQLite のタイム・アウトする時間をディフォルトの30秒から延長するにはどうすれば良いのでしょうか? SQLite のデーター総数は7万件で30Mb程度です。 <表示されるエラー・メッセージ> Fatal error: Maximum execution time of 30 seconds exceeded in www.hogehohe.co.jp/hoge.php on line 161 <環境> Linux 2.4.18-24 PHP 5.0.4 Smarty 2.6.10 SQLite 2.8.16 -以上-

  • PHPを使ったアクセス解析を実現したい

    PHPを使ったアクセス解析を実現したいと思ってます。 どの場所のリンクがクリックされたのかを解析するものなのですが、 パラメータをもたないリンクであれば、 <a href="a.php?link=http://foo.com/&param=1">foo</a> のようにして、 paramで場所がわかって、a.php でリンクアドレスにリダイレクションするんですが、 <a href="a.php?link=http://foo.com/b.php?a=1&b=2&param=1"></a> http://foo.com/b.php?a=1&b=2 というリンクの場合には、 b=2 は、a.php のパラメーターと認識されてしまいます。 リンクは、http://foo.com/b.php?a=1&b=2でパラメーターは、 http://foo.com/b.php?a=1&b=2 と param=1 とする方法はありませんでしょうか。 アドバイスのほど、よろしくお願いします。

    • ベストアンサー
    • PHP
  • どっちが適用?

    こんにちは。質問させてください。 PHPを用いてWEBにDBのデータを表示させようとしています。 DBのデータが膨大なため、 強制終了しないために スクリプト内に set_time_limit(0); を記述しました。 php.iniには max_execution_time = 60 と書かれています。 この場合、SQLの処理が長い場合、 どちらの設定が適用されるのでしょうか? 実際に実行すると60秒で強制終了されますが、 周りの人いわく set_time_limit(0);が適用されるはずなのでおかしいといいます。 宜しくお願いいたします。

    • 締切済み
    • PHP
  • 時間制限について

    携帯のホームページをつくっています。 アクセスしてから60秒間は「A」と表示し、60秒を過ぎるとは「B」と表示させようと考えています。 そこで <?php $file = "test.dat"; $a = file ($file); $fp = fopen ($file , 'w'); fwrite ($fp , date ('Y/m/d H:i:s')); foreach ($a as $line) { list($time) = $line; if (strtotime($time) > time() - 60) { echo 'A'; }else { echo 'B'; } } fclose($fp); ?> というような感じにしてみました。 けれど、更新するたびに$timeも動いてしまい、常にBと表示されてしまいます。 最初にアクセスした時間を固定する良い方法はございませんでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • タイムアウトする仕組みを作りたい

    VB2008でWebにアクセスしています。 アクセス時に次の関数を呼び出して、表示が完了するまで待機しています。 Private Function WebWait(ByVal time As Integer)  Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete   Application.DoEvents()  Loop End Function ただ、サイトが応答しなくてずっと待ったままになる場合があります。 10秒応答がなかった場合に処理を中断させたいのですが、方法が判りません。 PHPならば、タイムスタンプをスタート時間と比較して、終了判断させることができます。 こんな感じを考えています。 Private Function WebWait(ByVal time As Integer)  スタート時間を格納  Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete   Application.DoEvents()   スタート時間と比較して、タイムアウトならLoopを抜ける  Loop End Function しかし、VB2008で同様の関数を見つけることができませんでした。 dateandtimeで似たものはありますが、ずっとカウントアップするものではありませんでした。 適切な関数、もしくは方法がありましたら、教えてください。 よろしくお願いします。

  • HTML+TIME phpで動作させたい

    初めて質問させて頂きます。 HTML+TIMEタグについて質問があります。 HTML+TIMEでコードを書き ~.htmlで保存した場合は表示をしてくれるのですが ~.phpにて保存すると何も表示してくれません <head>タグ内で以下のように記述しています。 <?IMPORT namespace="t" implementation="#default#time2"> QNo.941049を参考にして <?IMPORT namespace="t" implementation="#default#time2"?> としても同じ結果でした。 念のため、このコードを外すと~.phpでも表示はしてくれるのですが HTML+TIMEタグを使ったコントロールが機能しませんでした。 これが原因だと思われます。 おそらく,PHPファイルだと<?php~でスクリプトを書くところphpが無いため 止まってしまうのが原因かと思われます。 この現状を解決する方法はありますでしょうか。 ご存知の方がおられましたら回答いただければ幸いです。 よろしくお願いします。

    • 締切済み
    • CSS
  • htaccessでindex.htmlをindex.phpにしたいだけなのですが

    htaccessでindex.htmlをindex.phpにしたいだけなのですが 半分しか期待通り動かないんです。 --- <Files index.html> Action text/html /foo/index.php? </Files> --- 例えば、http://www.hoge.com/foo/index.html でアクセスされたら /foo/index.php を起動したいと思っています。 これで一応、index.php を起動することだけはできましたが、下層の index.html まで /foo/index.php が起動してしまいます。 下層ディレクトリを無視する方法ってありますでしょうか? ちなみに mod_write はつかえません^^; よろしくお願いいたします。

専門家に質問してみよう