Heim  >  Artikel  >  Backend-Entwicklung  >  Der Header kann in PHP nicht übersprungen werden

Der Header kann in PHP nicht übersprungen werden

高洛峰
高洛峰Original
2018-05-14 15:53:153320Durchsuche

Lösung für Warnung: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von...

Wenn die Meldung häufig angezeigt wird: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von (...) . Tatsächlich wurde der gewünschte Effekt erzielt, aber ich habe im Internet viele Lösungen gefunden. Die durch umfassende Verwendung erhaltene Lösung ist

1 PHP-Tag oben auf der Seite. >

2 Ob_end_flush(); hinzufügen

Unter den zurückgegebenen Informationen können Sie die Realität der Fehlermeldung blockieren

Auch die Methoden anderer Personen übertragen , vielleicht in anderen Situationen Wird wirksam sein

Wenn Sie diese Meldung erhalten: „Warnung: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von ....“

Wenn Sie diese Warnung beim Ausführen des PHP-Programms sehen : „Warnung: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von …“

Einige Hinweise basierend auf den folgenden Benutzerbeiträgen:

Es gibt mehrere Lösungen:

1 Zeilen (Leerzeilen):

Stellen Sie sicher, dass nach f94092635d00f016dcf35890fa848e0b des aufrufenden PHP-Skripts keine Leerzeile steht. ?>, insbesondere Dateien einschließen oder erfordern. Viele Probleme werden durch diese Leerzeilen verursacht.

2. Verwenden Sie die Exit-Anweisung (zum Lösen verwenden Sie „Exit“).

Die Verwendung der Exit-Anweisung nach dem Header scheint einigen Leuten zu helfen.

Exit() nach dem Header hinzufügen ");
exit();

3. PHP hat dieses lästige Problem: Wenn Ihr HTML vor PHP-Code oder Header-Änderung steht, bevor er auf eine bestimmte Seite umgeleitet wird, wird die Meldung „Warnung: Nicht möglich“ angezeigt Header-Informationen ändern – Header bereits gesendet von ...“ Grundsätzlich ist der Header bei jeder Ausgabe an den Browser festgelegt und kann nicht geändert werden. Es gibt also zwei Möglichkeiten, das Problem zu umgehen:

3a. Verwenden Sie JavaScript (Verwenden Sie Zu lösendes Javascript):


Da es sich um ein Skript handelt, wird der Header erst bei der Ausführung von Javascript geändert.

Sie können den Header durch Javascript ersetzen. Aber ich habe den obigen Code nicht erfolgreich ausgeführt... Darüber hinaus ist zu beachten, dass die Verwendung dieser Methode erfordert, dass der Browser Javascript unterstützt.
<? echo "<script> self.location(\"file.php\");</script>"; ?>


3b Verwenden Sie die Ausgabepufferung (mit Ausgabe-Caching lösen). :


Dadurch wird der Ausgabepuffer auf dem Server gespeichert und noch nicht an den Browser ausgegeben, was bedeutet, dass Sie den Header bis zur Anweisung ob_end_flush() beliebig ändern können Bei der Javascript-Methode wird davon ausgegangen, dass im Browser Javascript aktiviert ist. Es entsteht jedoch ein Mehraufwand für die Speicherung des Ausgabepuffers auf dem Server, aber mit moderner Hardware wäre das meiner Meinung nach keine so große Sache Sie wissen sicher, dass Ihr Benutzer Javascript in seinem Browser aktiviert hat.

<?php ob_start(); ?> 
... HTML codes ... 
<?php 
... PHP codes ... 
header ("Location: ...."); 
ob_end_flush(); 
?>

Wie der Code oben speichert diese Methode die Seite bei der Generierung zwischen, sodass der Header nach der Ausgabe des Headers ausgegeben werden kann . Das Wunschboard auf dieser Site verwendet diese Methode, um das Header-Problem zu lösen.
Klicken Sie in der Hintergrundverwaltung oder manchmal im Forum auf eine Seite und eine

Warnung: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von...

Diese Art von Anweisung wird oben angezeigt Der Grund dafür ist ein Problem mit der setcookie-Anweisung.

Es gibt einige Einschränkungen bei der Verwendung von Cookies, wie zum Beispiel:
1. Die Beschreibung des Aufrufs setcookie muss vor dem 100db36a723c770d327fc0aef2ce13b1-Tag platziert werden.

Echo kann nicht vor dem Aufruf verwendet werden setcookie

