Hướng dẫn php write output buffer to file - php ghi bộ đệm đầu ra vào tệp

Tôi đang gặp rắc rối với một tập lệnh cập nhật. Nó chạy trong vài giờ vì vậy tôi muốn nó xuất bản trực tiếp vào một tệp văn bản.

Tôi bắt đầu tài liệu với

ob_start();

Sau đó, trong vòng lặp trong khi nó lặp lại thông qua các bản ghi của cơ sở dữ liệu) tôi có cái này

$size=ob_get_length();
if ($size > 0)
{
    $content = ob_get_contents();
    logit($contents);
    ob_clean();
}

Và cuối cùng là hàm logit

function logit($data)
{
    file_put_contents('log.txt', $data, FILE_APPEND);
}

Tuy nhiên, tệp nhật ký vẫn trống. Tôi đang làm gì sai?

Đã hỏi ngày 22 tháng 7 năm 2010 lúc 11:02Jul 22, 2010 at 11:02

Hướng dẫn php write output buffer to file - php ghi bộ đệm đầu ra vào tệp

2

try

logit($content);
//           ^^ Note the missing s

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 11:05Jul 22, 2010 at 11:05

Hướng dẫn php write output buffer to file - php ghi bộ đệm đầu ra vào tệp

Jigfoxjigfoxjigfox

17.9k3 Huy hiệu vàng56 Huy hiệu bạc73 Huy hiệu đồng3 gold badges56 silver badges73 bronze badges

0

$size=ob_get_length();
if ($size > 0)
{
    $content = ob_get_contents();
    logit($contents);
    ob_clean();
}
2 không giống như
$size=ob_get_length();
if ($size > 0)
{
    $content = ob_get_contents();
    logit($contents);
    ob_clean();
}
3.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 11:07Jul 22, 2010 at 11:07

Ahmed Amanahmed AmanAhmed Aman

2.3431 Huy hiệu vàng19 Huy hiệu bạc33 Huy hiệu đồng1 gold badge19 silver badges33 bronze badges

Đối với bất kỳ ai đến đây để tìm kiếm một chức năng cho việc này, tôi đã viết một cái tốt đẹp hôm nay:

//buffer php outout between consecutive calls and optionally store it to a file:
function buffer( $toFilePath=0, $appendToFile=0 ){
    $status = ob_get_status ();
    if($status['level']===1) return ob_start(); //start the buffer
    $res = ob_get_contents();
    ob_end_clean();
    if($toFilePath) file_put_contents($toFilePath, $res, ($appendToFile ? FILE_APPEND : null));
    return $res;
}

Sử dụng mẫu:

buffer(); //start the buffer

echo(12345); //log some stuff
echo(678910);

$log = buffer('mylog.txt',1); //add these lines to a file (optional)

echo('Heres the latest log:'.$log);

Đã trả lời ngày 17 tháng 5 năm 2018 lúc 13:02May 17, 2018 at 13:02

Cronokleecronokleecronoklee

6.1528 Huy hiệu vàng48 Huy hiệu bạc76 Huy hiệu đồng8 gold badges48 silver badges76 bronze badges

Các chức năng bộ đệm đầu ra PHP cung cấp một cách tiện dụng để chặn các nội dung của bộ đệm trước khi nó được gửi đến trình duyệt. Đầu ra là bất cứ điều gì được gửi đến trình duyệt bất cứ khi nào bạn in một cái gì đó ra. PHP cho phép bạn chụp đầu ra này trong bộ đệm trước khi được gửi đến trình duyệt.

Bộ đệm đầu ra được điều khiển bởi hai cơ chế. Đầu tiên là thông qua chỉ thị php.ini output_buffering, thường được đặt thành TẮT. Nó có thể được bật bằng cách đặt điều này thành ON, hoặc số byte mà bộ đệm có thể chiếm. Khi phân bổ byte này đầy đủ, đầu ra được gửi đến trình duyệt.

