PHP'de “Başlıklar zaten gönderildi” hatası nasıl düzeltilir


831

Senaryomu çalıştırırken, bunun gibi birkaç hata alıyorum:

Uyarı: Başlık bilgileri değiştirilemiyor - 23 numaralı satırdaki /some/file.php dosyasında ( çıkışlar /some/file.php:12 ile başlayan ) zaten gönderilmiş olan başlıklar değiştirilemiyor

Hata mesajlarında belirtilen hatlar içerir header()ve setcookie()çağırır.

Bunun nedeni ne olabilir? Ve nasıl düzeltilir?



Hiçbir metin çıkmadığından emin olun ( ob_startve ob_end_clean() burada yararlı olabilir). Daha sonra bir çerezi veya oturumu eşit olarak ayarlayabilir ob_get_contents()ve daha sonra ob_end_clean()arabelleği temizlemek için kullanabilirsiniz .
Jack Tuck

safeRedirectPHP Kütüphanemdeki işlevi kullanın : github.com/heinkasner/PHP-Library/blob/master/extra.php
heinkasner

5
~~~~~~~~~~ Dosyanız ENCODING olmamalı UTF-8, ancak UTF-8 (Without BOM)~~~~~~~~~~~
T.Todua

Yanıtlar:


2997

Üstbilgileri göndermeden önce çıktı yok!

HTTP üstbilgileri gönderen / değiştiren işlevler, herhangi bir çıktı yapılmadan önce çağrılmalıdır . summary ⇊ Aksi takdirde çağrı başarısız olur:

Uyarı: Başlık bilgileri değiştirilemiyor - başlıklar zaten gönderildi (çıktı komut dosyasında başladı : satır )

HTTP üstbilgisini değiştiren bazı işlevler şunlardır:

Çıktı olabilir:

  • kasıtlı:

    • print, echo Ve diğer fonksiyonları üretim çıkışı
    • Ham <html>bölümler önceki <?phpkod.

Neden oluyor?

Çıktılardan önce başlıkların neden gönderilmesi gerektiğini anlamak için tipik bir HTTP yanıtına bakmak gerekir . PHP komut dosyaları temel olarak HTML içeriği oluşturur, ancak web sunucusuna bir dizi HTTP / CGI üstbilgisi iletir:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

Sayfa / çıktı her zaman başlıkları takip eder. PHP önce üstbilgileri web sunucusuna iletmelidir. Bunu sadece bir kez yapabilir. Çift hat kırılmasından sonra onları daha fazla değiştirebilir.

PHP ilk çıkışını aldığında ( print, echo, <html>) o olacaktır temizlemek tüm toplanan başlıklarını. Daha sonra istediği tüm çıktıları gönderebilir. Ancak, daha fazla HTTP başlığı göndermek imkansızdır.

Prematüre çıktının nerede meydana geldiğini nasıl öğrenebilirsiniz?

header()Uyarı sorun nedenini bulmak için tüm ilgili bilgileri içerir:

Uyarı: Üstbilgi bilgileri değiştirilemiyor - 100. satırdaki /www/usr2345/htdocs/index.php adresinde zaten gönderilen (çıkış / www / usr2345 / htdocs / auth.php : 52 adresinde başlayan ) üstbilgiler

Burada "satır 100", header() çağrının başarısız olduğu komut dosyasına karşılık gelir .

Parantez içindeki " çıktı başlangıç " notu daha önemlidir. Önceki çıktının kaynağını belirtir. Bu örnekte bu auth.php ve çizgi52 . Bu, erken çıktı aramak zorunda kaldığınız yerdi.

