Почему _POST иногда бывает пустым, когда текстовое поле публикуется в PHP

PHP 4.4 и PHP 5.2.3 под Apache 2.2.4 на ubuntu.

Я использую Moodle 1.5.3, и недавно у меня возникла проблема при обновлении курса. Переменная $ _POST пуста, но только если в текстовое поле формы было введено много текста. Если вводится только короткий текст, он работает нормально.

Я увеличил post_max_size с 8M до 200M и увеличил memory_limit до 256M, но это не помогло. Я удвоил LimitRequestFieldSize и LimitRequestLine до 16380 и установил LimitRequestBody на 0 без каких-либо улучшений.

Я искал ответ в Google, но не смог его найти.

Заголовки HTTP в firefox показывают размер содержимого 3816 с правильными данными, поэтому он просто не попадает в $ _POST.

Система работала нормально до нескольких недель назад. Единственное изменение было в / etc / hosts, чтобы исправить проблему HELO с почтовым сервером exim4.

Я могу воспроизвести проблему на машине разработки, на которой не запущен exim4, поэтому я думаю, что это просто совпадение.

Спасибо за вашу помощь.

Странно. Вы определили точный порог? Подробности могут быть полезны тем, кто хочет воспроизвести проблему.

Bobby Jack 23.10.2008 15:01

Вы сказали, что с небольшими объемами текста проблем нет: смогли ли вы найти приблизительный предел?

nickf 23.10.2008 15:13

Это может быть очевидно, но вы проверили, действительно ли форма использует POST, а не GET?

troelskn 23.10.2008 15:16

Нет, точный порог может быть разным, но 2702 символа, кажется, приводят к сбою, иногда меньше.

Puzzled 23.10.2008 15:16

Хммм ... Я определенно думаю, что вам нужно продолжить работу по выявлению проблемы. Тот факт, что это переменная, говорит о том, что вы не столкнулись с каким-то фиксированным пределом, и, вероятно, вы столкнулись с ошибкой, возможно, связанной с управлением памятью. Есть странные персонажи? Что-нибудь нестандартное в форме?

Bobby Jack 23.10.2008 15:28

Текст включает теги HTML. В форме есть несколько javascript и скрытых полей.

Puzzled 23.10.2008 15:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
6
2 931
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Похоже на проблему интеграции Apache или Apache / PHP. Если $ _POST пуст, это будет означать, что http-сервер не передает информацию POST в PHP. На вашем месте я бы исследовал конфигурацию Apache.

HTTP Live Headers (расширение firefox) правильно отображает содержимое POST.

Puzzled 23.10.2008 15:19

Это очевидно, но вы перезагружали /etc/init.d/apache2?

Также файл error_log должен показывать некоторую информацию о том, превысил ли размер сообщения установленный лимит. Постарайтесь повысить уровень детализации для устранения проблемы.

Что такое энктип формы? Возможно, это ограничивает количество данных, отправляемых через форму.

Вы также можете проверить входящие необработанные данные $ _POST с помощью:

file_get_contents('php://input');

Чтобы убедиться, что это действительно отправка данных. Получил эти предложения здесь.

Я не знаю достаточно, чтобы дать действительно полезный ответ, поэтому нижеследующее является более обоснованным предположением (по крайней мере, я на это надеюсь).

Во-первых, вы должны отладить весь запрос либо через access_log, либо, например, через Firebug. (В любом случае хорошо иметь Firebug.) Для меня ваша проблема звуки как перенаправление происходит между ними. Приведу пример:

Предположим, это ваша структура:

/form.php
/directory/index.php

Это ваша форма:

<form action = "/directory" method = "post">
...
</form>

Проблема в этом случае заключается в том, что, несмотря на то, что /directory является действительным URL-адресом, Apache перенаправит вас еще раз на /directory/, таким образом, вы потеряете свои полезные данные (что должно быть в $_POST).

Ответ принят как подходящий

Может быть, дело не в размере сообщения, а в длине строки до новой строки. Если они будут использовать вид Moodle WYSIWYG, HTML просто будет помещен в одну строку без разрывов. Если вы войдете в html и нажмете return примерно через каждые 1000 символов, это сработает?

Другие вопросы по теме