2009-06-01 14 views

risposta

253

php_sapi_name è la funzione che si vuole usare in quanto restituisce una stringa minuscola del tipo di interfaccia. Inoltre, vi è la costante PHP PHP_SAPI.

La documentazione può essere trovato qui: http://php.net/php_sapi_name

Ad esempio, per determinare se PHP viene eseguito dalla CLI, è possibile utilizzare questa funzione:

function isCommandLineInterface() 
{ 
    return (php_sapi_name() === 'cli'); 
} 
+9

Più semplice: 'return php_sapi_name() == 'cli';' – Savageman

+9

Ho fatto una ricerca: se invochi lo script con 'php-cgi' questo non funzionerà. A sua volta, restituirà la stringa 'cgi-fcgi'. Se si carica lo script come pagina Web da un browser, si ottiene 'apache2handler'. Spero che questo ti aiuti. Avevo bisogno di usare 'php-cgi' per introdurre le variabili' $ _GET': 'php-cgi myscript.php arg1 = one arg2 = two'. Il test per non uguale a 'apache2handler' dovrebbe essere ok per' apache'. – Sebastian

+2

Un piccolo avvertimento su questo metodo: non * restituirà "cli" quando viene eseguito da un cron job. C'è un numero di chiavi diverse tra cui scegliere all'interno di '$ _SERVER' per determinare in modo più affidabile se la richiesta è arrivata via HTTP o no. – omninonsense

-14

mi piacerebbe provare:

echo exec('whoami'); 

solito server web è gestita sotto un nome utente diverso, in modo che dovrebbe essere dicendo.

3

Prova

isset($_SERVER['REQUEST_METHOD']) 

se è impostato, sei in un browser.

Alternatlely, si potrebbe verificare se

isset($_SERVER['argv']) 

ma che potrebbe non essere vero sulle finestre CLI, IDK.

+1

Anche se non è la risposta "corretta" potrebbe essere la più affidabile – challet

0

Vorrei suggerire di verificare se alcune delle voci della serie $_SERVER sono impostate.

Es .:

if (isset($_SERVER['REQUEST_METHOD'])) { 
     print "HTTP request\n"; 
} else { 
     print "CLI invocation\n"; 
} 
+0

Questo non funzionerà con la riga di comando di 'php-cgi', lo imposterà a' GET' per: 'php-cgi -f file.php arg1 = 2' – Sebastian

+0

@Sebastian, grazie per l'osservazione –

21

Credo che significa che se PHP CLI è essere invocato o se è una risposta da una richiesta web. Il modo migliore sarebbe utilizzare php_sapi_name() che se fosse in esecuzione una richiesta web farebbe eco ad Apache se questo è ciò che era in esecuzione.

Per la lista di pochi tratto dal php docs on php_sapi_name():

  • AOLserver
  • apache
  • apache2filter
  • apache2handler
  • caudium
  • CGI (fino a PHP 5.3)
  • cgi-fcgi
  • cli
  • cli-server (Built-in web server come da PHP 5.4)
  • continuità
  • incorporare
  • fpm-fcgi
  • isapi
  • litespeed
  • milter
  • NSAPI
  • phttpd
  • pi3web
  • Roxen
  • thttpd
  • smoking
  • webjames
0

Il mio metodo preferito:

if (array_key_exists('SHELL', $_ENV)) { 
    echo "Console invocation"; 
} 
else { 
    echo "HTTP invocation"; 
} 
+0

Questo non funzionerà con la riga di comando di 'php-cgi'. – Sebastian

3

ho usato questo:

php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0) 

Questo è da Drush base di codice, dove environment.inc hanno un controllo simile da fare.

+3

Se è impostato 'register_argc_argv', passare qualsiasi quantità di valori GET causerà che 'argc' non sia 0. –

0
// Detect CLI calls 
define("IS_CLI_CALL",(strcmp(php_sapi_name(),'cli') == 0)); 

if(IS_CLI_CALL){ 
    //do you stuff here 

} 
11

Questo dovrebbe gestire tutti i casi (tra cui php-cgi)

return (php_sapi_name() === 'cli' OR defined('STDIN')); 
0