Tipik nedenleri:

  1. Baskı, yankı

    Kasıtlı çıktılar printve echoifadeler HTTP üstbilgileri gönderme fırsatını sonlandıracaktır. Bunu önlemek için uygulama akışı yeniden yapılandırılmalıdır. İşlevleri ve şablon düzenlerini kullanın . header()Çağrıların daha önce yapılmasını sağlayınMesajlar yazılmadan yapıldığından .

    Çıktı üreten işlevler şunları içerir:

    • print, echo, printf,vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump,print_r
    • readfile, passthru, flush, imagepng,imagejpeg


    diğerleri ve kullanıcı tanımlı işlevler arasında.

  2. Ham HTML alanları

    Bir .phpdosyadaki ayrıştırılmamış HTML bölümleri de doğrudan çıktıdır. Bir header()çağrıyı tetikleyecek komut dosyası koşulları, herhangi bir ham <html>bloktan önce not edilmelidir .

    <!DOCTYPE html>
    <?php
        // Too late for headers already.

    İşlemi çıktı mantığından ayırmak için şablonlama şeması kullanın.

    • Form işleme kodunu komut dosyalarının üstüne yerleştirin.
    • İletileri ertelemek için geçici dize değişkenleri kullanın.
    • Gerçek çıkış mantığı ve karıştırılmış HTML çıktısı son olarak gelmelidir.

  3. Daha önce <?php"script.php line 1 " uyarıları için boşluk

    Uyarı, satırdaki çıktıya atıfta 1bulunuyorsa, çoğunlukla açılış belirtecinden önce boşluk , metin veya HTML önde gelir <?php.

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.

    Benzer şekilde, ekli komut dosyaları veya komut dosyası bölümleri için de oluşabilir:

    ?>
    
    <?php

    PHP aslında yakın etiketlerden sonra tek bir satır sonu yiyor . Ancak, bu tür boşluklara kaydırılmış birden fazla satırsonu veya sekme veya boşluk telafi etmez.

  4. UTF-8 Malzeme Listesi

    Çizgi çizgileri ve boşluklar tek başına bir sorun olabilir. Ancak buna neden olabilecek "görünmez" karakter dizileri de vardır. En ünlü UTF-8 BOM (Byte-Order-Mark) metin editörleri tarafından gösterilmez. EF BB BFUTF-8 kodlu belgeler için isteğe bağlı ve yedekli bayt dizisidir . Ancak PHP bunu ham çıktı olarak kabul etmek zorundadır. Çıktıdaki karakterler (istemci belgeyi Latin-1 olarak yorumlarsa) veya benzer bir "çöp" olarak görünebilir .

    Özellikle grafik editörler ve Java tabanlı IDE'ler varlığından habersizdir. Görselleştirmezler (Unicode standardı tarafından zorunlu tutulur). Bununla birlikte, çoğu programcı ve konsol editörleri:

    UTF-8 BOM yer tutucusunu ve MC düzenleyicisine bir nokta gösteren editöre

    Orada sorunu erken fark etmek kolaydır. Diğer editörler bir dosya / ayarlar menüsünde varlığını belirleyebilir (Windows'ta Notepad ++ sorunu tanımlayıp çözebilir ), Malzeme Listelerinin varlığını denetlemek için başka bir seçenek bir hexeditor'a başvurmaktır . Açık * nix sistemlerihexdump genellikle, bunları ve diğer sorunları denetlemeyi kolaylaştıran bir grafik varyant değilse, kullanılabilir:

    utv-8 bom gösteren beav hexeditor

    Kolay bir düzeltme, metin düzenleyicisini dosyaları "UTF-8 (BOM yok)" veya benzeri bir adlandırma olarak kaydedecek şekilde ayarlamaktır. Çoğu zaman yeni gelenler yeni dosyalar oluşturmaya ve önceki kodu kopyalayıp yapıştırmaya başvururlar.

    Düzeltme yardımcı programları

    Metin dosyalarını ( sed/awk veya recode) incelemek ve yeniden yazmak için otomatik araçlar da vardır . PHP için özellikle phptagstag tidier var . Yakın ve açık etiketleri uzun ve kısa formlara yeniden yazar, ancak önde gelen ve sondaki boşluk, Unicode ve UTF-x BOM sorunlarını kolayca düzeltir:

    phptags  --whitespace  *.php

    Tüm bir ekleme veya proje dizininde kullanmak akılcı.

  5. Sonra boşluk ?>

    Hata kaynağı kapanışın?> arkasında belirtilirse , burada bazı boşluk veya ham metin yazılır. PHP son işaretçisi bu noktada kod yürütülmesini sonlandırmaz. Sonraki metin / boşluk karakterleri hala sayfa içeriği olarak yazılacaktır.

    Yaygın olarak, özellikle yeni gelenler için, takip eden ?>PHP kapatma etiketlerinin atlanması önerilir . Bu , bu davaların küçük bir kısmını kaçırmaktadır . (Oldukça yaygın include()dsenaryolar suçludur.)

  6. "0 satırında bilinmeyen" olarak belirtilen hata kaynağı

    Herhangi bir hata kaynağı somutlaştırılmazsa, genellikle bir PHP uzantısı veya php.ini ayarıdır.

    • Zaman zaman gzipakış kodlama ayarı veyaob_gzhandler .
    • Ancak extension=, örtük bir PHP başlatma / uyarı mesajı üreten herhangi bir çift yüklü modül de olabilir .

  7. Önceki hata mesajları

    Başka bir PHP deyimi veya ifadesi bir uyarı iletisine veya bildirimin yazdırılmasına neden olursa, bu da erken çıktı olarak sayılır.

    Bu durumda, hatadan kaçınmanız, deyimin yürütülmesini geciktirmeniz veya mesajı örneğin isset()veya @()- daha sonra hata ayıklamayı engellemediğinde bastırmanız gerekir .

Hata mesajı yok

Eğer varsa error_reportingveya display_errorsözürlü başına php.ini, o zaman hiçbir uyarı görünecektir. Ancak hataları görmezden gelmek sorunu ortadan kaldırmaz. Başlıklar, erken çıktıdan sonra gönderilemez.

Bu nedenle header("Location: ...")yönlendirmeler sessizce başarısız olduğunda , uyarıları incelemek çok tavsiye edilir. Bunları çağırma komut dosyasının üstündeki iki basit komutla yeniden etkinleştirin:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Ya set_error_handler("var_dump");da her şey başarısız olursa.

Yönlendirme başlıklarından bahsetmişken, son kod yolları için genellikle aşağıdaki gibi bir deyim kullanmalısınız:

exit(header("Location: /finished.html"));

Tercihen, header()arıza durumunda bir kullanıcı mesajı yazdıran bir yardımcı program işlevi bile .

Geçici çözüm olarak çıktı arabelleğe alma

PHP'lerin çıktı arabelleğe alma bu sorunu hafifletmek için bir çözümdür . Genellikle güvenilir bir şekilde çalışır, ancak uygun uygulama yapılandırması ve çıktıyı kontrol mantığından ayırmanın yerine geçmemelidir. Asıl amacı, web sunucusuna yığın aktarımlarını en aza indirmektir.

  1. output_buffering= Ayar yine yardımcı olabilir. Php.ini dosyasında veya modern FPM / FastCGI kurulumlarında .htaccess veya .user.ini dosyasında yapılandırın .
    Etkinleştirilmesi, PHP'nin web sunucusuna anında aktarmak yerine çıktıyı arabelleğe almasına izin verir. PHP böylece HTTP üstbilgilerini toplayabilir.

  2. Aynı şekilde ob_start(); çağırma komut dosyasının üstüne bir çağrı ile de meşgul olabilir . Bununla birlikte, birçok nedenden dolayı daha az güvenilirdir:

    • <?php ob_start(); ?>İlk komut dosyasını başlatsa bile , boşluk veya ürün ağacı daha önce karıştırılabilir ve bu da onu etkisiz hale getirir .

    • HTML çıktısı için boşlukları gizleyebilir. Ancak uygulama mantığı ikili içerik göndermeye çalışır (örneğin, oluşturulan bir görüntü), arabelleğe alınmış harici çıktı bir sorun haline gelir. (Daha ileri bir ob_clean() çözüm olarak gerekli.)

    • Arabellek boyutu sınırlıdır ve varsayılan değerlere bırakıldığında kolayca taşabilir. Ve bu da nadir bir durum değil, gerçekleştiğinde izlenmesi zor .

Bu nedenle, her iki yaklaşım da özellikle geliştirme kurulumları ve / veya üretim sunucuları arasında geçiş yaparken güvenilmez olabilir. Bu nedenle çıktı tamponlaması yaygın olarak sadece bir koltuk değneği / kesinlikle bir çözüm olarak kabul edilir.

Ayrıca kılavuzdaki temel kullanım örneğine bakın ve daha fazla avantaj ve dezavantaj için:

Ama diğer sunucuda çalıştı !?

Üstbilgileri daha önce uyarmadıysanız , çıktı arabelleğe alma php.ini ayarı değişti. Muhtemelen mevcut / yeni sunucuda yapılandırılmamış.

İle kontrol headers_sent()

headers_sent()Başlık göndermek için hala mümkünse her zaman araştırma yapabilirsiniz . Bu, bir bilgiyi koşullu olarak yazdırmak veya diğer yedek mantığı uygulamak için kullanışlıdır.

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

Yararlı yedek çözümler şunlardır:

  • HTML <meta>etiketi

    Uygulamanızın yapısal olarak düzeltilmesi zorsa, yönlendirmelere izin vermenin kolay (ancak biraz profesyonel olmayan) bir yolu bir HTML <meta>etiketi enjekte etmektir . Bir yönlendirme aşağıdakilerle gerçekleştirilebilir:

     <meta http-equiv="Location" content="http://example.com/">

    Veya kısa bir gecikmeyle:

     <meta http-equiv="Refresh" content="2; url=../target.html">

    Bu, <head>bölümün ötesinde kullanıldığında geçersiz HTML'ye yol açar . Çoğu tarayıcı hala kabul ediyor.

  • JavaScript yönlendirmesi

    Alternatif olarak sayfa yönlendirmeleri için bir JavaScript yönlendirmesi kullanılabilir:

     <script> location.replace("target.html"); </script>

    Bu genellikle <meta>geçici çözümden daha HTML uyumlu olsa da, JavaScript özellikli istemcilere güvenir.

Bununla birlikte, her iki yaklaşım da orijinal HTTP header () çağrıları başarısız olduğunda kabul edilebilir geri dönüşler yapar. İdeal olarak bunu her zaman kullanıcı dostu bir mesaj ve son çare olarak tıklanabilir bağlantı ile birleştirirsiniz. (Örneğin, http_redirect () PECL uzantısının yaptığı nedir.)

Neden setcookie()ve session_start()ayrıca etkilenir

Her ikisi de setcookie()ve session_start()bir Set-Cookie:HTTP üstbilgisi göndermeniz gerekir . Dolayısıyla aynı koşullar geçerlidir ve erken çıkış durumları için benzer hata mesajları üretilir.

(Elbette tarayıcıdaki devre dışı çerezlerden ve hatta proxy sorunlarından da etkilenirler. Oturum işlevselliği açıkça boş disk alanına ve diğer php.ini ayarlarına vb. Bağlıdır.)

Diğer bağlantılar


Ayrıca normal notepad.exe zor. NetBeans normalde dosya bu şekilde kodlanmış bile BOM eklemez kullanın. Bir dosyayı daha sonra not defterinde düzenlemek, özellikle web sunucusu olarak IIS'ye işler. Apache (birim olarak eklenen) ürün ağacını atmış gibi görünüyor.
Teson

4
?>Bir php dosyalarının sonundan kapanışını kaldırmak genellikle bu hataları en aza indirmeye yardımcı olan iyi bir uygulamadır. Dosyaların sonunda istenmeyen boşluk oluşmayacak ve daha sonra yanıta başlık ekleyebileceksiniz. Çıktı tamponlama kullanıyorsanız ve dahil edilen dosyalar tarafından oluşturulan parçaların sonunda istenmeyen boşluklar görmek istemiyorsanız da kullanışlıdır.
Nikita

Garip bir şey, dosyamı cPanel Linux Hosting'ten VPS'ye taşıdım. Önce düzgün çalışıyor ama burada bu hatayı gösterdi. (Ben başlık önce bazı html kodu vardı). Neden?
Pablo Escobar

@Purushotamrawat " Ama diğer sunucuda çalıştı !? " hakkındaki bölümü okudunuz mu
mario

1
@PeterSMcIntyre UTF8 BOM muhtemelen (bunu düzeltin) / çıkış arabelleğe alma etkin değil (buna güvenmeyin).
mario

199

HTTP üstbilgilerini göndermeden önce ( veya ile ) bir şey gönderildiğinde bu hata iletisi tetiklenir . HTTP başlıklarından önce bir şeyin çıktısını almanın yaygın nedenleri şunlardır:setcookieheader

  • Yanlışlıkla boşluk, genellikle dosyaların başında veya sonunda, şöyle:

     <?php
    // Note the space before "<?php"
    ?>

       Bundan kaçınmak için sadece kapanışı dışarıda bırakın ?>- yine de gerekli değildir.

  • Bir php dosyasının başında bayt sırası işaretleri . Durumun bu olup olmadığını öğrenmek için bir hex editörü ile php dosyalarınızı inceleyin. Bayt ile başlamalıdırlar 3F 3C. Ürün ağacını EF BB BFdosyaların başlangıcından güvenle kaldırabilirsiniz .
  • Bu tür aramaları için Açık çıkış echo, printf, readfile, passthru, kod önce <?vs.
  • display_errorsPhp.ini özelliği ayarlanmışsa php tarafından gönderilen bir uyarı . Php bir programcı hatası çökmesini yerine, sessizce hatayı düzeltir ve bir uyarı yayar. display_errorsVeya error_reporting yapılandırmalarını değiştirebilmenize rağmen , sorunu gidermeyi tercih etmelisiniz.
    Yaygın nedenleri (örneğin bir dizinin tanımlanmamış elemanlarına kere vardır $_POST['input']kullanmadan emptyya da issetgiriş kümesi olup olmadığını test etmek için) ya da (olarak tanımlanmamış bir sabit yerine bir dizge kullanılarak $_POST[input]eksik tırnak not).

Açılması çıktı ara bellek problemi ortadan gerekir; çağrısından sonraki tüm çıktı ob_start, siz tamponu bırakana kadar bellekte arabelleğe alınır, örn ob_end_flush.

Ancak, çıktı arabelleğe alma sorunları önlerken, uygulamanızın neden HTTP üstbilgisinden önce bir HTTP gövdesi çıkardığını gerçekten belirlemelisiniz. Bu, bir telefon görüşmesi yapmak ve arayan kişiye yanlış numaraya sahip olduğunu söylemeden önce gününüzü ve hava durumunuzu tartışmak gibi bir şey olacaktır.


bana yardım teşekkürler
Vishwa Pratap

122

Daha önce birçok kez bu hatayı aldım ve tüm PHP programcısı en az bir kez bu hatayı aldım eminim.

Olası Çözüm 1

Bu hata , dosyanın başlangıcından önce veya dosyanın bitiminden sonra oluşan boşluklardan kaynaklanmış olabilir.Bu boşluklar burada olmamalıdır.

ör.) BURADA BOŞ ALAN YOK OLMALIDIR

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

