• 締切済み
  • 困ってます

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"); ?> 宜しくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数352
  • ありがとう数13

みんなの回答

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

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

    • 締切済み
    • 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
  • phpでダウンロード処理に失敗する事があります

    phpにてexcelを作成後にダウンロードさせる処理を作成したのですが excelのサイズが100MBを超える様な時にダウンロードが失敗(止まる)する 事があります。 ブラウザからダウンロードの状況を見ていると徐々に転送速度が落ち 最終的に転送速度が0になります。 ブラウザは転送速度0のまま待っている状態でエラーは出ていない状態です。 phpのエラーログやapacheのログにも何の情報も表示されていません。 スクリプトにconnection_aborted や connection_status で接続が切れた場合に エラーログを吐く様に試しましたが何も出力されていませんでした。 以下環境になります。=================================================== CentOS Linux release 7.7.1908 Apache/2.4.6 PHP 5.6.40 使用しているブラウザは Chrome 最新版です。 以下PGになります。=================================================== ini_set("set_time_limit",0); ini_set("memory_limit","-1"); ignore_user_abort(true); // エクセル作成処理 開始 // エクセル作成処理 終了 // ダウンロードさせる $tmpfile = "hogehoge.xlsx"; $size = filesize($tmpfile); header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header('Content-disposition: attachment; filename="' . urlencode("テストです" . ".xlsx") . '"'); header('Content-Length: '.$size); ob_end_clean(); ob_start(); $fp = @fopen($tmpfile, 'rb'); if ($fp != null) { while(!feof($fp)) { $buf = fread($fp, 4096); echo $buf; ob_flush(); flush(); } fclose($fp); // ダウンロード後は不要なので削除する unlink ($tmpfile); }

    • ベストアンサー
    • PHP
  • PHPのfrrite関数

    お世話になります。 PHPのfwrite関数について質問です。 下記の様な記述で、アクセスがあった際に$lineをdata.txtに保存する場合、同じタイミングで複数のアクセスがあった場合などにエラーは起きないのでしょうか? エラーが起こりうるのであれば、その対処方法を教えて頂きたいです。 $fp = fopen("data.txt", "w"); fwrite($fp, $line); fclose($fp);

    • 締切済み
    • PHP
  • 【PHP】FTP関数でのバックアップスクリプトについて

    プログラミング歴一ヶ月の超初心者ですが、スクリプト作成に躓いてしまい、どうしても分からなくて困っています…。 下の方にあるPHPスクリプトは、「複数ホストにおいてそれぞれの設定にしたがってバックアップを取るスクリプト」です。 サーバー、クライアント、共にwin2000、iisです。 さて、質問は3つあります。 ◆◆◆1つ目の質問◆◆◆ 現在3つのホストで試行しているのですが、一つ目のホストでは殆どエラーは出ないのに、二つ目と三つ目のホストではどうしても数百あるファイルの内、何かしらの一つがfopenに失敗します。エラーは例えば次の通りです。 Warning: fopen(【ファイルパス(毎回違うものが引っかかります…)】) [function.fopen]: failed to open stream: No such file or directory in D:\WORK_DIR\BU\bu.php on line 183 Warning: fclose(): supplied argument is not a valid stream resource in D:\WORK_DIR\BU\bu.php on line 187 Warning: fopen(【ファイルパス】) [function.fopen]: failed to open stream: No such file or directory in D:\WORK_DIR\BU\bu.php on line 183 Warning: fclose(): supplied argument is not a valid stream resource in D:\WORK_DIR\BU\bu.php on line 187 Warning: fopen(【ファイルパス】) [function.fopen]: failed to open stream: No such file or directory in D:\WORK_DIR\BU\bu.php on line 183 Warning: fclose(): supplied argument is not a valid stream resource in D:\WORK_DIR\BU\bu.php on line 187 Warning: fopen(【ファイルパス】) [function.fopen]: failed to open stream: No such file or directory in D:\WORK_DIR\BU\bu.php on line 198 Warning: fclose(): supplied argument is not a valid stream resource in D:\WORK_DIR\BU\bu.php on line 200 Warning: unlink(【ファイルパス】) [function.unlink]: No such file or directory in D:\WORK_DIR\BU\bu.php on line 209 一応スクリプトの中で再試行も試みているのですがイマイチ機能してるのかわかりません…。 それと、FFFTPやIEでこのエラーに引っかかったファイルには別に普通にアクセスできます。 どうやったらこのエラーが無くなるのかわからなくて困っています。教えて頂けたら嬉しいです。 ◆◆◆2つ目の質問◆◆◆ 効率化についてです。 一応、ZIP化する機能を後に追加したので、「ローカルにファイルをダウンロード→そのファイルを読む→ZIP化」の手順を、「サーバー上のファイルを読む→ZIP化してローカルに保存」の様に簡略化しようと思っているのですが、それくらいしか思いつかなくて…。良かったら効率化についてご指摘いただければと思います。少しでも実行時間を短くしたいです。 ◆◆◆3つ目の質問◆◆◆ スクリプトの中盤辺りで、ダウンロード予定数と成功数を出力する試みがあるのですが、現時点では成功数のカウントは正確に反映されそうにないので、直すつもりです。とりあえず現在の様子だと、予定数、成功数ともに同じ数がカウントされるわけですが、これが困ったことに実際のダウンロード数と少し違うのです…。 一つ目のホストでは全く問題ないのですが、二つ目と三つ目では、生成されたZIPを展開してファイル数、フォルダ数を調べると、サーバー上のそれよりも多少多いのです…。ダウンロードリストもログで残しているのですが、これは数はずれていません。このリストと同じ配列でダウンロードも処理しているのですが…どうにもこうにも全く理由がわからなくて困っています。 ◇◇◇ こういう時はこうする、というような定石も全く持っていないので本当に一苦労です。そういう部分に関しても、色々遠慮せずにご指摘願えたら嬉しいです。 長々とすみません。よろしくお願いいたします。

    • 締切済み
    • PHP
  • タイムアウト時に次の処理へ移行する方法

    Windows/AN HTTPDでPHP Version 4.4.9を動かしています。 fsockopenで処理を行なっているのですが、 タイムアウト時に次の処理に移行させる方法が分かりません。 foreachで繰り返し処理中にタイムアウトが出た場合、そこで処理が止まってしまいます。 (エラー内容: Maximum execution time of 30 seconds exceeded) set_time_limitを使った時間延長以外の方法で、 何か対策がありましたらご教授いただけませんでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPのswitch文について

    こんにちは。 switch文を使って、 hogehoge.php?mode=admin や、 hogehoge.php?mode=admin&setting1 などのように、 hogehoge.phpの後に?○○=□□&△△のような好きな文字を入れたいのです。 あるPHPスクリプトを参考に、下のようにしてみたのですが、まったく動作しません。 switch ($_GET['mode']) { case "admin" : $inc_file = "./admin/"; break; } また、?mode=admin&setting1のように&を付ける方法がわかりません。 上のようにする場合は、どうすればよいでしょうか? よろしくおねがいします。 また、分からない部分があったら、補足要求お願いします。

    • ベストアンサー
    • PHP
  • crontabでPHPスクリプトが実行出来ない

    crontabで毎分PHPのスクリプトを起動する記述をしましたが、すべて下記エラーが出て実行されません。 phpスクリプトの先頭で「#!bin/usr/php」を書く方法と、crontabで「* * * * * /usr/bin/php test.php > dev/null」とする方法を試してみましたが両方ともダメでした。 解決索があればご教示下さい。 【エラー内容】 test.php: line 1: ?php: No such file or directory

    • ベストアンサー
    • 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