2012-02-07 15 views
9

Ai đó có thể vui lòng lưu 2 tệp này và chạy chúng và cho tôi biết tại sao tôi nhận được lỗi "ob_flush() [ref.outcontrol]: không thể xóa bộ đệm. Không có bộ đệm để xóa". Tôi đã thử googling xung quanh và nó nói rằng tôi phải sử dụng ob_start(); nhưng khi tôi làm như vậy nó không in ra từng dòng, mà là trả về toàn bộ đối tượng từ vòng lặp FOR khi nó đã hoàn thành. Tôi kinda mới để PHP vì vậy tôi không chắc chắn nơi khác để tìm ..Lỗi PHP: ob_flush() [ref.outcontrol]: không thể xóa bộ đệm. Không có bộ đệm để tuôn ra

test_process.php

// This script will write numbers from 1 to 100 into file 
// And sends continuously info to user 
$fp = fopen('/tmp/output.txt', 'w') or die('Failed to open'); 
set_time_limit(120); 
ignore_user_abort(true); 

for($i = 0; $i < 100; $i++){ 
    echo "<script type=\"text/javascript\">parent.document.getElementById('foo').innerHTML += 'Line $i<br />';</script>"; 
    echo str_repeat(' ', 2048); 
    flush(); 
    ob_flush(); 
    sleep(1); 
    fwrite($fp, "$i\n"); 
} 

fclose($fp); 

main.html

<html> 
    <head> 
     <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript" charset="utf-8"></script> 

     <style type="text/css" media="screen"> 
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid} 
      .new{ background-color:#3B9957;} 
      .error{ background-color:#992E36;} 
     </style> 

    </head> 
    <body> 

     <iframe id="loadarea" width="1024px" height="768px"></iframe><br /> 
     <script> 
      function helper() { 
       document.getElementById('loadarea').src = 'test_process.php'; 
      } 
      function kill() { 
       document.getElementById('loadarea').src = ''; 
      } 
     </script> 

     <input type="button" onclick="helper()" value="Start"> 
     <input type="button" onclick="kill()" value="Stop"> 
     <div id="foo"></div> 


</body> 
</html> 
+0

Kiểm tra cấu hình của bạn trong php.ini về đệm đầu ra, nó có thể được kích hoạt để on_start automaticly. Một cách khác để kiểm tra xem nó có được kích hoạt hay không bằng cách sử dụng ob_end_flush() khi bắt đầu và loại bỏ tất cả các lệnh xóa. Ngoài ra, bạn có thể kiểm tra bằng 'phpinfo(); ' – dvicino

+0

Xin chào, cảm ơn phản hồi của bạn. Tôi đã cố gắng để kích hoạt bộ đệm đầu ra nhưng sau đó nó trả về toàn bộ cho đối tượng vòng lặp thay vì dòng theo dòng ... – ThreaT

Trả lời

10

Tôi nghĩ rằng bạn đang bối rối ob_flush() với flush(). Trong khi ob_start()ob_flush() xử lý bộ đệm đầu ra nội bộ PHP để nắm bắt tất cả các kết quả đầu ra, flush() là hàm bình thường xóa STDOUT như trong các ngôn ngữ lập trình khác.

Ví dụ:

<?php 
ob_start(); 
echo "Foobar\nFoobar\nFoobar\n"; 
// Nothing printed yet 
ob_flush(); // Now it is printed. 

echo "Foobar\n"; // Printed directly, because contains a line ending. 

echo "Foobar"; // Not printed, because normally buffers are flushed on line endings 
flush(); // Printed. 

EDIT:

đầu ra của bạn không được in, vì webserver của bạn có thể đệm nội dung. Hãy thử tắt tính năng nén và xuất bộ đệm:

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('implicit_flush', 1); 

Cũng xin lưu ý rằng Safari và Internet Explorer có bộ đệm 1K bên trong. Vì vậy, bạn cần phải thêm 1 KB dữ liệu đệm (như khoảng trắng), để làm cho chúng hiển thị.

CHỈNH SỬA 2: Triển khai của bạn bị hỏng. Bạn muốn thăm dò ý kiến ​​dữ liệu của bạn với ajax. Sử dụng jQuery trên các mặt hàng:

<div id="counter">0%</div> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"> 
<script type="text/javascript"> 
function doPoll(){ 
    $.post('script-that-returns-stuff.php', function(data) { 
     $("#counter").html(data); 
     setTimeout(doPoll,5000); 
    }); 
} 
doPoll(); 
</script> 

Sau đó, trong script-that-returns-stuff.php:

<?php 
$file = explode("\n", file_get_contents("/tmp/output.txt")); 
$last_line = $file[count($file)-1]; 
echo $last_line."%"; 
+0

Xin cảm ơn phản hồi của bạn. Tôi đã thử đề xuất của bạn nhưng vì một lý do nào đó nó không trả về từng dòng nhưng thay vào đó nó trả về toàn bộ kết quả vòng lặp chỉ sau khi nó đã xử lý xong. – ThreaT

+0

Tôi đã thêm bản chỉnh sửa có thể hữu ích. – iblue

+0

Tôi đã thử nó nhưng vẫn không có may mắn:/ – ThreaT

1

đâu ob_start()?

ob_flush xóa bộ đệm đầu ra sang bộ xử lý tệp của bạn. Có thể bạn đã sai.

Một ví dụ:

ob_start(); //start output buffering 
echo 'hello world'; //not outputed 
ob_flush(); //sends the output buffer so displays hello world. 

manual

+0

Xin chào, cảm ơn phản hồi của bạn. Tôi đã không bao gồm nó trong đoạn code trên bởi vì khi tôi làm sau đó nó không trở lại từng dòng mà là nó trả về toàn bộ kết quả vòng lặp chỉ sau khi nó đã hoàn tất việc xử lý. – ThreaT

13

Bạn chỉ cần ob_flush() nếu một bộ đệm đầu ra đang hoạt động (ví dụ bằng cách ob_start(), hoặc bằng cách thiết lập cấu hình). Nếu bạn chưa có, chỉ cần xóa ob_flush(). Hoặc bạn có thể làm cho nó có điều kiện:

if(ob_get_level() > 0) ob_flush(); 
+0

Xin chào, cảm ơn phản hồi của bạn. Tôi đã cố gắng để đưa ra ob_flush() nhưng sau đó nó vẫn trả về toàn bộ đối tượng vòng lặp chỉ khi nó được hoàn thành xử lý, thay vì trả lại từng dòng theo dòng như nó đi. – ThreaT

+0

Hãy ghi nhớ bộ nhớ đệm trước khi hiển thị có thể xảy ra ở bất kỳ đâu trên tuyến đường giữa bạn và UA: trong PHP, trong máy chủ web, trong bất kỳ proxy hoặc hop nào trên mạng, trên mạng cục bộ của bạn, trên máy tính cục bộ của bạn. Nhiều nhất, bạn có thể gợi ý (và nếu không có bộ đệm đầu ra nào hoạt động 'ob_flush' sẽ không làm bạn tốt), nếu bạn _need_ nó, bạn không nên sử dụng HTTP nhưng một số kết nối ổ cắm trực tiếp khác. – Wrikken

+0

nhưng đối với một số lý do nó hoạt động khi ob_flush() là có, nhưng nó cũng ném rằng lỗi, vì vậy nó sẽ là hoàn hảo nếu lỗi đó chỉ biến mất lol – ThreaT