Saya perlu menentukan apakah permintaan PHP saat ini berasal dari baris perintah (CLI) atau dari server web (dalam kasus saya, Apache dengan mod_php).
Adakah metode yang direkomendasikan?
Saya perlu menentukan apakah permintaan PHP saat ini berasal dari baris perintah (CLI) atau dari server web (dalam kasus saya, Apache dengan mod_php).
Adakah metode yang direkomendasikan?
Jawaban:
php_sapi_nameadalah fungsi yang Anda ingin gunakan karena mengembalikan string huruf kecil dari tipe antarmuka. Selain itu, ada konstanta PHP PHP_SAPI.
Dokumentasi dapat ditemukan di sini: http://php.net/php_sapi_name
Misalnya, untuk menentukan apakah PHP dijalankan dari CLI, Anda bisa menggunakan fungsi ini:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgiini tidak akan berhasil. Pada gilirannya, itu akan mengembalikan cgi-fcgiString. Jika Anda memuat skrip sebagai halaman web dari browser, Anda akan mendapatkannya apache2handler. Semoga ini membantu. Saya perlu menggunakan php-cgidalam rangka memperkenalkan $_GETvariabel: php-cgi myscript.php arg1=one arg2=two. Pengujian untuk tidak sama dengan apache2handlerharus ok untuk apache.
"cli"ketika dijalankan dari pekerjaan cron. Ada beberapa kunci untuk memilih dari dalam $_SERVERuntuk menentukan lebih andal apakah permintaan datang melalui HTTP atau tidak.
Saya telah menggunakan fungsi ini selama beberapa tahun
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)sudah benar untuk membantu mendeteksi sumber permintaan . Ketika di CLI , $_SERVERarray Super Global TIDAK AKAN MEMILIKI kunci REQUEST_METHOD, itu hanya ada ketika permintaan dilakukan melalui Web, oleh karena itu, penulis benar-benar tepat sasaran ketika memeriksanya.
return false;atau tidak if ( ! array_key_exists(…)) return true;?
'REQUEST_METHOD'adalah TIDAK ditemukan, maka fungsi harus kembali FALSEuntuk menunjukkan "CLI". Permintaan maaf saya karena tidak memperhatikan ruang lingkup fungsi itu sendiri ... Penulis harus memperbaikinya karena fungsi sebenarnya berfungsi!
php_sapi_name()benar-benar bukan cara terbaik untuk melakukan pemeriksaan ini karena ini tergantung pada pemeriksaan terhadap banyak nilai yang mungkin. Biner php-cgi dapat dipanggil dari baris perintah, dari skrip shell atau sebagai tugas cron dan (dalam kebanyakan kasus) ini juga harus diperlakukan sebagai 'cli' tetapi php_sapi_name()akan mengembalikan nilai yang berbeda untuk ini (perhatikan bahwa ini bukan ' t kasus dengan versi PHP biasa tetapi Anda ingin kode Anda bekerja di mana saja, kan?). Belum lagi bahwa tahun depan mungkin ada cara baru untuk menggunakan PHP yang tidak mungkin kita ketahui sekarang. Saya lebih suka tidak memikirkannya ketika saya hanya peduli cuaca saya harus membungkus output saya dalam HTML atau tidak.
Untungnya, PHP memiliki cara untuk memeriksa ini secara khusus. Cukup gunakan http_response_code()tanpa parameter apa pun dan itu akan mengembalikan BENAR jika dijalankan dari lingkungan jenis server web dan SALAH jika dijalankan dari lingkungan jenis CLI. Ini kodenya:
$is_web=http_response_code()!==FALSE;
Ini bahkan akan berfungsi jika Anda secara tidak sengaja (?) Menetapkan kode respons dari skrip yang dijalankan dari CLI (atau sesuatu seperti CLI) sebelum Anda menyebutnya.
http_response_code()set kode / mengembalikan kode set saat menjalankan dari CLI. Diverifikasi oleh <?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();. Jadi jika http_response_code()===falseitu taruhan yang aman untuk mengasumsikan CLI, tetapi jika tidak, Anda juga perlu memeriksa metrik lainnya.
Saya pikir maksudnya jika PHP CLI dijalankan atau jika ini merupakan respons dari permintaan web. Cara terbaik adalah menggunakan php_sapi_name()yang jika menjalankan permintaan web akan mengulangi Apache jika itu yang dijalankan.
Untuk daftar beberapa diambil dari dokumenphp_sapi_name() php pada :
function is_cli() {
return !http_response_code();
}
contoh:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);... jika sekarang saya memanggilnya http_response_code()akan mengembalikan 200;
http_response_code();dipanggil dari lingkungan CLI itu akan selalu mengembalikan FALSE terlepas dari kode status yang sebenarnya. Saya sudah menjelaskan ini dalam jawaban saya, tetapi Anda juga bisa mengetahuinya dengan membaca halaman manual di bawah "Return Values" atau dengan mencobanya.
php -r 'http_response_code(200); echo http_response_code()."\n";' menghasilkan "200" Kecuali Anda dapat menjamin bahwa beberapa pustaka atau kerangka kerja yang bodoh tidak menetapkan kode respons dengan http_response_code(bahkan dalam cli env), maka ini akan berfungsi. Secara pribadi, saya menggunakan$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
Saya menggunakan ini:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
Ini dari basis kode Drush, environment.inc di mana mereka memiliki pemeriksaan serupa.
Mencoba
isset($_SERVER['REQUEST_METHOD'])
jika diatur, Anda berada di browser.
Atau, Anda dapat memeriksa apakah
isset($_SERVER['argv'])
tapi itu mungkin tidak benar di windows CLI, IDK.
Menurut http://jp2.php.net/manual/en/features.commandline.php Ada sejumlah konstanta yang ditetapkan hanya ketika dijalankan dari CLI. Konstanta ini adalah STDIN, STDOUT dan STDERR. Menguji salah satu dari mereka akan memberi tahu Anda apakah itu dalam mode cli
Saya akan menyarankan untuk memeriksa apakah beberapa entri dari array $ _SERVER disetel.
Misalnya:
if (isset($_SERVER['REQUEST_METHOD'])) {
print "HTTP request\n";
} else {
print "CLI invocation\n";
}
php-cgibaris perintah, itu akan mengaturnya GETuntuk:php-cgi -f file.php arg1=2
Metode pilihan saya:
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
}
Cara mudah adalah dengan menginterogasi $argvvariabel, (yang mungkin akan Anda lakukan untuk parameter baris perintah). Bahkan jika tidak ada parameter $argvmengembalikan array kosong.
Jika sudah diatur, maka cli digunakan. Anda kemudian dapat menganggap semua permintaan lainnya melalui beberapa server web atau lainnya.
misalnya:
if (isset($argv)) {
// Do the cli thing.
}
Berdasarkan jawaban Silver Moon di atas , saya menggunakan fungsi ini untuk mengembalikan linebreak yang benar:
/**
* 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>";
}
Jawaban yang benar untuk pertanyaan ini tergantung pada maksud sebenarnya di baliknya:
Jika yang pertama jawaban yang diberikan dan komentar yang ditulis sudah cukup untuk menemukan solusi yang berhasil.
Jika yang terakhir, resep yang diberikan di sini akan gagal jika alat dijalankan sebagai cronjob, atau sebagai latar belakang-pekerjaan dari daemon lain - dalam hal ini saya menyarankan untuk melakukan tes lebih lanjut apakah STDINTTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
Saya akan mencoba:
echo exec('whoami');
Biasanya webservers dijalankan di bawah nama pengguna yang berbeda, sehingga harus dikatakan.