Coger el error del analizador PHP cuando se usa Incluir -- php campo con try-catch camp Relacionados El problema

Catching PHP Parser error when using include


6
vote

problema

Español

Tengo un archivo llamado functions.php .

Este archivo consiste incluye a todos los otros archivos de función, por ejemplo:

  include_once("user_functions.php"); include_once("foo_functions.php");   

Me gustaría atrapar errores en los que, cuando atornille un código en uno de esos archivos, no le daría el error a todo el sistema.

Por ejemplo, si hay un error de analizador en foo_functions.php , simplemente no lo incluirá en functions.php .

es lo posible?

Original en ingles

I have a file called functions.php.

This file consists includes to all the other function files, for example:

include_once("user_functions.php"); include_once("foo_functions.php"); 

I would like to catch errors where when I screw a code in one of those files, It wouldn't give the error to the entire system.

For example, if there is a parser error in foo_functions.php it will just not include it in functions.php.

Is that possible?

     

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Los errores del analizador son errores fatales, por lo que no puede catch ellos. Ver esta pregunta y respuesta para más detalles .

¿Qué puede hacerlo si puede ejecutar exec()6 está llame php -l thefilename.php y compruebe el resultado. Consulte el manual para obtener información sobre cómo funciona esto . Hay algunos problemas aquí, sin embargo:

  • Esto es extremadamente peligroso , porque está pasando información a la línea de comandos. Usted absolutamente debe filtrar cualquier entrada de usuario con mucho cuidado, o le daría al usuario un acceso muy amplio a su sistema.
  • exec() a menudo está deshabilitado, como debería ser, debido a los riesgos de seguridad extremadamente altos de usarlo incorrectamente.
  • Realmente no hay buena razón para incluir un archivo que aún no ha validado para errores de sintaxis. Si esto es para los complementos o algo así, entonces entiendo su razonamiento. Sin embargo, si es un código que tiene control, debe validar antes de ponerlo en producción.
 

Parser errors are fatal errors, so you can't catch them. See this question and answer for more details.

What you can do if you can run exec() is call php -l thefilename.php and check the result. See the manual for information on how this works. There are a few problems here, however:

  • This is extremely dangerous, because you are passing information to the command line. You absolutely must filter any user input very carefully, or you would be giving the user very broad access to your system.
  • exec() is often disabled, as it should be, because of the extremely high security risks of using it incorrectly.
  • There's really no good reason to include a file that you haven't already validated for syntax errors. If this is for plugins or something, then I understand your reasoning. If it is code you have control over, however, you should validate before putting it into production.
 
 
 
 
12
 
vote

A partir de PHP 7, la mayoría de los errores de evalación / inclusión, como Patrsonror se pueden capturar:

  try {   include_once(__DIR__ . '/test.php'); } catch (Throwable $e) {   var_dump($e); }   
 

As of PHP 7, most eval/include errors, such as ParseError can be catched:

try {   include_once(__DIR__ . '/test.php'); } catch (\Throwable $e) {   var_dump($e); } 
 
 
     
     
2
 
vote

Este código puede verificar si existe un archivo o no, si el archivo existe de lo que inclúyalo.

  cd the/root/of/your/source/tree0  

y este le ayuda a obtener errores de sintaxis (solo PHP 7+)

  cd the/root/of/your/source/tree111  

Entonces, si usa PHP 7+, puede usar:

  cd the/root/of/your/source/tree2  
 

This code can check if file is exist or not, if file exist than include it.

