В целях ajax я пытаюсь визуализировать строку из контроллера Cakephp (2.8.5) без какого-либо представления. Для этого я обычно пишу код, а затем использую $this->render = false
перед return
и работает нормально.
Я загрузил веб-сайт на OVH (французского интернет-провайдера), и что-то не так, отображаемая строка не работает должным образом. Он не отображается должным образом, пока не достигнет определенного размера.
Чтобы продемонстрировать проблему, я подготовил динамическую страницу онлайн (вы можете изменить 15 на любое число, ниже 15 генерирует проблему):
http://darxnake.fr/nadau3/pages/test/15
код очень прост:
PagesController.php:
class PagesController extends AppController {
public function test($nb=1) {
$str = "";
$char = "o";
$upper = true;
for ($i=0; $i < $nb; $i++) {
$str .= $upper ? strtoupper($char) : strtolower($char);
$upper = $upper ? false : true;
}
$this->autoRender = false;
return $str;
}
}
Смена последнего return
по die
отображает полную строку, но мне не нравится die
в контроллерах не чувствуется, что так и должно быть.
Этот код работает в автономном режиме на моем компьютере (Windows / uWamp), и я не могу понять, что не так. Я подозреваю что-то из OVH, но не могу быть уверен и не знаю, где искать. Вот phpinfo для этого хоста: http://darxnake.fr/nadau3/pages/info/
Не могли бы вы помочь мне узнать, что происходит? Спасибо.
Редактировать :
Наконец-то нашли причину проблемы. Cakephp2 отправляет заголовок HTTP с именем Content-Length
с каждым ответом. В то время как переданный размер является точным (14 переданных в заголовок для 14 символов, указанных в коде), обработанная строка удаляется. Если я отключу этот заголовок в CakePhp lib (/lib/Cake/Network/CakeResponse.php), строка рендеринга будет исправлена.
На моем локальном компьютере этот заголовок не отправляется (не знаю почему) и на OVH с тем же тестом, но с CakePhp 3 этот заголовок также не отправляется.
Так что я отключил его, код lib и проблема исчезли, хотя, если кто-то может объяснить, что происходит, и если я сделал что-то не так, отключив его. Я не очень знаком с заголовками HTTP …
Я не знаю точно, почему, но после использования;
$this->autoRender = false;
Вы не можете получить реальный результат точно .. Я тоже сталкивался с этой ситуацией.
В моем случае я убрал autoRender и работал нормально.
Попробуйте удалить эту строку, если не обязательно.
Других решений пока нет …