Devo determinare se l'attuale invocazione di PHP proviene dalla riga di comando (CLI) o dal server Web (nel mio caso, Apache con mod_php).
Qualche metodo raccomandato?
Devo determinare se l'attuale invocazione di PHP proviene dalla riga di comando (CLI) o dal server Web (nel mio caso, Apache con mod_php).
Qualche metodo raccomandato?
Risposte:
php_sapi_nameè la funzione che vorrai utilizzare in quanto restituisce una stringa minuscola del tipo di interfaccia. Inoltre, c'è la costante PHP PHP_SAPI.
La documentazione è disponibile qui: http://php.net/php_sapi_name
Ad esempio, per determinare se PHP è in esecuzione dalla CLI, è possibile utilizzare questa funzione:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgiquesto non funzionerà. A sua volta, restituirà cgi-fcgiString. Se carichi lo script come pagina web da un browser, otterrai apache2handler. Spero che questo ti aiuti. Avevo bisogno di utilizzare php-cgial fine di introdurre $_GETle variabili: php-cgi myscript.php arg1=one arg2=two. Test per non uguale a apache2handlerdovrebbe essere ok per apache.
"cli"quando viene eseguito da un job cron. Esistono diverse chiavi tra cui scegliere all'interno $_SERVERper determinare in modo più affidabile se la richiesta è arrivata via HTTP o meno.
Uso questa funzione da 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;
}
array_key_exists('REQUEST_METHOD', $_SERVER) return true;WAT?
array_key_exists('REQUEST_METHOD', $_SERVER)è corretto per aiutare il rilevamento della fonte della richiesta . Quando nella CLI , l' $_SERVERarray Super Global NON AVRÀ la chiave REQUEST_METHOD, esiste solo quando la richiesta viene effettuata via Web, quindi l'autore è assolutamente sulla destinazione quando lo controlla.
return false;o no if ( ! array_key_exists(…)) return true;?
'REQUEST_METHOD' viene trovato, la funzione dovrebbe tornare a indicare "CLI". Mi scuso per non aver prestato attenzione all'ambito della funzione stessa ... L'autore dovrebbe risolverlo perché la funzione funziona davvero! FALSE
php_sapi_name()non è davvero il modo migliore per eseguire questo controllo perché dipende dal controllo rispetto a molti valori possibili. Il binario php-cgi può essere chiamato dalla riga di comando, da uno script di shell o come cron job e (nella maggior parte dei casi) anche questi dovrebbero essere trattati come 'cli' ma php_sapi_name()restituiranno valori diversi per questi (nota che questo non è ' È il caso della versione normale di PHP ma vuoi che il tuo codice funzioni ovunque, giusto?). Per non parlare del fatto che il prossimo anno potrebbero esserci nuovi modi di usare PHP che non possiamo sapere ora. Preferirei non pensarci quando tutto ciò che mi interessa è il tempo dovrei avvolgere il mio output in HTML o no.
Fortunatamente, PHP ha un modo per verificarlo specificamente. Basta usare http_response_code()senza parametri e restituirà VERO se eseguito da un ambiente di tipo web server e FALSO se eseguito da un ambiente di tipo CLI. Ecco il codice:
$is_web=http_response_code()!==FALSE;
Funzionerà anche se imposti (?) Accidentalmente un codice di risposta da uno script in esecuzione dalla CLI (o qualcosa di simile alla CLI) prima di chiamarlo.
http_response_code()imposta il codice / restituisce il codice impostato durante l'esecuzione dalla CLI. Verificato da <?php function t() { echo var_export(http_response_code(), true) . ' -> ' . (http_response_code() !== false ? 'web' : 'cli') . "\n"; } t(); http_response_code(200); t(); http_response_code(false); t();. Quindi se è http_response_code()===falseuna scommessa sicura assumere la CLI, ma in caso contrario è necessario controllare anche altre metriche.
Penso che significhi se la CLI di PHP viene invocata o se si tratta di una risposta da una richiesta web. Il modo migliore sarebbe quello di usare php_sapi_name()quale se fosse in esecuzione una richiesta web farebbe eco ad Apache se questo è quello che stava eseguendo.
Per elencare alcuni tratti dai documentiphp_sapi_name() php su :
function is_cli() {
return !http_response_code();
}
esempio:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);... se ora lo chiamo http_response_code()restituirà 200;
http_response_code();viene chiamato da un ambiente CLI, restituirà sempre FALSE indipendentemente dal codice di stato effettivo. L'ho già spiegato nella mia risposta, ma potresti averlo scoperto anche leggendo la pagina del manuale in "Valori di restituzione" o provandolo.
php -r 'http_response_code(200); echo http_response_code()."\n";' restituisce "200" A meno che non sia possibile garantire che alcune librerie o framework ignoranti non abbiano impostato il codice di risposta con http_response_code(anche in un client), allora funzionerà. Personalmente, io uso$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
Ho usato questo:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
Questo proviene da Drush codebase, environment.inc dove hanno un controllo simile da fare.
Secondo http://jp2.php.net/manual/en/features.commandline.php Esistono alcune costanti impostate solo quando si esegue dalla CLI. Queste costanti sono STDIN, STDOUT e STDERR. Il test per uno di questi ti dirà se è in modalità cli
via Joomla
if (array_key_exists('REQUEST_METHOD', $_SERVER)) die();
Suggerirei di verificare se sono state impostate alcune delle voci dell'array $ _SERVER .
Per esempio:
if (isset($_SERVER['REQUEST_METHOD'])) {
print "HTTP request\n";
} else {
print "CLI invocation\n";
}
php-cgiriga di comando, lo imposterà GETsu:php-cgi -f file.php arg1=2
Il mio metodo preferito:
if (array_key_exists('SHELL', $_ENV)) {
echo "Console invocation";
}
else {
echo "HTTP invocation";
}
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
Un modo semplice è quello di interrogare la $argvvariabile (che probabilmente farai comunque per i parametri della riga di comando). Anche se non ci sono parametri $argvrestituisce un array vuoto.
Se è impostato, è stato utilizzato cli. Si può quindi presumere che tutte le altre invocazioni avvengano tramite un server Web o altro.
per esempio:
if (isset($argv)) {
// Do the cli thing.
}
Sulla base della risposta di Silver Moon sopra , sto usando questa funzione per restituire le interruzioni di riga corrette:
/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){
return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
(empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
!isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";
}
La risposta corretta a questa domanda dipende dal vero intento che sta dietro:
Se il primo le risposte fornite e i commenti scritti sono sufficienti per trovare una soluzione che funzioni.
In quest'ultimo caso, le ricette fornite qui falliranno se lo strumento viene eseguito come cronjob o come processo in background da un altro demone - in tal caso suggerisco di testare ulteriormente se STDINè un TTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
Proverei:
echo exec('whoami');
Di solito i server web sono gestiti con un nome utente diverso, quindi dovrebbe essere utile.