Здравствуйте. У меня сайт на NGINX. Получилось так, что страницы HTML выглядят нормально, если в каком-либо месте есть определенное количество букв. Если их меньше, то тогда код HTML не до конца загружается, т.е. страница не до конца грузится. С этим серверские админы справились кое как, хотя мне пришлось им долго доказывать, что это на сервере что-то не в порядке, а не в моих страницах. В итоге админы сказали, что мой код PHP генерирует много замечаний, при этом есть лимит на эти замечания, они как-то скорректировали это - сделали чтобы меньше замечаний попадало в отчет. Вроде так. Можете подсказать, какие замечания чаще всего встречаются в PHP. Может быть это: пробелы перед операторами не соблюдены или заглавные буквы, или еще что-то ... Я хочу код поправить, чтобы замечаний было меньше.
Нотисов и ворнингов не должно быть вообще. Разбирайся с каждым из них. В настройках PHP лимитов как таковых, на количество замечаний нет. Или кто-то из нас неправильно понял Админы могли включить буферизацию чтобы твои ошибки не ломали работу header(). Или могли изменить уровень вывода ошибок. В любом случае, это костыль, временная мера. Спрятать проблему ≠ решить её. --- Добавлено --- А без гадания, получить с хостинга лог с ошибками нельзя? Там всё должно быть расписано.
Ещё замечание: на публичном хостинге ошибки любого уровня не должны вылазить на страницу. Чтобы не давать потенциальному зловреду информацию для анализа и атаки. Но ты должен о них знать! По взрослому, ошибки должны перехватываться и записываться в логи, доступные только тебе. --- Добавлено --- Звучит как-то не очень! И nginx скорее всего тут не при чём. Можешь по-подробнее что происходит? Какие ошибки?
Мне так ответили: Удалось воспроизвести проблему. Причиной оказалась совокупность нескольких факторов: - логирование в php не было настроено, соответственно все ошибки передавались в nginx - ваш php-код генерирует большое количество замечаний и предупреждений - nginx имеет ограничение на длину строки ошибок в 2048 байт. Длина сообщений об ошибках превышали это значение. Полный механизм понять не удалось, в нем еще как-то задействован механизм keep-alive. Изменил в настройках php ( /opt/php74/.../php.ini ) директиву error_reporting на такую: error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED После этого вывод в лог значительно сократился и проблема не проявлялась.
Ну вот теперь когда логирование уже настроено, надо просить эти логи и с каждой ошибкой разбираться. Пробовать на локалке. Админ замаскировал проблему, понизив error_reporting. Но он не исправил код. Понимаешь, вываливание ошибок на страницу это уже вторичная проблема. Как покраснение носа при простуде. А есть первичные. Наверное неинициализированные переменные / отсутствующшие индексы массивов репортились. От этого логика программы может сбоить.
В текущем логе ошибок в основном (около 95%) одна ошибка - скорее всего это лишний - mysqli_close($asdfg); Получается, что я в некоторых местах поставил mysqli_close($asdfg); , а также еще и в конце всего кода программы был mysqli_close($asdfg); . Вот он на эту строку в конце кода и ругается. Я нижнюю оставил, а остальные убрал. Еще, нужно ли где-то тут предварительно инициализировать переменные: $a=(int)$_GET['a']; $b = $_SERVER['REMOTE_ADDR']; $bb1 = mysqli_connect($host, $us, $pass); $aaa=mysqli_query($bb1, "SELECT * FROM dd WHERE pp='123'"); $bbb=mysqli_fetch_assoc($aaa);
Если БЫ эти строки были единственными, то mysqli_connect не сработал бы из-за неинициированнвх переменных, а дальше как домино mysqli_query и fetch. --- Добавлено --- Когда логи есть полноценные, такие ситуации видно именно в развитии - ошибка, за ней следствие.
В строке $bb1 = mysqli_connect($host, $us, $pass); - тут вопрос про переменную $bb1 , а не то что в скобках. Что в скобках - эти переменные есть инициированные, просто я их не показал. А как на счет остальных - надо ли инициировать переменные? --- Добавлено --- После корректировок mysqli_close($asdfg; ) - файл error.log - почему-то вообще перестал заполняться ошибками или предупреждениями. Может быть это была основная ошибка?