2012-08-28 6 views
8

Prima di tutto, sono confuso su come eseguire PHP nella riga di comando. Ho letto diversi articoli sul web e tutti dicono che hai bisogno di una CLI (Command Line Interface).Sintassi PHP Controllo con lint e come farlo su una stringa, non su un file

Fondamentalmente, ho file PHP, e voglio chiamare qualcosa di simile:

php -l somefile.php 

Ma io ho voglia di controllare una stringa , non è un file! Come si può fare? È possibile utilizzare STDIN, STDOUT o STDERR?

Se sì, come? Qualcuno può fornire un esempio qui?

Inoltre, dove inserisco il codice sopra? Non ho accesso a una riga di comando (non penso), o lo metto semplicemente all'interno di un file PHP che verrà eseguito? Eseguirà questo codice, in tal caso, all'interno della riga di comando?

Sono completamente all'oscuro di come funziona questa riga di comando PHP ... Qualcuno può aiutarmi a far luce su questo esattamente?

risposta

4

Se si desidera il codice filaccia (non all'interno di un file), l'unica opzione è scrivere un wrapper.

Supponendo che $ HOME/bin preceda/usr/bin, è possibile installare il proprio wrapper in $ HOME/bin/php che ha un'opzione diversa per il linting da riga di comando. Il wrapper creerebbe un file temporaneo, inserirà il codice, eseguirà /usr/bin/php -l file e quindi eliminerà il file temporaneo.

HTH.

+0

Nessun server blocca l'accesso alla riga di comando PHP? Se è così, che usare questo metodo è inutile. Sto costruendo un software che ha bisogno di soddisfare tutti o la maggior parte dei server ... –

+0

BTW, grazie per il vostro aiuto su questo! +1, aspetterò più risposte se ce ne sono prima che accetto questa come risposta. –

+0

@SolomonClosson Suppongo che tu stia chiedendo informazioni sui provider di hosting. La maggior parte dei provider di AFAIK esegue PHP come CGI in quanto non vogliono abbattere l'intero server Apache a causa di un bug in PHP o di alcuni core dump. Questo è il caso se eseguono Apache 2.x. Se eseguono Apache 1.x in qualsiasi modo siano automaticamente protetti, ma non ho visto un provider di hosting che esegue PHP come un modulo Apache. Ora, dato che PHP è disponibile come CGI, il binario potrebbe essere presente in modo da avere accesso per eseguirlo. – g13n

14

È possibile controllare il codice con php -l da STDIN convogliando in Esempio:.

$ echo "<?php echo 'hello world'" | php -l 

Parse error: syntax error, unexpected end of file, expecting ',' or ';' in - on line 2 

Errors parsing - 

Ecco il punto e virgola finale ; manca dopo la stringa tra virgolette singolo. Se si aggiunge che, l'errore va via e PHP ti dice così:

$ echo "<?php echo 'hello world';" | php -l 
No syntax errors detected in - 

Il cruscotto - in Errors parsing - o No syntax errors detected in - sta per STDIN. È comunemente usato per quello.

Un altro modo è scrivere il codice che si desidera filtrare (o copiarlo e incollarlo). Questo funziona utilizzando l'interruttore di lanugine con --, inserendo il codice e finitura inserendo Ctrl + D (Linux)/Ctrl + Z (Win) su una linea propria:

$ php -l -- 
<?php echo "1" 
^Z 

Parse error: syntax error, unexpected end of file, expecting ',' or ';' in - on line 2 

Errors parsing - 

BTW , l'interruttore -r che normalmente è destinato a fornire il codice per l'esecuzione, non funziona in questo caso e dà un errore:

$ php -l -r "echo 1" 
Either execute direct code, process stdin or use a file. 

Molto probabilmente perché è destinato per l'esecuzione di codice e questo è tutto per, nessun rilascio di fibre . Inoltre è senza il tag PHP di apertura.


Da tutte queste opzioni, la prima si fa probabilmente più senso se si vuole il tubo in (si può anche operare con proc_open nel caso in cui avete bisogno di più controllo). Ecco un rapido esempio utilizzando PHP di exec:

<?php 
/** 
* PHP Syntax Checking with lint and how to do this on a string, NOT a FILE 
* 
* @link http://stackoverflow.com/q/12152765/367456 
* @author hakre 
*/ 

$code = "<?php echo 'hello world'"; 

$result = exec(sprintf('echo %s | php -l', escapeshellarg($code)), $output, $exit); 

printf("Parsing the code resulted in; %s\n", $result); 

echo "The whole output is:\n"; 

print_r($output); 

L'uscita è la seguente:

Parsing the code resulted in; Errors parsing - 
The whole output is: 
Array 
(
    [0] => 
    [1] => Parse error: syntax error, unexpected '"', expecting ',' or ';' in - on line 1 
    [2] => Errors parsing - 
) 
+0

Roba buona, in me linux ma sarebbe CTRL + D comunque (fine dell'input), come CTRL-Z sarebbe andare in background. – Wrikken

+0

Immagino che dipenda dal terminale. Usando git bash qui su Windows XP. O probabilmente è il binario di windows php? – hakre

+0

Nah, è solo la differenza tra i gusci. CTRL + Z in Unix-like == invia 'SIGTSTP' da elaborare, in Windows == invia EOF. Nulla di ciò che il binario php può fare al riguardo. – Wrikken

1

vorrei suggerire check-out phpstan. È un linter costruito con PHP, e funziona molto come phpunit ma per il codice che linting. È possibile scrivere configurazioni, controllare i livelli di sfilacciamento e includere/ignorare le cartelle.

Dispone inoltre di codici di uscita appropriati.

https://github.com/phpstan/phpstan

In caso di utilizzo che non è possibile, ho usato this script here e funziona bene.

Problemi correlati