Bu hataya neden olan dosyayla ilişkili tüm dosyaları kontrol edin.

Not: Bazen gedit (varsayılan bir linux editörü) gibi EDITOR (IDE), kaydetme dosyasına bir boş satır ekler. Bu olmamalı. Linux kullanıyorsanız. sayfanın sonunda?> sonra boşluk / satır kaldırmak için VI düzenleyicisini kullanabilirsiniz.

Olası Çözüm 2: Bu sizin durumunuz değilse, arabelleğe alma işlemi için ob_start komutunu kullanın:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Bu, çıktı arabelleğe almayı açar ve sayfa arabelleğe alındıktan sonra üstbilgileriniz oluşturulur.


18
ob_start()sadece sorunu gizler; bu sorunu çözmek için kullanmayın.
Ja͢ck

@ Ja͢ck Kullanmazsam ob_start(), o zaman bu sorunu çözmek için ne yapmalıyım:Headers already sent
Shafizadeh

@Sajad, özellikle kullandığınız düzenleyici nedeniyle hatayı alıyorsanız, soruna neden olmasını durdurmak veya editörleri değiştirmek için ayarlarla uğraşmalısınız. Hatayı başka bir nedenden dolayı alıyorsanız, sorunun gerçekte ne olduğunu bulmak ve çözmek için bu sorudaki yanıtları (özellikle kabul edilen cevap) okumalısınız.
Samsquanch