3. Das Cookie erscheint erst im Programm, wenn die Webseite neu geladen wird
4. Die Setcookie-Funktion muss gesendet werden, bevor Daten an den Browser ausgegeben werden
5.......
Basierend auf der oben genannten Einschränkung stoßen Sie beim Ausführen der Funktion setcookie() häufig auf Probleme wie „Undefinierter Index“, „Header-Informationen können nicht geändert werden – Header bereits gesendet von“ usw. Die Methode zur Lösung des Problems Der Fehler „Header-Informationen können nicht geändert werden – Header bereits gesendet von“ lautet: Verzögern Sie die Ausgabe von Daten an den Browser. Daher können Sie die Funktion ob_start(); hinzufügen. Dies wird es lösen.

4.set Output_buffering = On in php.ini (aktivieren Sie Output_buffering in php.ini)
Set Output_buffering = On aktiviert die Ausgabepufferung für alle Dateien. Diese Methode kann jedoch Ihre PHP-Ausgabe verlangsamen. Die Leistung dieser Methode hängt davon ab, mit welchem ​​Webserver Sie arbeiten und welche Art von Skripten Sie verwenden.

Diese Methode ist theoretisch dieselbe wie die 3b-Methode. Allerdings aktiviert diese Methode das Ausgabe-Caching aller PHP-Programme, was sich abhängig von der Leistung des Servers und der Komplexität des Codes auf die Effizienz der PHP-Ausführung auswirken kann.


Gestern wollte ich PHP verwenden, um einen Code zum Herunterladen von Dateien zu schreiben. Da ich nicht wissen wollte, wie man das HTTP-Protokoll einrichtet, bin ich direkt zu php.NET gegangen, um Beispiele für den Header zu finden. ) Funktion. Es gab viele Codes, also habe ich einen Abschnitt direkt kopiert

<?php 
$file = &#39;filetest.txt&#39;;//filetest.txt文件你随便写点东西进去就好了 
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize(&#39;filetest.txt&#39;)); 
flush(); // this doesn&#39;t really matter.
$fp = fopen($file, "r"); 
while (!feof($fp)) 
{ 
    echo fread($fp, 65536); 
    flush(); // this is essential for large downloads 
}
fclose($fp);
?>

运行了一下发现不行,一直报错:Warning: Cannot modify header information - headers already sent by (output started at E:\xampp\htdocs\test\downloadfile\file_download.php:1) in E:\xampp\htdocs\test\downloadfile\file_download.php on line 3

我很看了很久,文件一开始就直接是header代码了,没任何输出怎么会说已有字符输出了呢?后来上网查到别人给的提示,才发现,原来我创建文件的时候是直接用记事本存储为UTF8, 原来这样也会出错

----------------以下是引用他人的建议 --------------------

方法一: 
在PHP里Cookie的使用是有一些限制的。 
1、使用setcookie必须在100db36a723c770d327fc0aef2ce13b1标签之前 
2、使用setcookie之前,不可以使用echo输入内容 
3、直到网页被加载完后,cookie才会出现 
4、setcookie必须放到任何资料输出浏览器前,才送出 
..... 
由于上面的限制,在使用setcookie()函数时,学会遇到 "Undefined index"、"Cannot modify header information - headers already sent by"…等问题,解决办法是在输出内容之前,产生cookie,可以在程序的最上方加入函数 ob_start();

ob_start :打开输出缓冲区 
函数格式:void ob_start(void) 
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用 ob_end_flush()或flush()输出缓冲区的内容。


方法二: 
解 决Warning: Cannot modify header information - headers already sent by ...... 前几天装了个php的大头贴系统测试,发现报错Warning: Cannot modify header information - headers already sent by ......
今天又装openads,还是出现这个问题。怒了。上网找了半天,有人说要在文件开头写上 
ob_start(); 
失败。 
后来打开 php.ini 然后把 output_buffering 设为 on 。重起appache,OK。看来这才是解决办法。

特别注意:(我就是看了这个才解决问题的) 
如果使用utf-8编码,一定要去掉UTF-8中的BOM,这都是因为utf-8编码文件含有的bom原因,而php4,5都是不支持bom的。去掉 bom,可以用Notepad++打开转换一下。(我就是看了这个才解决问题的)

用PHP的ob_start(); 控制您的浏览器cache 。我另外单独转载了一篇文章关于用PHP的ob_start();控制您的浏览器cache的文章 

更多php中header无法跳转相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn