Si uso @
en mi código, ¿afectará el rendimiento?¿Debo usar @ en mi código PHP?
Respuesta
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 devuelvefalse
para indicar un error, que es genial, pero para citar el manual de PHP, "un error de nivelE_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.
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
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
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.
Sí, afecta el rendimiento de su script de una manera (significativa).
Lee el artículo PHP Error Suppression Performance.
No lo leí en absoluto en el artículo. Los errores son el problema de rendimiento. – grantwparks
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.
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
@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
El punto es no tener estas fuentes de error en primer lugar, para que no tenga que suprimirlas;) – Mchl
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.
"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;
- 1. ¿Debo usar identificadores de bloque ("end;") en mi código?
- 2. ¿Debo usar inyección de dependencia en mi proyecto php?
- 3. ¿Debo usar unset en php __destruct()?
- 4. ¿Qué código de operación de código PHP debo usar para mejorar el rendimiento?
- 5. ¿Debo siempre envolver mi código en intentar ... atrapar bloques?
- 6. ¿Cómo debo mover mi código de dev a producción?
- 7. Función en PHP obsoleta, ¿qué debo usar ahora?
- 8. ¿debo usar la función php vacía()
- 9. ¿Cuándo debo usar print en lugar de echo en PHP?
- 10. ¿Cuándo/debo usar __construct(), __get(), __set() y __call() en PHP?
- 11. ¿Debo usar UUID para recursos en mi API pública?
- 12. ¿Debo usar Eclipse 32bits o 64bits en mi nueva máquina?
- 13. ¿Debo usar dos cláusulas "where" o "&&" en mi consulta LINQ?
- 14. ¿Debo usar android: process = ": remote" en mi receptor?
- 15. ¿Debo usar "get" -prefix en el nombre de mi método?
- 16. ¿Debo usar Hypens, Underscore o camelCase en matrices php?
- 17. ¿Qué debo usar para la autenticación de usuario en PHP?
- 18. ¿Cómo debo crear mi GUID?
- 19. ¿Qué patrón (s) arquitectónico (s) debo usar para mi RIA?
- 20. ¿Puedo cambiar default_socket_timeout desde mi código php?
- 21. ¿Mi código PHP está orientado a objetos?
- 22. ¿Debo usar PHP/MySQL puro para desarrollar aplicaciones web?
- 23. ¿Debo optimizar mi código python como C++? ¿Importa?
- 24. ¿Debo abrir mi código fuente si uso OpenJDK como JVM?
- 25. ¿Cómo debo modelar mi código para maximizar la reutilización del código en esta situación específica?
- 26. ¿Qué tecnología debo usar para escribir mi juego?
- 27. ¿Debo usar Ruby 1.9.2 con mi nueva aplicación web?
- 28. ¿Debo usar Google Web Toolkit para mi nueva aplicación web?
- 29. ¿Debo usar getHours() o getUTCHours para mi Javascript?
- 30. ¿Debo usar jQuery.each()?
Nunca me he encontrado con una situación en la que absolutamente tendría que usarla. ¿Tienes? – Mchl
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