php里面为什么header之前有输出报错 源码分析
众所周知,php 里面 header之前有输出的话,会报错,例如下面这样 就这个错误,我们开始查阅php源代码,到底是怎样做的,至于php源代码分析,安装,和调试时怎样配置的,我会专门写一篇文章去记录的, 这里我是使用php-cli命令行的sapi,方便啊,首先我们先看
众所周知,php 里面 header之前有输出的话,会报错,例如下面这样
就这个错误,我们开始查阅php源代码,到底是怎样做的,至于php源代码分析,安装,和调试时怎样配置的,我会专门写一篇文章去记录的,这里我是使用php-cli命令行的sapi,方便啊,首先我们先看看var_dump的实现啦
1.var_dump
我们知道,var_dump是php的标准函数啦,不是扩展里面的东西,所以会容易比较好找
我们可以见到啦,var_dump调用了php_var_dump函数啦
之后又调用了php_printf,我猜这个应该都是php内核用到的输出函数吧,我们再去php_printf看看吧
可见,php_printf模仿了c的printf,又是一个不定参数的函数,上面可以看到,又调用了PHPWRITE这个宏
实际是php_output_write函数啦
我们看看这个函数的逻辑吧
1,输出层是否激活,如果激活就调用php_output_op函数
2,如果不激活,那么直接输出到stderr去
2。 PHP_OUT_ACTIVATED由来
我们是用php-cli这个sapi的,跟踪了php启动过程,发觉,每个sapi都会调用一个函数,那就是
这个文件时在php-cli.c里面,有兴趣的读者可以看看这个,php在开始接受请求之前都会调用它的,截取一部分函数吧
我看看见了一个函数,php_out_activate函数啦
激活了输出层啦,证明可以输出啦
3 回到php_output_op函数
流程
1 如果开启了缓冲区的话(obstart这种函数啦),就进入php_output_handler_op函数
2,如果没有开启的话,就直接赋值给临时通道(context)
3,如果真的有内容输出的话,就执行php_output_header函数
我们重点看php_output_header函数
4 php_output_header
这个函数很简单啦,就是设置当前输出行和该页面的名称,也就是我们调用var_dump的位置啦
具体有什么用,下面就知道啦
5,header函数实现
跟到sapi_header_op函数
在这里我们终于可以看到报错的哪行信息啦
header_sent什么时候开始设置呢
答案就是在在上面的 php_output_header函数里面调用的php_header里面啦
6 php_header
该函数的作用就是发送一个header(content-type:text/html);的东西,然后设置 SG(headers_sent) = 1
7 下面来分析为什么开启ob_start不会报错
答案是开启了 因为开启了缓冲区,还记得上面php_output_op函数里面的一句代码吗
/*
* broken up for better performance:
* - apply op to the one active handler; note that OG(active) might be popped off the stack on a flush
* - or apply op to the handler stack
*/
if (OG(active) && (obh_cnt = zend_stack_count(&OG(handlers)))) {
上面的注释大家应该应该很清楚吗,如果我们调用了一个ob_start函数,php内核会申请一个handler结构同时为这个结构申请一个缓冲区 php_output_buffer
typedef struct _php_output_handler {
char *name;
size_t name_len;
int flags;
int level;
size_t size;
php_output_buffer buffer;
void *opaq;
void (*dtor)(void *opaq TSRMLS_DC);
union {
php_output_handler_user_func_t *user;
php_output_handler_context_func_t internal;
} func;
} php_output_handler;
当然,申请完缓冲区,就会初始化它然后把它压入栈啦,然后把handler赋给 OG(handlers)

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Der logische Nichtoperator (!) Hat die Priorität neben Klammern, was bedeutet, dass er den meisten anderen Betreibern in Ausdrücken vorausgeht. Das Verständnis der Priorität erfordert nicht nur ein Auswendiglernen, sondern auch das Verständnis der Logik und der potenziellen Fallstricke, um nicht nachweisbare Fehler in komplexen Ausdrücken zu vermeiden. Das Hinzufügen von Klammern kann die Ausdrucksabsicht klären, die Klarheit und Wartbarkeit der Code verbessern und unerwartetes Verhalten verhindern.

Methoden zur effizienten und eleganten Methode finden den größten gemeinsamen Divisor in der C -Sprache: Verwenden Sie die Phasenaufteilung, um den Rest ständig zu teilen, bis der Rest 0 ist. Zwei Implementierungsmethoden werden bereitgestellt: Rekursion und Iteration sind prägnant und klar, und die iterative Implementierung ist höher und stabiler. Achten Sie auf die Behandlung negativer Zahlen und 0S und berücksichtigen Sie die Leistungsoptimierung, aber die Phasenabteilung selbst ist effizient genug.

Die Best Practices von Standard in der C -Sprache: Platzieren Sie sie am Ende der Switch -Anweisung als Standardverarbeitung für unerreichte Werte; Es wird verwendet, um unbekannte oder ungültige Werte zu verarbeiten, um die Programm Robustheit zu verbessern. Vermeiden Sie die Duplikation mit Fallzweigen, um die zuversichtliche Aufrechterhaltung zu erhalten. Kommentieren Sie deutlich zum Zweck der Standardzweig, um die Lesbarkeit zu verbessern. Vermeiden Sie es, mehrere Standardeinstellungen in einem Fall zu verwenden, um Klarheit aufrechtzuerhalten. Halten Sie den Standardzweig präzise und vermeiden Sie komplexe Operationen. Erwägen Sie, Aufzählungswerte als Fallbedingungen zu verwenden, um die Wartbarkeit zu verbessern. Verwenden Sie in großen Switch -Anweisungen mehrere Standardzweige, um unterschiedliche Situationen zu verarbeiten.

In Bezug auf FileReader-Instanziierung und Dateilesen in der Front-End-Entwicklung müssen wir häufig von Benutzern hochgeladene Dateien verarbeiten. verwenden

Warum wird mein Code nicht wirksam, wenn sie RXJS zum Betrieb in Streams verwenden? Rxjs lernen ...

In der C/C -Codeüberprüfung gibt es häufig Fälle, in denen keine Variablen verwendet werden. In diesem Artikel werden häufige Gründe für ungenutzte Variablen untersucht und erklärt, wie der Compiler Warnungen ausstellt und wie bestimmte Warnungen unterdrückt werden können. Ursachen für nicht verwendete Variablen Es gibt viele Gründe für ungenutzte Variablen im Code: Codefehler oder Fehler: Der direkteste Grund ist, dass es Probleme mit dem Code selbst gibt und die Variablen möglicherweise überhaupt nicht benötigt werden oder sie benötigt, aber nicht korrekt verwendet werden. Code Refactoring: Während des Softwareentwicklungsprozesses wird der Code kontinuierlich geändert und neu gestaltet, und einige einmal wichtige Variablen können zurückgelassen und nicht verwendet werden. Reservierte Variablen: Entwickler können einige Variablen für die zukünftige Verwendung vorlegen, werden jedoch am Ende nicht verwendet. Bedingte Zusammenstellung: Einige Variablen können nur unter bestimmten Bedingungen (z. B. Debug -Modus) liegen

Eingehende Diskussion der Unterschiede in der Konsole.log-Ausgabe in diesem Artikel wird die Gründe analysieren, warum die Ausgabeergebnisse der Konsolenfunktion in einem Code-Stück unterschiedlich sind. Code -Snippets beinhalten URL -Parameterauflösung ...
