2011-02-02 12 views
12

Si uso @ en mi código, ¿afectará el rendimiento?¿Debo usar @ en mi código PHP?

+0

Nunca me he encontrado con una situación en la que absolutamente tendría que usarla. ¿Tienes? – Mchl

+0

posible duplicado de [Referencia - ¿Qué significa este símbolo en PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) - todas las preguntas sobre el operador de supresión de errores vinculado en la referencia le dirá que no debe usarlo. Los comentarios en la página del Manual tienen algunos comentarios sobre el rendimiento también. – Gordon

Respuesta

21

Este artículo es útil para responder a su pregunta: http://anvilstudios.co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/

Específicamente la sección "@ tiene sus usos":

Ahora uno realmente debe utilizar el operador @ con mucha moderación, la manipulación errores en lugar de suprimiéndolos. Pero hay un pequeño número de situaciones en las que puedo pensar donde podría ser necesario suprimir algunos errores de PHP . Permítanme ofrecer dos ejemplos:

  • Usted podría estar utilizando algún gran biblioteca externa que ha hecho uso de la @, y así tiene que ser capaz de ignorar esos errores como el autor de la biblioteca previsto, de lo contrario su programa va a tropezar donde no es necesario. Puede editar la biblioteca, pero puede tomar tomar mucho tiempo, y los cambios deberían aplicarse de nuevo cada vez que el autor publica una actualización en la biblioteca.

  • Otro ejemplo podría ser cuando la función fopen se usa para abrir una URL externa, y la URL no se puede abrir por una de las muchas posibles razones . La función devuelve false para indicar un error, que es genial, pero para citar el manual de PHP, "un error de nivel E_WARNING es generado" también, no tan bueno, realmente debería dar como resultado una excepción lanzada en su lugar, como esta es una situación irregular, pero se espera que sea . En este caso, uno quisiera poder ignorar el error y continuar con la ejecución del programa, explícitamente respondiendo de manera adecuada, ¡exactamente para qué sirven las excepciones! Hay, sin embargo, una forma de convertir el error a una excepción y así evitar el uso del @ en esta situación. En su controlador de error personalizado (que es donde nos encontramos en esta publicación), ejecute ErrorException - esto requiere que capture y maneje explícitamente antes en el código que estaba usando el @, que es una mejor forma de manejo de errores.

+3

De dos situaciones descritas allí, la primera tiene algún mérito. Estás atrapado en una biblioteca mal escrita, tienes que lidiar con eso. Sin embargo, el segundo puede resolverse de una manera más elegante utilizando un controlador de errores personalizado para lanzar 'ErrorException's, y luego manejarlos. http://www.php.net/manual/en/class.errorexception.php – Mchl

+1

Apoyo esta respuesta, especialmente porque escribí el [Cómo ignorar @ errores en un controlador de errores PHP personalizado] (http: // anvilstudios. co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/) artículo. =) @ El comentario de Mchl es válido, y es exactamente lo que hacemos en nuestro marco personalizado. He actualizado el artículo para reflejar esto, gracias. – Abraham

1

Sí, va a disminuir su rendimiento cuando la caza de insectos. Entonces no, no debes usarlo a menos que estés seguro de que no causarás más problemas de esa manera.

2

El @ en sí mismo no es la causa de los problemas de rendimiento (que, por cierto, son en su mayoría inadmisibles en los gráficos de perfiles). Las indices de matriz faltantes y las variables no definidas causan avisos/advertencias y es allí donde ocurre una desaceleración. El operador de supresión de errores no tiene la culpa.

El uso de @$var en lugar del fugly isset($var)?$var:NULL tiene la ventaja de poder seguir registrando notificaciones de depuración, donde isset las oculta por completo.

+0

En realidad, lo que hace el operador de supresión de errores es bastante más que eso. Almacena el nivel de informe de errores actual, cambia la notificación de errores a 0, ejecuta la instrucción que está delante y finalmente restaura el nivel anterior de informe de errores. Mucho diría. – Mchl

+3

@Mchl: Mucho, todavía bastante insignificante. Es un tema de micro optimización. Evitar @ es tan sensato como usar comillas simples (a menos que tengas mil millones de cadenas o fuentes de error en tu aplicación, por supuesto). – mario

+0

El punto es no tener estas fuentes de error en primer lugar, para que no tenga que suprimirlas;) – Mchl

5

No debe usar el operador de supresión de errores.

En un entorno de producción, no Los mensajes de error de PHP deben mostrarse al usuario. No son útiles porque están llenos de detalles técnicos y no le dicen al usuario cómo proceder. En su lugar, registre el error y muestre su propio mensaje de error.

En un entorno de desarrollo, todos Los mensajes de error de PHP deben mostrarse al usuario. Son una pista vital en cuanto a la causa del problema y se deben notar temprano.

Utilice Errors and Logging Configuration Options para distinguir entre las dos tesis. El rendimiento no es un criterio útil para decidir si se usa @ o no.

4

"Una consistencia tonta es el duende de las mentes pequeñas". :) Decir "nunca lo uso" es una postura un poco amateur, IMO. Prefiero $ var = @ $ _ POST ['clave'] a $ var = isset ($ _ POST ['clave'])? $ _POST ['clave']: nulo;

Cuestiones relacionadas