6

たとえば、PHPスクリプトの実行中に結果を表示しようとしています。非常に長いループです。ページの読み込み中に結果をエコーし​​たいのですが、これを何度も検索しましたが、見つかりませんでした。良い答え、グーグルした後、私ob_flushはこの質問から使用を言っている人々を見つけました..しかし、それは機能しませんでした、そしてimplicit_flushphp.iniからを有効にするだけでなく、それでも機能しませんでし
たプロセスが終了したときにロードするだけです、私は実行しようとしましたこのようなforループ

ob_start();

for($i=0; $i<500; $i++){
 echo "hm\n";
 ob_flush();
}

ob_end_flush(); 

それでも、動作しませんでした..それはそれらすべてを一度に表示します

私の最後の推測は、いくつかのものを有効/無効にするために、より多くのPHP構成が必要であるということです。それとも、 apache2構成
である可能性がありますか?

これに関連する構成設定は何ですか?ApacheまたはPHP構成を介して無効化/有効化する必要がある設定..

PS:PHPだけを使用して実行できると確信しています。これは、GoDaddyホスティングで実行され、いくつかのWebサイト(http://www.checker.freeproxy.ru/checker/index.php )で実行されました。送信しようとすると、ajaxを使用せずに通常どおり結果が表示され、WebサイトはPHPとApacheを使用します。これには、謎の秘密があります。

4

4 に答える 4

4

この回答からこの方法を使用しました

while(1) {
  echo "should display these lines on browser while in infinite loop.<br>";
  flush();
}

またはforループを使用すると、どちらも正常に機能し、より正確にするために使用ob_flush()しますflush()

for($i=0; $i<5000; $i++) {
     echo "should display these lines on browser while in infinite loop.<br>";
     usleep(30000);
     ob_flush();
     flush();
}

どちらもajaxなしで正常に動作します

于 2013-01-17T12:13:56.733 に答える
2

PHPではこれを行うことはできません。PHPはサーバー側で実行されるため、HTTP応答がブラウザーに返送される前に実行されます。

これを実現するには、AJAXを使用する必要があります。

この種のことを実現するために、WebSocketを調べることもできます。

また、すべてのデータをチートして非表示のリストにロードし、ページがロードされた後、javascriptを使用してリストアイテムを1つずつ表示することもできます。:)

于 2013-01-17T11:41:04.260 に答える
2

前述のとおり、Ajax が最適な方法です。

3 つのファイルが必要です。ジョブを開始する html ファイルまたは php ファイル、ajax を含む JavaScript ファイル、およびスクリプトを実行する php ファイルです。これを行う方法の例を次に示します。やろうとしていることを微調整する必要がある場合、残りはあなた次第ですが、それに応じてphpを分割すると、順次再表示されるはずです。

go.hml:

<html>
<head>
<title>Insert Title Here</title>
<script src="ajax_example.js" language="javascript"></script>
</head>

<body>
<form action="javascript:insert()" method="post">
  <input type="text" name="limit" value="" id="limit"/>
  <input type="submit" name="Submit" value="Go"/>
</form>

<div id="text_response"></div>
</body>
</html>

ajax_example.js:

// make script work for internet explorer too
function createObject(){
  var request_type;
  var browser = navigator.appName;
  if(browser == 'Microsoft Internet Explorer'){
    request_type = new ActiveXObject('Microsoft.XMLHTTP');
  }else{
    request_type = new XMLHttpRequest();
  }
  return request_type;
}
var http = createObject();

var response = '';
var current  = 0;
var limit    = 0;

function insert(){
  current = 0;
  // write to the document
  response = 'Hang on...';
  document.getElementById('text_response').innerHTML = response;
  // set the limit and run the loop script
  limit = encodeURI(document.getElementById('limit').value);
  limit++;
  loop_file(current);
}

function loop_file(i) {
  // open the php file you wish to run, the 'hm' and 'rand' are optional, obviously
  http.open('get', 'file.php?hm='+i+'&rand='+Math.random());
  // run the insertReply function
  http.onreadystatechange = insertReply;
  http.send(null);
}

function insertReply(){
  if(http.readyState == 4){
    response = response+'<br />'+http.responseText;
    document.getElementById('text_response').innerHTML = response;
    current++;
    // this runs like a pseudo for loop and will loop until it reaches the 'limit'
    if(current < limit){
      loop_file(current);
    }else if(current == limit){
      //create end script here
    }
  }
}

file.php

<?php
echo isset($_GET['hm']) ? $_GET['hm'] . " - hm\n" : "hm\n";
?>
于 2013-01-17T12:42:51.630 に答える
2

ここで私の投稿を確認してください:ループ中にphpで進行状況バーを表示する

サンプルコードもいくつかあり、必要なものはほとんどすべてカバーされています。

PS: PHP だけではできません。AJAX + PHP (クライアント + サーバー側のコーディング) でこれを行う必要があります。これは、ファイルが完全に解釈された後にのみ応答がブラウザに送信されるためです。

于 2013-01-17T11:45:22.013 に答える