modo joomla

if (array_key_exists('REQUEST_METHOD', $_SERVER)) die(); 
12

Ho utilizzato questa funzione per alcuni anni

function is_cli() 
{ 
    if (defined('STDIN')) 
    { 
     return true; 
    } 

    if (php_sapi_name() === 'cli') 
    { 
     return true; 
    } 

    if (array_key_exists('SHELL', $_ENV)) { 
     return true; 
    } 

    if (empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) 
    { 
     return true; 
    } 

    if (!array_key_exists('REQUEST_METHOD', $_SERVER)) 
    { 
     return true; 
    } 

    return false; 
} 

Fatemi sapere cosa ne pensate

+7

' array_key_exists (' REQUEST_METHOD ', $ _SERVER) restituisce true; 'WAT? – biziclop

+0

@biziclop, il controllo per 'array_key_exists ('REQUEST_METHOD', $ _SERVER)' è corretto per aiutare il rilevamento della _sorgente della richiesta_. Quando in ** CLI **, l'array Super Global '$ _SERVER' ** NON ** HANNO la chiave' REQUEST_METHOD', esiste solo quando la richiesta viene effettuata via Web, quindi, l'autore è assolutamente a bersaglio durante il controllo per questo. –

+1

@JulioMarchi: ma non dovrebbe 'return false;' oppure do' if (! Array_key_exists (...)) restituisce true; '? – biziclop

0

Un modo semplice è interrogare la variabile , (che probabilmente si farà comunque per i parametri della riga di comando). Anche se non ci sono parametri restituisce una matrice vuota.

Se è impostato, è stato utilizzato cli. Si può quindi assumere che tutte le altre invocazioni avvengano tramite un server web o altro.

esempio:

if (isset($argv)) { 
    // Do the cli thing. 
} 
9

php_sapi_name() non è davvero il modo migliore per eseguire questo controllo perché dipende controllo contro molti valori possibili. Il binario php-cgi può essere chiamato dalla riga di comando, da uno script di shell o come un cron job e (nella maggior parte dei casi) anche questi dovrebbero essere trattati come 'cli' ma php_sapi_name() restituirà valori diversi per questi (si noti che questo non è è il caso della versione semplice di PHP, ma vuoi che il tuo codice funzioni ovunque, giusto?). Per non parlare del fatto che il prossimo anno potrebbero esserci nuovi modi per usare PHP che non possiamo sapere ora. Preferirei non pensarci quando tutto quello che mi interessa è che dovrei avvolgere il mio output in HTML o no.

Fortunatamente, PHP ha un modo per verificare questo specificamente.È sufficiente utilizzare http_response_code() senza parametri e verrà restituito TRUE se eseguito da un ambiente di tipo server Web e FALSE se eseguito da un ambiente di tipo CLI. Ecco il codice:

$is_web=http_response_code()!==FALSE; 

Questo funziona anche se accidentalmente impostare un codice di risposta da uno script in esecuzione dalla CLI (o qualcosa di simile al CLI) prima di chiamare questo (?).

+1

Hai ragione ma perché nessuno ha votato per la tua risposta? –

+2

Questa domanda era già vecchia quando ho risposto. Votare questa risposta sarebbe probabilmente stato più utile del postare un'altra risposta che è un duplicato, tranne senza la spiegazione. – krowe2

6
function is_cli() { 
    return !http_response_code(); 
} 

esempio:

if (is_cli()) { 
    echo 'command line'; 
} else { 
    echo 'browser'; 
} 
+2

Dal manuale, "FALSE verrà restituito se response_code non viene fornito e non viene richiamato in un ambiente server Web (come da un'applicazione CLI). Verrà restituito TRUE se viene fornito response_code e non viene richiamato in un Web ambiente server (ma solo quando non è stato impostato nessuno stato di risposta precedente) ". Hai riavuto la tua logica. – krowe2

+1

+1. Stupefacente. Dopo tanti anni di ricerche infruttuose ... ti conferisco il Nobel Memorial Prize in PHPics, condiviso con @krowe2 per il suo inestimabile contributo nel farlo funzionare. Complimenti! –

Problemi correlati