А надо ли проверять модули перед формированием страницы?

GoryachkoRA

Новичок
Привет,

Впервые пишу код PHP. Если пишу программы (win) - всегда делаю проверку на стадии загрузки и цепляю свой Err модуль, формирующий лог, чтобы если программа вылетает - хотя бы иметь понимание - "из-за чего?"

Написал функции для проверки соединения с сервером MySql, проверки наличия на нем базы данных и проверки наличия в базе таблицы. Успех или облом - всё пишется в лог. Хотел дописать функцию проверики прав на базу данных и еще кое-какие возможности и разрешения. Только потом, если все условия true - грузить главную страницу. В противном случае выдать error_page и {совершить какие-то действия, отправить лог админу, написать в хостинг}.

Друг практикует PHP. Сказал буквально "а, нафига?..Развернул базу, залил файлы - все работает. Ну, грохнется хостинг, свернут базу, вирус повредит - твои какие заботы? Пусть backup решит эти проблемы..."

Вопрос: я действительно занимаюсь х..? (Хочу мнение выслушать, стороннее.)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
инения с сервером MySql, проверки наличия на нем базы данных и проверки наличия в базе таблицы. Успех или облом - всё пишется в лог. Хотел дописать функцию проверики прав на базу данных
Проверка на права к базе прекрасно реализуется средствами самой базы.
То, что ты хочешь сделать, правильные и хорошие желания, но реализуются обычно через исключения, set_error_hanlder(), set_exception_handler(), средства самого php, и т.п. в этом духе.
С другой стороны, пхп достаточно узкоспециализирован, и ведение ошибок в лог, и.т.п. уже реализованы на уровне самого интерпретатора, и являются более предпочтительными способами.
Надо еще помнить о том, что ошибка — друг разработчка и враг продакшна, поэтому поведение в этих разных окружении у ошибок должно быть разным.

А в целом, такие знания приходят только с опытом, а опыт редко бывает бесполезным — поэтому делай, что считаешь нужным, и время само все расставит по местам.
 
  • Like
Реакции: AmdY

GoryachkoRA

Новичок
Хм..
реализуются обычно через исключения, set_error_hanlder(), set_exception_handler(), средства самого php, и т.п. в этом духе.
и
С другой стороны, пхп достаточно узкоспециализирован, и ведение ошибок в лог, и.т.п. уже реализованы на уровне самого интерпретатора, и являются более предпочтительными способами.
не одно и то же в широком смысле? Или речь идет об анализе логов, формирующихся интерпретатором (настройки E~ALL, E~NOTICE и т.д.)? Не попадаю ли я тем самым в зависимость от настройки сервера на хосте?

Но генеральную нить мысли, флоппик, я уловил. Спасибо.

P.S. про "...враг продакшна.." намёк в область безопасности?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Не попадаю ли я тем самым в зависимость от настройки сервера на хосте?
А кто сказал, что это плохо?
Поведение меняется соотвественно настройке — это правильно и ожидаемо. Если твой софт игнорирует/перекрывает стандартизированные настройки, чье поведение документированно и известно большинству — это плохо.

P.S. про "...враг продакшна.." намёк в область безопасности?
Да. Сообщение об ошибке содержат очень много важной информации для понимания ошибки. Тобой... или кем-то другим, кто ее видит.
 

GoryachkoRA

Новичок
Хорошо, я понял.
Спасибо, флоппик. Но, возможно, будут еще мнения. Это даст возможность взглянуть на ситуацию под разными углами.

В общем-то нет задачи писать такой код, который бы оказал еще и посильную помощь администрации хостинга (допустим, на основе обработаных ошибок выводил сообщения вроде 'извините, сайт не доступен, ибо сервер поражен вирусом и файлы базы данных были повреждены. Админ, проснись, к тебе пристроились').
Правда, и в этом случае есть свои плюсы.
Но не зря же есть понятие диспансеризации, как преждевременного выявления развивающихся недугов. И живут те, кто им не пренебрегает, в среднем дольше лет на 6-7. 9-10% в общем. От сознательной жизни еще больше :) Эдакий вопрос нравственности на границе объективности и абсурда.

Я согласен с мнением своего друга - не стоит усложнять. Согласен и с флоппиком, безопасности много не бывает.
 

alekciy

