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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

943閲覧

PHP:echoがすべての処理が終わるまで表示されない

igaiga

総合スコア144

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/07/17 05:43

simple_html_domを使用して、URLを集めていますが、echoの部分がなかなか表示されず、
原因がわかるようであれば、教えていただけますでしょうか。

表示までかなり時間がかかるのでなにかおかしな処理をしているのか不安になってきました。
以前は、リアルタイムに近い感じで表示されていたと思うんですが、気づいたらこうなっていました。。。

「URLリストの読込を開始します・・・」もecho "URLリストの読込を開始します・・・";の後ろに、
exit;を入れればすぐ表示されるのですが、このまま使用するとなかなか表示されません。

ご教示いただければ幸いです。

require_once('/home/www/record/simple_html_dom.php'); define("CHAR_SET","UTF-8"); mb_language("Japanese"); $list = array( '/tokyo/', '/kanagawa/', '/saitama/', ); echo "完了まで30分ほどかかります。<br>"; echo "URLリストの読込を開始します・・・"; foreach ($list as $urls) { if(empty($urls)){continue;}//URLが取得できないときはスキップ sleep(1); echo "・"; $url = "http://www.example.jp".$urls."/page_count/"."1"; $header2 = @get_headers($url); if (preg_match('/^HTTP/.*\s+200\s/i', $header2[0])) { $html = file_get_html($url); $search_result = $html->find('div[id=search_result]',0); $result = strstr($search_result->plaintext, "件中", TRUE); $result2 = str_replace("検索結果:","",$result); $result3 = trim($result2); $result4 = ceil($result3 / 10)+1; for($i = 1; $i < $result4; $i++){ $url = "http://www.example.jp".$urls."-/page_count/".$i; echo $url; sleep(1); $html = file_get_html($url); for($j = 0; $j < 10; $j++){ //【】付きじゃない場合はスキップ $building_name = $html->find('span[class=building_name] a',$j); $building_name = $building_name->plaintext; if(!preg_match('/【.*】/',$building_name)){ continue; } //URLリスト作成 $url = $html->find('td[class=txal_center] a',$j); $url = "http://www.example.jp" . $url-> href; echo $url; if($url == "www.example.jp"){ echo "URLが不正か、取得できなかったためスキップします。"; continue; } $fp = fopen('/home/www/record/list.txt', 'a'); if ($fp){ if (flock($fp, LOCK_EX)){ if (fwrite($fp, $url."\n") === FALSE){ print('ファイル書き込みに失敗しました<br>'); } flock($fp, LOCK_UN); }else{ print('ファイルロックに失敗しました<br>'); } } } } } } echo "<br>URLリストの読込を完了しました。<br>";

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/17 06:06

回答してはみたのですが、勘違いもあるかもしれません。 「表示」とは?
igaiga

2018/07/17 06:15

表示の意味はプログラムを直接開いたときの表示のつもりです。頂いたプログラムで試してみたところ、ご指摘の通り一気に表示されました。
guest

回答3

0

ベストアンサー

仕様通りです。
echoの箇所を通ったからと出力してくれるわけではありません。
画面出力は最後です。

下記は確認用ミニマムプログラムです。

php

1<?php 2for($i=1;$i<=10;$i++){ 3 echo $i; 4 sleep(1); 5}

1から10まで1秒毎に画面出力してくれると思うかもしれませんが、違います。
約10秒後に12345678910と一気に出力されます。試してみてください。

投稿2018/07/17 06:05

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igaiga

2018/07/17 06:18

ありがとうございます。 前は、ひとつずつ表示されて1秒ごとに動いてるなーってチェックして安心してたんですが、今現在のが仕様だったんですね。。。 逆に1秒毎に表示させるにはどうしたらいいんでしょうか?
m.ts10806

2018/07/17 06:26

下記をsleep()前に入れれば、「それっぽく」はなりますけど、余計重たい感じになります。 ob_flush(); flush(); あまりPHPだけではやりませんね。 Ajaxで実行して処理状況を監視するような形になるかと。
m.ts10806

2018/07/17 11:11

ちなみに仕様が変わったわけではありません。 もともとこの仕様から変わっていないはず。
guest

0

途中で以下の2行を追加するとどうでしょうか?

PHP

1ob_flush(); 2flush();

参考
PHPマニュアル

投稿2018/07/17 06:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igaiga

2018/07/17 06:27

ありがとうございます。イメージ通りに表示されました。 前はこれがない状態でも同じように動いてたはずなんですが、仕様が変わったんでしょうか。。。
guest

0

fcloseがないから使えるファイルポインタの上限に達してしまっているとか。

投稿2018/07/17 05:58

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2018/07/17 07:47

fcloseしてくださいね。 今のコードだとfopenのエラーを拾っていないので実はエラーが発生している可能性がありますし、上限まで使い切ってしまうと他のプロセスにも影響がでる可能性がありあす。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問