2011-03-06 47 views
4

是否有可能PHP的標準輸出的數據過濾的流狀的方式:如何流式過濾PHP的標準輸出數據?

standard output ⟶ output filter ⟶ standard output 

我已經意識到ob_start。但我不想一次處理整個輸出,但是使用php_user_filter或類似的流式處理。

+0

那麼你在想什麼是定義一個回調,修改什麼進入標準輸出?如果是,那麼該回調何時會被調用(多久)? – Jon

+0

@Jon:調用次數可能取決於輸出塊的數量(例如'echo'參數,輸出行或某些內部緩衝區等)。或者它只被調用一次,並且在處理每個塊的準無限循環期間可以檢查流狀態。 – Gumbo

回答

3

我不太明白這是什麼,但這是沒有理由不發表答案。

您可以使用ob_start()回調並使其處理部分內容。所有你需要做的就是在初始化後立即設置ob_implicit_flush()。現在通常的回調是一個簡單的輸出功能,但你可以把它複雜與期望:

class ob_callback { 
    function __invoke($part, $end_flag_0x04) { 
     return "+$part"; 
     // or map to $stream->filter($in, $out, &$consumed, $closing) 
    } 
    function __destruct() { /* cleanup */ } 
} 

ob_start(new ob_callback, 2); 
ob_implicit_flush(TRUE); 

我不知道流-Y的使用將是什麼樣子。但我認爲沒有其他方法來攔截PHP標準輸出。請注意,隱式刷新在CLI上不起作用。

0

如果我正確理解你的問題,可以使用ob_start(),$chunk_size這個第二個參數。

ob_start('my_callback', 1024);

上面的例子將調用my_callback()每次輸出將導致達到或超過一個千字節的緩衝區。如果您在單獨的報表中吐出數千字節,則會多次觸發my_callback()。如果您輸出幾個千字節作爲單個字符串,這將不會有用,因爲每個輸出最多隻能觸發一次my_callback()