Новичок
Написал функции для проверки соединения с сервером MySql, проверки наличия на нем базы данных и проверки наличия в базе таблицы. Успех или облом - всё пишется в лог. Хотел дописать функцию проверики прав на базу данных и еще кое-какие возможности и разрешения. Только потом, если все условия true - грузить главную страницу.
А какой в это смысл? Поясняю, почему я считаю данную задачу в контексте PHP бессмысленной.

Делаем запрос. Допустим у нас прошли все проверки прошли нормально, сделали нужные выборку, нарисовали страницу. Предположим, что у нас нет одной из таблиц, проверка зафейлилась, выборку не сделали, страницу не нарисовали. Если бы не было этой проверки запрос все равно бы зафейлился, страница отрисована не была бы. Есть в приложение своя проверка структур таблиц, нет у нас свой проверки, не важно. Запрос который должен бы вернуть данные для страницы не проходит в любом случае и отрисовать страницу не получиться, только выдать заглушку о проблеме на сервере. Но при этом твоя проверка вносит в значимый запрос (в котором получаем данные для страницы) определенный оверхед, и этот оверхед будет на каждый целевой запрос. Так зачем этот оверхед, если в ходе значимого запроса данные для страницы получены не будут? Зачем привносить сущность, надобности в которой нет, тем паче в самом интерпретаторе есть чем отлавливать ошибки.

Я вижу только одну сферу применения данной проверке. Есть ряд задач где она будет полезна: при (пост|пре)инсталяции, при контроле целостности в случае возникновении ошибки для быстрого выявления проблемного места (т.е. в каждом запросе проверок нет, если если запрос зафейлился, то запускаем код выполняющий проверку и прочие нужные действия).

Особо отмечу, что речь в контексте веб приложения которое на каждый клиентский запрос проводит инициализацию.
 

GoryachkoRA

Новичок
baev, класс!
alekciy, спасибо. В общем-то из Вашего поста все "сущности" были весьма доходчивы. В конечном счёте, я тоже склонен думать, что любое "утяжеление" конструкции - еще один шанс огрести. Был еще такой аргумент (мой, естественно):
- Что если человек не разбирается в технологиях, но хочет использовать мой шаблон? Лог - хороший инструмент.

Хотя теперь мне понятен весь фатализм подобных помыслов. Вот он, далеко ходить не надо: я - человек, который пока не очень хорошо разбирается в этой технологии. if(!понимания основ)... {ну, а дальше все и так ясно};

Так что, да, флоппик, всё верно именно в той части, что не ради вреда, а пользы для и
"...опыт редко бывает бесполезным"
Спасибо.
 

GoryachkoRA

Новичок
Привет,
что-то я не могу адекватно оценить полезность try...catch. В ранних версиях PHP не было механизма исключений, тогда ошибки "ловились" простой проверкой возвращаемых булевых значений или же задавался альтернативный обработчик ошибки.

В чем преимущество механизма исключений? Быстродействие? Закос под объектно ориентированный язык программирования? Или вся прелесть в том, что этот механизм позволяет в случае ошибки подниматься по циклам и не делать лишнюю работу (кто-нибудь может привести реальный пример, когда без try...catch ну просто никуда...?) ?
 

AmdY

Пью пиво
Команда форума
GoryachkoRA
try...catch - это узаконенный goto. с точки зрения архитектуры - это гавно. потому что те кто должен довить экцепшины знает слишком много. но главное - это удобство.

в целом. смысл в try...catch не в том, чтобы поймать ошибку. а чтобы её попытаться исправить.
 

С.

Продвинутый новичок
Он должен знать как исправлять все от ошибок файловой системы или сетевого седенения до логики приложения или ввода данных от пользователя. Это ли не повод задуматься в адекватности подобного решения.
 

Вурдалак

Продвинутый новичок
Обработчик знает столько, сколько вы его заставляете знать. Exception'ы лишь направлены на устранение избыточности, которую создают постоянные проверки if'ами, и не более.
 

Absinthe

жожо
что-то я не могу адекватно оценить полезность try...catch.
Вот тебе прототип функции на джаве:

PHP:
    public EntryUser info(String token, String userName)
            throws MalformedResponseException, IOException, AccessDeniedException, IncorrectTargetException {
Как видишь, это не только классические ошибки(из субд, файлов или сокетов), но и исключительные ситуации в логике(AccessDeniedException, IncorrectTargetException).

Вкратце - экономят время, которое ты потратил бы на написание if (result != RESULT_OK) после вызова каждой функции. Или повясят качества, если ты такого не пишешь. И, в любом случае, повысят читаемость кода.
 
Сверху