Cơ chế thứ hai là thông qua việc sử dụng hàm ob_start (), bật bộ đệm đầu ra cho tập lệnh mà nó đang được chạy. Nếu bộ đệm đầu ra đã được đặt trong tệp php.ini thì điều này không cần thiết, nhưng nếu nó đã được đặt thành 'tắt' thì bạn sẽ gặp một số lỗi nếu bạn cố gắng làm bất cứ điều gì với bộ đệm. Để bắt đầu bộ đệm đầu ra, chỉ cần gọi hàm ob_start ().

ob_start();

Bất cứ điều gì bạn cố gắng in ra bây giờ sẽ không được xuất vào trình duyệt cho đến khi kết thúc tập lệnh. Để đẩy rõ ràng đầu ra vào trình duyệt, bạn có thể gọi hàm ob_flush ().

echo 'test';
ob_flush();

Bạn có thể tắt bộ đệm đầu ra bất cứ lúc nào bằng cách gọi ob_end_clean () hoặc ob_end_flush (). ob_end_clean () sẽ tắt bộ đệm hàng đầu nhất (bạn có thể có nhiều hơn một) và loại bỏ nội dung. ob_end_flush () sẽ xuất nội dung của bộ đệm trên cùng sau đó tắt nó. Dưới đây là một cách dễ dàng để sử dụng ob_end_flush () để xóa và tắt tất cả các bộ đệm đầu ra có sẵn và xuất nội dung của chúng.

while (@ob_end_flush());

Bạn có thể nhận được nội dung của bộ đệm đầu ra bất cứ lúc nào (miễn là bạn không tắt nó) bằng cách gọi hàm ob_get_contents (). Điều này trả về nội dung bộ đệm hiện tại. Dưới đây là một ví dụ về nó trong hành động.


some more text

Hàm ob_flush () sẽ làm trống bộ đệm đầu ra hiện tại và gửi nó đến trình duyệt. Vì vậy, điều quan trọng là gọi chức năng này sau khi bạn có nội dung của bộ đệm. Nếu bạn gọi nó trước khi bạn cố gắng lấy nội dung bộ đệm thì sẽ không có gì ở đó.

Sử dụng hàm ob_get_contents () là cách bạn có thể xuất văn bản vào cả tệp và trình duyệt. Ví dụ sau đây sẽ viết một số văn bản vào trình duyệt và cũng lưu trữ văn bản này trong một biến được ghi vào một tệp ở cuối tập lệnh. Tệp được đưa ra dấu thời gian hiện tại làm tên. Hãy chắc chắn rằng bạn có đủ quyền để viết vào thư mục này bằng CHMOD.

$size=ob_get_length();
if ($size > 0)
{
    $content = ob_get_contents();
    logit($contents);
    ob_clean();
}
0

Hàm ob_start () có thể được gọi mà không cần bất kỳ tham số nào, nhưng bạn có thể cung cấp tên của một hàm sẽ được sử dụng để truyền nội dung của bộ đệm qua trước khi nó được gửi đến trình duyệt. Sử dụng cơ chế này dễ dàng hơn một chút vì nó có thể dễ dàng loại bỏ khỏi bất kỳ tập lệnh nào. Hàm gọi lại phải có một tham số chuỗi duy nhất, là nội dung của bộ đệm và phải trả về một chuỗi, tốt nhất là nội dung của bộ đệm.

$size=ob_get_length();
if ($size > 0)
{
    $content = ob_get_contents();
    logit($contents);
    ob_clean();
}
1

Được cảnh báo rằng việc sử dụng bộ đệm đầu ra có thể dẫn đến sự chậm lại rõ ràng của trang web của bạn do mọi thứ được tạo ra phía máy chủ trước khi được gửi đến máy khách.

Cập nhật: Đã thêm một số lời khuyên về việc có quyền chính xác và sửa một tên biến trong ví dụ thứ hai.Cảm ơn William vì email của anh ấy đã chỉ ra điều này :) Added some advice about having correct permissions and corrected a variable name in the second example. Thanks to William for his email on pointing this out :)

Hỗ trợ chúng tôi!

Hãy hỗ trợ chúng tôi và cho phép chúng tôi tiếp tục viết bài.