3
ob_start()sorunu "gizlemez" , sorunu çözer .
TMS

1
Dosyalarımı sunucuya yüklediğimde böyle bir sorun yaşadım, bu da PHP5.3'ü destekledi
GGSoft

86

Aşağıdaki satır yerine

//header("Location:".ADMIN_URL."/index.php");

yazmak

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

veya

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Sorununuzu kesinlikle çözecektir. Aynı sorunla karşı karşıya kaldım ancak başlık konumunu yukarıdaki şekilde yazarak çözdüm.


41

Siz yapıyorsunuz

printf ("Hi %s,</br />", $name);

Çerezleri ayarlamadan önce izin verilmez. Başlıklardan önce herhangi bir çıktı gönderemezsiniz, boş bir satır bile değil.


32

Bu çizgi yüzünden:

printf ("Hi %s,</br />", $name);

Sen olmamalı / yankı baskı başlıkları göndermeden önce bir şey.


31

ORTAK SORUNLAR:

(kopyalanan: kaynak )

====================

1) komuttan echo..önce herhangi bir çıktı (ör. Veya HTML kodları) olmamalıdır header(.......);.

2) etiketlerden önce ve sonra tüm beyaz boşlukları (veya yeni satırları ) kaldırın .<?php?>

3) ALTIN ​​KURAL! - Bu php dosyasının (ve includediğer dosyalarınız varsa ) BOM kodlaması olmadan UTF8 olup olmadığını kontrol edin (sadece UTF-8 değil ). Birçok durumda bu sorun (çünkü UTF8 kodlanmış dosya php dosyasının başlangıcında, metin düzenleyicinizin göstermediği özel bir karaktere sahiptir) !!!!!!!!!!!

