我的 PHP 應用程式結束時沒有呼叫輸出緩沖區的問題。
如果我get_ob_status(true)在腳本結束前呼叫,我會得到以下輸出:
Array
(
[0] => Array
(
[name] => FatalErrorHandler
[type] => 1
[flags] => 113
[level] => 0
[chunk_size] => 0
[buffer_size] => 32768
[buffer_used] => 32058
)
[1] => Array
(
[name] => RequestLogger
[type] => 1
[flags] => 12401
[level] => 1
[chunk_size] => 0
[buffer_size] => 0
[buffer_used] => 0
)
)
外部緩沖區看起來很寬泛,正如我所期望的那樣,但內部緩沖區有兩件事很奇怪:
它是空的(所有東西都已經放到了外部緩沖區)。我不知道我的代碼中有什么會導致這種情況,因為沒有發生顯式重繪 。為什么會被繞過?
該“標志”屬性包含一個奇怪,無證值:12401.位1,圖5,圖6和7都記錄:所述第一位元指示所述緩沖狀態(
PHP_OUTPUT_HANDLER_START),而其他的指示由設定標志ob_start()(即緩沖器是可沖洗的,可清潔和可洗掉)。但是,第 13 位和第 14 位也已設定,據我所知,這些完全沒有記錄。
兩個緩沖區都是使用ob_start("FunctionName")沒有其他引數創建的。我還應該注意到 PHP 5.3 中沒有任何問題,一切都按預期作業,并且輸出ob_get_status()顯示的正是我希望看到的。我知道輸出緩沖似乎在 PHP 5.4 中進行了重大重寫,這可能是造成這種情況的原因。
這些未記錄的標志是什么意思,它們是否給出了關于為什么跳過輸出緩沖區的任何指示?
uj5u.com熱心網友回復:
我無法回答為什么緩沖區為空,但我可以指出缺少標志的方向:https : //github.com/php/php-src/blob/a1a8e9032c496c060767d1bba6eebdcf6c935d25/main/php_output.h#L41
/* handler status flags */
#define PHP_OUTPUT_HANDLER_STARTED 0x1000
#define PHP_OUTPUT_HANDLER_DISABLED 0x2000
#define PHP_OUTPUT_HANDLER_PROCESSED 0x4000
你可以在這里看到這些使用:https : //github.com/php/php-src/blob/90b7bde61507cee1c6b37f153909d72f5b203b8c/main/output.c#L1008
switch (status) {
case PHP_OUTPUT_HANDLER_FAILURE:
/* disable this handler */
handler->flags |= PHP_OUTPUT_HANDLER_DISABLED;
已經從檔案的角度提交了一個錯誤(一直到最后),但似乎還沒有人對它做任何事情。
您可以使用以下方法輕松重現標志(如果您愿意):
ob_start();
ob_flush();
var_dump(ob_get_status(true));
這應該給你:
array(1) {
[0]=>
array(7) {
["name"]=>
string(22) "default output handler"
["type"]=>
int(0)
["flags"]=>
int(20592)
["level"]=>
int(0)
["chunk_size"]=>
int(0)
["buffer_size"]=>
int(16384)
["buffer_used"]=>
int(0)
}
}
您的具體代碼似乎是 PHP_OUTPUT_HANDLER_STARTED | PHP_OUTPUT_HANDLER_DISABLED
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348182.html
標籤:php
上一篇:為每個用戶mysql無限分配一行
