2012-08-14 16 views
8

Cóż, natknąłem się tutaj na odrobinę pikle. Muszę sprawdzić niektóre PHP pod kątem błędów składniowych. I zauważyłem, że ten kawałek, który trzeba uruchomić z linii poleceń:Sprawdź błędy składni PHP?

php -l somefile.php

Jednak, czy istnieje sposób, aby uruchomić to od wewnątrz samego pliku PHP? Szukałem i myślę, że mogę w jakiś sposób użyć funkcji parse_str, wprowadzając ją do $ _GET, ale nie mogę zrozumieć, jak to działa.

Ktoś inny powiedział mi, żebym użył funkcji php w celu ustalenia tego.

Ale nie mogę wymyślić, jak to zrobić z dowolnym podejściem? Czy ktoś może mi podać przykładowy kod, aby zacząć? Nie sądzę, żebym użył eval(), chociaż miałem eval($code) działa, ale nie myśl, że powinienem uruchomić skrypt, jeśli są błędy składni PHP.

Każda pomoc w tej sprawie jest bardzo doceniana, jak zawsze!

+0

Dlaczego nie odradzać podprocesu 'php -l'? –

+0

@arxanas - Jak to zrobić? Możliwa odpowiedź...? –

+0

@SolomonClosson, myślę, że jest lakoniczny komentarz odnosi się do http://php.net/manual/en/function.exec.php – Pacerier

Odpowiedz

1

php_check_syntax powinien załatwić sprawę. Jeśli używasz PHP> = 5.05, zobacz pierwszy komentarz w sekcji komentarzy do implementacji.

+3

Ta funkcja została usunięta z PHP ... [link] (http: //www.php .net/manual/en/function.php-check-syntax.php) –

+0

Dobra przynęta @SolomonClosson. OP, na szczęście w komentarzach jest implementacja, której można użyć.Nie wkleję go tutaj, ponieważ jest bardzo duży, ale jest to najwyższy komentarz. – wanovak

+0

To jest funkcja PHP4 i została usunięta w PHP 5.0.x. Co więcej, był to po prostu alias do 'eval()' - po prostu uruchomił dostarczony kod, aby wykryć błędy analizy. – mario

5

Można po prostu zrobić shell_exec() takiego:

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

Daje to wyjścia operacji wiersza poleceń w ciągu $output.

+0

Daje mi to błąd '$ output is undefined'. –

+0

OK, naprawiono niezdefiniowany błąd wyjściowy, jednak teraz zwraca on pusty ciąg, niezależnie od tego, czy występują błędy składni PHP, czy nie. –

0

zrobiłbym to tak:

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

Można użyć exec aby sprawdzić błędy składniowe.

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

Niestety, nie poda numeru linii ani nie powie nic o błędzie. W tym celu należy zainstalować analizator statyczny na serwerze Is there a static code analyzer [like Lint] for PHP files? lub napisać własny analizator składni.

NB. token_get_all() nie określi niczego samodzielnie, ale jest użyteczną funkcją do tworzenia parsera.

2

Bezpieczniej jest, aby sprawdzić stan powrotny php -l

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

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

Zobacz this fiddle aby zobaczyć go w akcji

1

Dlaczego używać powłoki w ogóle?

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

    return true;  
} 

Można również użyć numeru $e->getMessage(), aby uzyskać więcej informacji.

+0

W jaki sposób zapobiec działaniu wszystkich niepożądanych (ewaluacji) kodu? Takich jak drukowanie, łączenie z bazą danych, pisanie plików itp. –

Powiązane problemy