4) sonra header(...);kullanmanız gerekirexit;

5) her zaman 301 veya 302 referansını kullanın:

header("location: http://example.com",  true,  301 );  exit;

6) Hata raporlamayı açın ve hatayı bulun. Hatanıza, çalışmayan bir işlev neden olmuş olabilir. Hata raporlamayı açtığınızda, her zaman önce en üstteki hatayı düzeltmeniz gerekir. Örneğin, "Uyarı: date_default_timezone_get (): Sistemin saat dilimi ayarlarına güvenmek güvenli olmayabilir." - daha sonra aşağı doğru "başlıklar gönderilmedi" hatası görebilirsiniz. En üstteki (1.) hatayı düzelttikten sonra sayfanızı yeniden yükleyin. Hala hatalarınız varsa, en üstteki hatayı tekrar düzeltin.

7) Yukarıdakilerin hiçbiri yardımcı olmazsa, JAVSCRIPT yönlendirmesini kullanın (ancak, kesinlikle önerilmez yöntemi), özel durumlarda son şans olabilir ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

Neden açıkça ayarlıyor 301ya 302önemli?
Jānis Elmeris

26

Basit bir ipucu: Betiğinizdeki ilk <?phpetiketten hemen önce basit bir alan (veya görünmez özel karakter) buna neden olabilir! Özellikle bir takımda çalışırken ve birisi "zayıf" bir IDE kullanıyorsa veya garip metin editörleri olan dosyalara bulaşmışsa.

