Проблема CakePHP "Не удается изменить информацию заголовка" НЕ является пробелом
Вот ошибка:
Warning (2): Cannot modify header information - headers already sent by (output started at /usr/share/php/cake/basics.php:111) [CORE/cake/libs/controller/controller.php, line 640]
$status = "Location: http://mydomain.com/blog/index"
header - [internal], line ??
Controller::header() - CORE/cake/libs/controller/controller.php, line 640
Controller::redirect() - CORE/cake/libs/controller/controller.php, line 621
PostsController::add() - APP/controllers/posts_controller.php, line 25
Object::dispatchMethod() - CORE/cake/libs/object.php, line 115
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 227
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 194
[main] - APP/webroot/index.php, line 88
Вот код для posts_controller.php
:
function add() {
if (!empty($this->data)) {
$this->Post->create();
if ($this->Post->save($this->data)) {
$this->Session->setFlash(__('Post saved!!', true));
$this->redirect(array('action'=>'index')); // line 25
} else {
}
}
$tags = $this->Post->Tag->find('list');
$statuses = $this->Post->Status->find('list');
$this->set(compact('tags', 'statuses'));
}
Вот строка 111: echo "\n<pre class=\"cake-debug\">\n";
Выход из debug_print_backtrace()
в basics.php
основной файл торта: http://pastebin.com/fBFrkYsP
Я просмотрел все файлы, которые я отредактировал (в отличие от тех, которые я только что выпек), и у меня нет пробелов за пределами php скобок (). Я использовал этот скрипт: Найти все файлы с пустым или WS в BOF или EOF.
Мой текстовый редактор настроен на UTF-8. В основном проблема исчезает, когда я закомментирую строку 25 (отмечена выше с комментарием). Но я должен быть в состоянии использовать перенаправление... Кто-нибудь может указать мне правильное направление?
РЕДАКТИРОВАТЬ: добавлена строка на 111 выше; РЕДАКТИРОВАТЬ 2: добавлен вывод debug_print_backtrace()
3 ответа
640
это начало foreach
зациклиться stripslashes_deep()
111
является debug()
Похоже, вы звоните debug()
функция где-то в вашем коде?
Также в вашем коде это:
заголовок -
и не =
Не только пробел, но и любой вывод, например echo
вы делаете, создает вывод, который будет препятствовать использованию header()
позже.
Вы можете обойти это, включив выходную буферизацию по умолчанию:
; output_buffering
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
output_buffering = 4096
Но только если (случайный) вывод меньше размера буфера.
Другой обходной путь - проверить, были ли отправлены заголовки, перед отправкой заголовков. Функция для проверки называется headers_sent()
, Так что для обходного пути в месте выполнения перенаправления (не знаю, применимо ли это для тортов в пекарне):
$url = 'http://absolut.http/uri';
if (!headers_sent()) {
header('Location: '.$url, 301);
} else {
printf('<meta http-equiv="Location" content="%s>"', $url);
}
printf('<h1><a href="%s">Moved.</a></h1>', $url);
exit;
Помните, что header() должна вызываться перед отправкой любого фактического вывода, либо обычными тегами HTML, пустыми строками в файле, либо из PHP.
В вашем случае вы используете echo
в строке 111, которая является частью "or from PHP" выше.
Поскольку эта строка, похоже, из основного пакета, я полагаю, вы вызываете функцию, которая каким-то образом вызывает этот вывод. Ты можешь использовать debug_print_backtrace()
возле линии 111, чтобы увидеть цепочку вызовов функций, ведущих к echo
вызов.