2009-03-06 32 views
10

Vì vậy, tôi đang tìm kiếm cái gì hiệu quả hơn này:Truyền đầu ra vào một tập tin và trình duyệt

<?php 
ob_start(); 
include 'test.php'; 
$content = ob_get_contents(); 

file_put_contents('test.html', $content); 

echo $content; 
?> 

Những vấn đề với trên:

  • khách hàng không nhận được bất cứ điều gì cho đến khi toàn bộ trang được render
  • tập tin có thể là rất lớn, vì vậy tôi không muốn có toàn bộ điều trong bộ nhớ

Bất kỳ đề xuất nào?

+0

ý bạn là test.php (hoặc kết quả đánh giá) có thể rất lớn? –

+0

Kết quả đánh giá nó có thể rất lớn. –

Trả lời

6

Vấn đề thú vị; đừng nghĩ rằng tôi đã cố gắng giải quyết điều này trước đây.

Tôi nghĩ bạn sẽ cần có yêu cầu thứ hai từ tập lệnh PHP phía trước của bạn tới máy chủ. Đây có thể là một cuộc gọi đơn giản tới http://localhost/test.php. Nếu bạn sử dụng fopen-wrapper, bạn có thể sử dụng fread() để kéo đầu ra của test.php khi nó được trả về, và sau mỗi đoạn nhận được, xuất nó ra màn hình và nối nó vào tệp test.html của bạn.

Dưới đây là làm thế nào mà có thể trông (chưa được kiểm tra!): Câu trả lời

<?php 
$remote_fp = fopen("http://localhost/test.php", "r"); 
$local_fp = fopen("test.html", "w"); 
while ($buf = fread($remote_fp, 1024)) { 
    echo $buf; 
    fwrite($local_fp, $buf); 
} 
fclose($remote_fp); 
fclose($local_fp); 
?> 
+0

Thú vị. Thêm cái này vào thanh công cụ của tôi. –

0

Pix0r là những gì bạn muốn, trừ khi bạn thực sự cần nó "bao gồm" thay vì chỉ thực hiện. Ví dụ: nếu bạn có thông tin đăng nhập trước test.php, nó sẽ không được chuyển vào tệp nếu bạn gọi nó bằng fopen.

Nếu bạn cần nó bao gồm thực sự, thì bạn có phương pháp đơn giản nhất, nhưng nếu bạn muốn đầu ra liên tục, bạn sẽ cần phải viết test.php theo cách mà đầu ra cũng như lưu trữ thông tin đi. Theo như tôi biết không có cách nào để thu thập cả bộ đệm và xuất nó khi bạn đi.

-1

Ở đây bạn hãy truy cập x-send-file, sử dụng mod_xsendfile để gửi tệp hiệu quả, thật dễ dàng.

+1

Tôi sẽ xem xét nó, nhưng nó không giải quyết chính xác vấn đề của tôi. Tôi muốn tạo và phát các tệp lớn từ PHP mà không phải tạo tệp tĩnh trước tiên. Tôi muốn làm chúng song song. –

2

Cách tốt hơn để thực hiện việc này là sử dụng hai tham số đầu tiên được chấp nhận bởi ob_start: output_callbackchunk_size. Trước đây xác định một cuộc gọi lại để xử lý đầu ra khi nó được đệm, và sau đó xác định kích thước của các khối đầu ra để xử lý.

Dưới đây là một ví dụ:

$output_file = fopen('test.html', 'w'); 
if ($output_file === false) { 
    // Handle error 
} 

$write_ob_to_file = function($buffer) use ($output_file) { 
    fwrite($output_file, $buffer); 

    // Output string as-is 
    return false; 
}; 

ob_start($write_ob_to_file, 4096); 
include 'test.php'; 
ob_end_flush(); 

fclose($output_file); 

Trong ví dụ này, các bộ đệm đầu ra sẽ được rửa (gửi) cho mỗi 4096 byte đầu ra (và một lần nữa vào cuối bởi ob_end_flush cuộc gọi). Mỗi khi bộ đệm bị xóa, cuộc gọi lại $write_ob_to_file sẽ được gọi và chuyển đoạn mới nhất. Điều này được ghi vào test.html. Gọi lại sau đó trả về false, có nghĩa là "đầu ra đoạn này như là". Nếu bạn muốn chỉ ghi đầu ra vào tệp chứ không phải luồng đầu ra của PHP, bạn có thể trả về một chuỗi rỗng để thay thế.

Các vấn đề liên quan