<?      if(!is_file('user_functions.php')){         //There is no file user_functions.php . You may use file_put_contents('user_functions.php','<? //content ?>');     }else{         //ther is file user_functions.php, so include it.         include 'user_functions.php';      } ?> 

And this one help you get syntax errors (PHP 7+ only)

<?     try {         include('user_functions.php');     }catch (ParseError $e) {         echo 'Error: '.$e->getMessage();         //syntax error, unexpected end of file, expecting ',' or ';'     }   ?> 

so if you use PHP 7+ you may use:

<?      if(!is_file('user_functions.php')){         echo 'Error: file is not exist';     }else{         //check errors         try {             include('user_functions.php');         }catch (ParseError $e) {             echo 'Error: '.$e->getMessage();             //syntax error, unexpected end of file, expecting ',' or ';'         }     } ?> 
 
 
0
 
vote

¿Qué pasa si pones

  cd the/root/of/your/source/tree3  

al comienzo de foo_functions.php?

 

What if you put

error_reporting(E_ALL); ini_set("display_errors", 1); 

at the beginning of foo_functions.php ?

 
 
 
 
0
 
vote

cd the/root/of/your/source/tree4 y cd the/root/of/your/source/tree5 DEVUELLES cd the/root/of/your/source/tree6666666666666666666666666666666666666666666666712 Puede usar esto para verificar si los archivos cd the/root/of/your/source/tree7 D fueron exitosos.

  cd the/root/of/your/source/tree8  

Al cambiar el cd the/root/of/your/source/tree9 s para manejar su lógica de error, debe poder hacer lo que está preguntando.

 

include() and include_once() return false if they fail. You can use this to check if the included files were successful.

if (!include('user_functions.php'))    echo 'user functions failed to include'; if (!include('foo_functions.php'))    echo 'foo_functions failed to include'; 

By changing the echos to handle your error logic, you should be able to do what you are asking.

 
 
 
 
0
 
vote

La solución que estoy usando se siente como una solución de ayuda de banda, pero le dará control de nuevo.

La idea es utilizar "EVAL ()" para verificar primero los errores. Además, ignore los errores con el @ al principio. Por supuesto, deberá tener cuidado con la eval, así que nunca permita que los usuarios le alimenten nada.

  pip install -e .0  

Tenga en cuenta que creo " pip install -e .1 + pip install -e .2 " = " pip install -e .3 ", o muy cerca de ella, por lo que puede ser capaz para simplemente omitir la parte requerida.

 

The solution that I am using feels like a band-aid solution, but it will give you control back.

The idea is to use "eval()" to first check for errors. Also, ignore errors with the @ in the beginning. Of course you will need to be careful with eval, so don't ever let users feed anything to it.

    // first "eval" the file to see if it contains errors     $txt = file_get_contents($template_filename);      // eval starts out in php-mode.  get out of it.     $txt = '?' . '>' . $txt;     ob_start();     $evalResult = @eval($txt);     ob_end_clean();      // if there are no errors     if($evalResult !== FALSE) {         require($template_filename);     } else {         error_log(print_r(error_get_last(), TRUE));     } 

Please note that I think "file_get_contents + eval" = "require", or very close to it, so you may be able to just skip the require-part.

 
 

Relacionados problema

6  C # Socketexception no se captura  ( C sharp socketexception doesnt get caught ) 
Tengo un sitio realmente extraño en mi código. Estoy desarrollando una aplicación C # Chat Client-Server. Cuando cierre el servidor, quiero que el cliente se ...

0  Añadiendo números en una cadena  ( Adding numbers in a string ) 
Tengo una cadena como una entrada para el código que estoy escribiendo y deja que un ejemplo de la cadena sea: "12 inches makes 1 foot" Mi objetiv...

2  C # captura de excepción de bool cuando se usa retorno  ( C sharp catch bool exception when using return ) 
Estoy usando el código a continuación y, ocasionalmente, Boolupdate no es verdadero o falso, y obtengo una excepción, no puedo rodearlo con un bloque de atrap...

30  Asegurar que las excepciones siempre sean atrapadas  ( Ensuring that exceptions are always caught ) 
Las excepciones en C ++ no deben ser atrapadas (sin errores de tiempo de compilación) por la función de llamada. Así que depende del juicio del desarrollador,...

1  Error de análisis: Error de sintaxis esperando captura (t_catch)  ( Parse error syntax error expecting catch t catch ) 
Soy nuevo en PHP y estoy tratando de aprender PDO. Estoy tratando de crear una página donde pueda publicar información (noticias y demás) a una base de datos ...

584  ¿Por qué atrapar y retirar una excepción en C #?  ( Why catch and rethrow an exception in c ) 
Estoy mirando el artículo C # - objeto de transferencia de datos en dtos serializables. El artículo incluye esta pieza de código: public static strin...

2  STACKOVERFLOW al tiempo que responde a la excepción debido a NTDLL! RCconsolidateFrame (x64)  ( Stackoverflow while rethrowing exception due to ntdllrcconsolidateframe x64 ) 
Estoy luchando con una excepción de desbordamiento de pila, que se produce al tiempo que responde una excepción diferente. La excepción de Rechhown se usa par...

-1  C #: int.Parse no funciona correctamente  ( C sharp int parse not working correctly ) 
Implementé el siguiente método en C #, para verificar si el número ingresado por el usuario es un número de 10 dígitos o no. Está funcionando bien para un núm...

-1  ¿Cómo voy a arreglar mi método de archivo de lectura?  ( How do i go about fixing my read file method ) 
LEER ARCHION: Este método tiene un solo parámetro, que es el nombre del archivo. El propósito de este método es leer los contenidos del archivo en una m...

185  ¿Debería intentarlo ... captura entrar o fuera de un bucle?  ( Should try catch go inside or outside a loop ) 
Tengo un bucle que parece algo así: for (int i = 0; i < max; i++) { String myString = ...; float myNum = Float.parseFloat(myString); myFloats[i...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos