2012-08-14 17 views
8

Bueno, me encontré con un poco de un pepinillo aquí. Necesito verificar si PHP tiene errores de sintaxis. Me di cuenta de este bit que tiene que ejecutar desde la línea de comandos:¿Buscar errores de sintaxis de PHP?

php -l somefile.php

Sin embargo, hay una manera de ejecutar esto desde dentro de un archivo PHP en sí? He estado buscando y creo que puedo usar la función parse_str de alguna manera para lograr esto al ingresarlo en $ _GET, pero no puedo entender cómo funciona esto.

Alguien más me dijo que use la función token_get_all() php para determinar esto.

¿Pero no puedo entender cómo hacerlo con cualquier enfoque? ¿Puede alguien aquí darme un código de muestra para comenzar tal vez? No creo que usar eval() sea el camino a seguir, aunque tenía un eval($code) funcionando, pero no creo que deba ejecutar el script si hay errores de sintaxis PHP.

¡Cualquier ayuda sobre esto es muy apreciada, como siempre!

+0

¿Por qué no generar un subproceso 'php -l'? –

+0

@arxanas - ¿Cómo se puede hacer esto? Posible respuesta...? –

+0

@SolomonClosson, creo que es el comentario terso se refiere a http://php.net/manual/en/function.exec.php – Pacerier

Respuesta

1

php_check_syntax deberían hacer el truco. Si está ejecutando PHP> = 5.05, vea el primer comentario en la sección de comentarios para la implementación.

+3

Esta función se eliminó de PHP ... [link] (http: //www.php .net/manual/es/function.php-check-syntax.php) –

+0

Buena captura @SolomonClosson. OP, afortunadamente en los comentarios hay una implementación que puedes usar.No lo pegaré aquí porque es muy grande, pero es el comentario principal. – wanovak

+0

Esta es una función de PHP4 y se ha eliminado en PHP 5.0.x. Además, básicamente era solo un alias para 'eval()' - simplemente ejecutó el código proporcionado para detectar errores de análisis. – mario

5

Usted podría simplemente hacer shell_exec() así:

$output = shell_exec('php -l /path/to/filename.php'); 

Esto le da la salida de la operación de línea de comandos en la cadena $output.

+0

Esto me da el error '$ output is undefined'. –

+0

Bien, hemos corregido el error de salida no definido, sin embargo, ahora devuelve una cadena vacía independientemente de si hay o no errores de sintaxis de PHP. –

0

lo haría así:

$php_file = 'The path to your file'; 
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') { 
    // Correct syntax 
} else { 
    // Error 
} 
0

Puede utilizar exec para comprobar si hay errores de sintaxis.

$tempFile = path/of/file 
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;` 

Desafortunadamente, esto no le dará el número de línea o decirle nada sobre el error. Para eso, deberá instalar el analizador estático en su servidor Is there a static code analyzer [like Lint] for PHP files? o escribir su propio analizador.

NB. token_get_all() no determinará nada por sí mismo, pero es una función útil para hacer un analizador.

2

Es más seguro para comprobar el estado de retorno de php -l

$fileName = '/path/to/file.php'; 
exec("php -l {$fileName}", $output, $return); 

if ($return === 0) { 
    // Correct syntax 
} else { 
    // Syntax errors 
} 

Ver this fiddle a verlo en acción

1

¿Por qué usar la cáscara en absoluto?

function syntax_is_valid($code) 
{ 
    try 
    { 
     @eval($code); 
    } 
    catch (ParseError $e) 
    { 
     return false; 
    } 

    return true;  
} 

Como alternativa, use $e->getMessage() para obtener más información.

+0

¿Cómo se puede evitar que todos los efectos secundarios se ejecuten (evaling) el código? Como imprimir, conectarse a la base de datos, escribir archivos, etc. –