2011-02-02 4 views
12

Если я использую @ в моем коде, это повлияет на производительность?Должен ли я использовать @ в своем PHP-коде?

+0

Я никогда не сталкивался с ситуацией, когда мне абсолютно нужно было ее использовать. У вас есть? – Mchl

+0

Возможный дубликат [Ссылка - что означает этот символ в PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) - все вопросы, касающиеся оператор подавления ошибок, связанный в ссылке, скажет вам, что вы не должны его использовать. В комментариях на странице руководства есть некоторые комментарии, касающиеся производительности. – Gordon

ответ

21

Эта статья полезна для ответа на ваш вопрос: http://anvilstudios.co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/

В частности, раздел «@ имеет свои преимущества»:

Теперь один действительно следует использовать оператор @ очень экономно, обработки ошибки вместо подавляя их. Но есть небольшое количество ситуаций , в которых я могу думать о том, где, возможно, потребуется подавить некоторые ошибки PHP . Позвольте мне предложить два примера:

  • Вы могли бы использовать некоторые крупные внешние библиотеки, которая сделала использование @, и поэтому необходимо, чтобы иметь возможность игнорировать эти ошибки как автор библиотеки, предназначенной, в противном случае ваш программа собирается отключить , где это не нужно. Вы можете отредактировать библиотеку, но это может быть займет много времени, и ваши изменения снова должны быть применены каждый раз, когда автор выпускает обновление в библиотеку.

  • Другой пример может быть, когда функция fopen используется для открытия внешнего URL-адреса, а URL-адрес не может быть открыт для одной из многих возможных причин . Функция возвращает false, чтобы указать сбой, который является отличным, но, чтобы процитировать руководство по PHP, «ошибка уровня E_WARNING равна сгенерированной« тоже не очень большой », это должно действительно привести к тому, что вместо этого будет выбрано исключение , поскольку это нерегулярная ситуация, но следует ожидать от . В этом случае вы хотели бы игнорировать ошибку и продолжить выполнение программы, явно , отвечая соответствующим образом - именно за исключениями! Существует, однако, способ преобразования ошибки в исключение, и поэтому избегает использования @ в этой ситуации. В вашем настраиваемом обработчике ошибок (который находится там, где мы находимся в этом сообщении), введите ErrorException - это потребует, чтобы явным образом поймал и обработал в коде, который раньше использовался @, что является лучшим способом Обработка ошибок.

+3

Из двух описанных там ситуаций первая имеет некоторые достоинства. Вы застряли в плохо написанной библиотеке, вам нужно иметь дело с ней. Второй, однако, может быть решен более изящным образом, используя специальный обработчик ошибок, чтобы выбросить 'ErrorException', а затем обработать их. http://www.php.net/manual/en/class.errorexception.php – Mchl

+1

Я второй ответ, тем более, что написал [Как игнорировать ошибки @ в пользовательском обработчике ошибок PHP] (http: // anvilstudios. article /. =) @ Замечание Mchl действительно, и это именно то, что мы делаем в нашей пользовательской структуре. Я обновил статью, чтобы отразить это, спасибо. – Abraham

1

Да, это уменьшит производительность при охоте на ошибки. Так что нет, вы не должны использовать его, если не уверены, что не станете больше беспокоиться об этом.

2

Да, это влияет на производительность вашего скрипта значительным образом.

Читать статью PHP Error Suppression Performance.

+0

Я не читал этого в статье. Ошибки - проблема производительности. – grantwparks

2

Сам по себе @ не является причиной проблем с производительностью (что, кстати, в большинстве случаев незаметно для профилирующих графиков). Отсутствующие индексы массивов и неопределенные переменные вызывают уведомления/предупреждения, и здесь наблюдается замедление. Сам оператор подавления ошибок не виноват.

Использование @$var вместо fugly isset($var)?$var:NULL имеет то преимущество, что все еще можно записывать отладочные уведомления, где isset полностью скрывает их.

+0

На самом деле, какой оператор suppresion ошибки делает это намного больше. Он хранит текущий уровень отчетности об ошибках, переключает отчет об ошибках на 0, выполняет оператор, стоящий перед и, наконец, восстанавливает предыдущий уровень отчетности об ошибках. Довольно много, я бы сказал. – Mchl

+3

@Mchl: Довольно много, все еще весьма незначительно. Это тема микро оптимизации. Eschewing @ так же чувствителен, как использование одинарных кавычек (если в вашем приложении, конечно, нет миллиарда строк или источников ошибок). – mario

+0

Суть заключается не в том, чтобы эти источники ошибок были в первую очередь, так что вам не нужно их подавлять;) – Mchl

5

Вы не должны использовать оператор подавления ошибок.

В производственной среде no PHP-сообщения об ошибках должны отображаться пользователю. Они не полезны, потому что они полны технических подробностей и не говорят пользователю, как действовать. Вместо этого запишите ошибку и покажите свое собственное сообщение об ошибке.

В среде разработки все Сообщения об ошибках PHP должны отображаться пользователю. Они являются жизненно важным ключом к проблеме проблемы и должны быть замечены на ранней стадии.

Используйте Errors and Logging Configuration Options, чтобы различать тезисы двух. Производительность не является полезным критерием для принятия решения о том, следует ли использовать @ или нет.

4

«Глупая консистенция - это хобгоблин маленьких умов». :) Чтобы сказать, что «никогда не использовать его», это немного любительская позиция, ИМО. Я предпочитаю $ var = @ $ _ POST ['key'] $ var = isset ($ _ POST ['key'])? $ _POST ['key']: null;

Смежные вопросы