Magento Debug HEADERS GIÀ INVIATO errore

Sto ricevendo il seguente errore nel mio file system.log:

2011-01-12T14:16:52+00:00 DEBUG (7): HEADERS ALREADY SENT: [0] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Response\Http.php:44 [1] C:\xampp\htdocs\www.mysite.com\lib\Zend\Controller\Response\Abstract.php:727 [2] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Response\Http.php:75 [3] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Varien\Front.php:188 [4] C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Model\App.php:304 [5] C:\xampp\htdocs\www.mysite.com\app\Mage.php:596 [6] C:\xampp\htdocs\www.mysite.com\index.php:81 

So cosa significa “le intestazioni già inviate” significa, ma non ho idea di quale file stia causando questo e la traccia in realtà non mi fornisce alcuna informazione.

C’è un modo per scoprire il file incriminato?

Grazie!

Ecco il modo difficile.

Trova la posizione nel file che sta eseguendo la registrazione

 C:\xampp\htdocs\www.mysite.com\app\code\core\Mage\Core\Controller\Response\Http.php Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true)); 

Aggiungi registrazione per ottenere una copia di ogni file incluso / richiesto finora

 Mage::log(print_r(get_included_files(),true)); 

È ansible aggiungere questa registrazione direttamente al file principale se si ricorda di ripristinare il file nella sua condizione pre-incasinata, oppure è ansible aggiungere una copia temporanea a

 app/code/local/Mage/Core/Controller/Response/Http.php 

finchè ti ricordi di rimuoverlo quando hai finito (o semplicemente usa git).

Controlla questo elenco di file per i soliti sospetti di spazio bianco, quindi controlla se sono presenti funzioni che potrebbero produrre output ( echo , print , file di readfile , probabilmente ce ne sono altri)

Ecco un modo più semplice.

Guarda il metodo canSendHeaders nel file

 lib/Zend/Controller/Response/Abstract.php 

Aggiungi un po ‘di registrazione a

 public function canSendHeaders($throw = false) { $ok = headers_sent($file, $line); // to get PHP's report on which file is sending a header. if ($ok !== false){ Mage::log('File: ' . $file, null, 'exception.log', true); Mage::log('Line: ' . $line, null, 'exception.log', true); } if ($ok && $throw && $this->headersSentThrowsException) { #require_once 'Zend/Controller/Response/Exception.php'; throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); } return !$ok; } 

Questo errore viene generato da Mage_Core_Controller_Response_Http -> sendHeaders (). Questa funzione chiama la funzione super-class che controlla effettivamente se gli header sono già stati inviati, Zend_Controller_Response_Abstract -> canSendHeaders ().

La class Zend_Controller_Response_Abstract gestisce, tra le altre cose, l’invio di intestazioni di risposta e il tracciamento dell’ultima volta in cui sono state inviate le intestazioni (e da quale file e riga). Ecco come appare questa funzione e dove faremo una modifica intorno alla riga 316 in lib \ Zend \ Controller \ Response \ Abstract.php:

 public function canSendHeaders($throw = false) { $ok = headers_sent($file, $line); if ($ok && $throw && $this->headersSentThrowsException) { #require_once 'Zend/Controller/Response/Exception.php'; throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); } return !$ok; } 

A:

 public function canSendHeaders($throw = false) { $ok = headers_sent($file, $line); if ($ok) { Mage::log('Cannot send headers; headers already sent in ' . $file . ', line ' . $line, null, 'headers.log'); } return !$ok; #if ($ok && $throw && $this->headersSentThrowsException) { # #require_once 'Zend/Controller/Response/Exception.php'; # throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); #} #return !$ok; } 

Questo registrerà l’errore in /var/log/header.log.

Il posto più comune in cui ci si imbatte in Magento è quando si invia il contenuto direttamente dal controller.

Invece di fare

 echo $string; 

all’interno di un controller, fai questo:

 $this->getResponse()->setBody($string); 

Lo vedo anche io. Penso che abbia qualcosa a che fare con le immagini in WYSIWYG. Prova a guardare i registri mentre attraversi l’amministratore (specialmente le pagine CMS) e potresti vederlo accadere. È innocuo.

Forse sarà utile per qualcuno: ricevo un messaggio simile quando accendo il WYSIWYG di Magento durante la modifica delle pagine in CMS -> Pagine (ho WYSIWYG disabilitato per impostazione predefinita, quindi devo fare clic su “Mostra / nascondi editor” per abilitare esso). Se la pagina contiene tag CMS come ad esempio:

 {{store url='my-other-page'}} 

questo messaggio appare nel file system.log dopo aver fatto clic su “Mostra / nascondi editor”:

 2013-04-06T11:10:38+00:00 DEBUG (7): HEADERS ALREADY SENT: 
[0] ...\app\code\core\Mage\Core\Controller\Response\Http.php:52 [1] ...\lib\Zend\Controller\Response\Abstract.php:766 [2] ...\app\code\core\Mage\Core\Controller\Response\Http.php:83 [3] ...\app\code\core\Mage\Core\Controller\Varien\Front.php:188 [4] ...\app\code\core\Mage\Core\Model\App.php:354 [5] ...\app\Mage.php:683 [6] ...\index.php:87 

Ho ricevuto questo errore quando ho creato la mia richiesta Ajax in un modo “hacky”, facendo eco ai contenuti direttamente anziché inviarli attraverso il layout. Una volta che li ho inviati attraverso il layout, gli errori sono scomparsi. Vedi la mia domanda qui:

Il modo migliore per generare dati Ajax da un’Amministrazione amministratore Magento

puntelli a @anan per la sua risposta alla mia domanda.

Penso che questo potrebbe essere OnePageCheckout problema di estensione OnePageCheckout . Ho lo stesso errore in Magento e sembra che questo errore non sia così popolare. Inoltre ho installato OnePageCheckout . Ma, naturalmente, questa potrebbe essere solo una coincidenza.

Stesso problema durante la chiamata Ajax

Stavo ricevendo il log quando stavo effettuando una chiamata Ajax e chiamando il modello direttamente dal controller.

Quando ho cambiato il codice e creato il blocco nel file xml del layout. l’errore del log è stato corretto.

Ho lo stesso problema durante l’installazione di Magento.

Nel mio caso l’abilitazione di output_buffering in PHP ha risolto il problema.

In xampp con PHP 5.6 output_buffering è abilitato di default.

In xampp con PHP 5.3 output_buffering è disabilitato per impostazione predefinita.

Nel nostro caso si trattava di un bug in Magento CE 1.9.2.4, risolto in Magento CE 1.9.3, avvenuto quando si utilizzava WYSIWYG con le immagini. Abbiamo appena creato una piccola estensione che sovrascrive la funzione directiveAction () in \ app \ code \ core \ Mage \ Adminhtml \ controller \ Cms \ WysiwygController.php. Per maggiori dettagli vedi (in tedesco) qui .