Bunları gördüm;)


22

Başka bir kötü uygulama, henüz belirtilmeyen bu sorunu tetikleyebilir.

Bu kod snippet'ine bakın:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Her şey yolunda değil mi?

Ya "a_important_file.php" bu ise:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Bu işe yaramayacak mı? Çünkü zaten yeni bir çizgi oluşuyor.

Şimdi, bu yaygın bir senaryo olmasa da, denetleyicinize bir şeyleri teslim etmeden önce bir sürü dosya yükleyen bir MVC çerçevesi kullanıyorsanız ne olur? Bu nadir bir senaryo değildir. Buna hazır olun.

Gönderen PSR-2 2.2:


  • Tüm PHP dosyaları KULLANMALIDIR Unix LF (linefeed) line ending.
  • Tüm PHP dosyaları bir single blank line.
  • Closing?> Etiketi aşağıdakileri omittediçeren dosyalardan OLMALIDIRonly php

İnanın bana, bu standartlara uymak hayatınızdan çok fazla zaman kazandırabilir :)


2
Çeşitli standartlara göre (örneğin Zend), kapanış ?>etiketini hiçbir şekilde herhangi bir dosyaya yerleştirmemelisiniz
Daniel W.

Herhangi bir kombinasyon (kapanış etiketleri, boşluklar ekleme, enter tuşuna basma vb.) Bu sorunun çoğunlukla Linux ortamlarında olduğu anlaşılıyor.
Junior Mayhé

@JuniorM Tekrar üretilebilir olmalıdır. Denediğiniz kodu bir öz ya da benzer bir şeyle paylaşabilir misiniz?
MD. Sahib Bin Mahboob

En son Wamp yüklü olan Windows 7 kullanıyorum. Bu hatanın satır sonu için gizli karakterlerle ilgili olduğunu düşünüyorum. Wordpress'im shortcodes.php soruna neden oldu. Bu dosyaya basit bir işlev ekledim ve bu "başlıklar gönderildi" hatasını başlatmaya başladı. Shortcodes.php'yi wordpress ile karşılaştırdım ve CR LF(tipik Windows satır sonu) dışında ok . Onun LFyerine (Linux satır sonu) olan Wordpress deposundan orijinal dosyayı indirerek çözdüm CR LFve ayrıca fonksiyonumu theme'nın function.php dosyasına taşıdım. Göre: bit.ly/1Gh6mzN
Junior Mayhé

@ Şahib, hala bu cevapta belirtilenleri tekrarlayamayacağımı fark ettim. Cevap Linux ortamı için tamamen iyi. ?> <?phpTek bir boş satırın kaldırılması ve eklenmesi, eklenen ve atlanan kapanış etiketinin arasındaki boşluğu test ettim ?>. Windows + Wamp'ta tüm bu kombinasyonlar iyi çalışır. Wierd ...
Junior Mayhé

15

Bazen dev işlemi hem WIN iş istasyonlarına hem de LINUX sistemlerine (hosting) sahip olduğunda ve kodda ilgili satırdan önce herhangi bir çıktı görmüyorsanız, dosyanın biçimlendirilmesi ve Unix LF (satır besleme) satır sonunun olmaması olabilir. .

Bunu hızlı bir şekilde düzeltmek için genellikle yaptığımız, dosyayı yeniden adlandırmak ve LINUX sisteminde yeniden adlandırılmış dosya yerine yeni bir dosya oluşturmak ve içeriği buna kopyalamaktır. Birçok kez bu sorunu çözmek WIN içinde oluşturulan bazı dosyaları bir kez barındırma taşındı bu soruna neden olur.

Bu düzeltme, FTP ile yönettiğimiz siteler için kolay bir düzeltmedir ve bazen yeni ekip üyelerimizi bir süre kurtarabilir.


2

Genellikle bu hata, yankılama veya yazdırma işleminden sonra başlık gönderdiğimizde ortaya çıkar. Bu hata belirli bir sayfada ortaya çıkarsa, aramadan önce sayfanın herhangi bir şeyi yankılamadığından emin olun start_session().

Öngörülemeyen Hata Örneği:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Bir örnek daha:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Sonuç: Aramadan önce herhangi bir karakter çıkarmayın session_start()veya header()boşluk veya yeni satır bile kullanmayın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.