मुझे यह निर्धारित करने की आवश्यकता है कि PHP का वर्तमान आह्वान कमांड लाइन (CLI) से है या वेब सर्वर से (मेरे मामले में, Ap_ mod_php के साथ)।
किसी भी अनुशंसित तरीके?
मुझे यह निर्धारित करने की आवश्यकता है कि PHP का वर्तमान आह्वान कमांड लाइन (CLI) से है या वेब सर्वर से (मेरे मामले में, Ap_ mod_php के साथ)।
किसी भी अनुशंसित तरीके?
जवाबों:
php_sapi_nameवह फ़ंक्शन है जिसका आप उपयोग करना चाहते हैं क्योंकि यह इंटरफ़ेस प्रकार का एक लोअरकेस स्ट्रिंग लौटाता है। इसके अलावा, PHP स्थिरांक है PHP_SAPI।
प्रलेखन यहाँ पाया जा सकता है: http://php.net/php_sapi_name
उदाहरण के लिए, यह निर्धारित करने के लिए कि क्या PHP को CLI से चलाया जा रहा है, आप इस फ़ंक्शन का उपयोग कर सकते हैं:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgiयह काम नहीं करेगा। बदले में, यह cgi-fcgiस्ट्रिंग लौटाएगा । यदि आप स्क्रिप्ट को ब्राउज़र से वेब पेज के रूप में लोड करते हैं, तो आपको मिलेगा apache2handler। उम्मीद है की यह मदद करेगा। मुझे चर php-cgiपेश करने के लिए उपयोग करने की आवश्यकता है :। नहीं के बराबर होना चाहिए के लिए परीक्षण ठीक है । $_GETphp-cgi myscript.php arg1=one arg2=twoapache2handlerapache
"cli"। $_SERVERअनुरोध को HTTP के माध्यम से आया है या नहीं, इसके बारे में अधिक भरोसेमंद रूप से निर्धारित करने के लिए अंदर से चुनने के लिए एक नंबर ओड डिफरेंट कीज़ है ।
मैं कुछ वर्षों से इस फ़ंक्शन का उपयोग कर रहा हूं
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) के स्रोत का पता लगाने में सहायता के लिए चेक सही है । जब CLI में , $_SERVERसुपर ग्लोबल ऐरे की कुंजी नहीं होगी REQUEST_METHOD, यह केवल तब मौजूद होता है जब अनुरोध वेब के माध्यम से किया जाता है, इसलिए, लेखक पूरी तरह से इसके लिए जाँच करते समय निशाने पर होता है।
return false;या नहीं करना चाहिए if ( ! array_key_exists(…)) return true;?
'REQUEST_METHOD'है नहीं पाया, तो समारोह लौटना चाहिए FALSE"CLI" से संकेत मिलता है। फ़ंक्शन के दायरे पर ध्यान न देने के लिए मेरी माफी ... लेखक को इसे ठीक करना चाहिए क्योंकि फ़ंक्शन वास्तव में काम करता है!
php_sapi_name()वास्तव में इस जाँच को करने का सबसे अच्छा तरीका नहीं है क्योंकि यह कई संभावित मूल्यों के खिलाफ जाँच पर निर्भर करता है। Php-cgi बाइनरी को कमांड लाइन से, शेल स्क्रिप्ट से या क्रोन जॉब के रूप में कहा जा सकता है और (ज्यादातर मामलों में) इन्हें 'cli' भी माना जाना चाहिए, लेकिन php_sapi_name()इनके लिए अलग-अलग मान दिए जाएंगे (ध्यान दें कि यह isn ') PHP के सादे संस्करण के साथ मामला नहीं है, लेकिन आप चाहते हैं कि आपका कोड कहीं भी, सही काम करे?)। यह उल्लेख नहीं करने के लिए कि अगले वर्ष PHP का उपयोग करने के नए तरीके हो सकते हैं जिन्हें हम संभवतः अब नहीं जान सकते। मैं इसके बारे में नहीं सोचता जब मैं मौसम की परवाह करता हूं तो मुझे अपना आउटपुट HTML में लपेटना चाहिए या नहीं।
सौभाग्य से, PHP के पास इसके लिए विशेष रूप से जांच करने का एक तरीका है। बस http_response_code()किसी भी पैरामीटर के बिना उपयोग करें और यह TRUE लौटा देगा यदि एक वेब सर्वर प्रकार के वातावरण से और FALSE को एक CLI प्रकार के वातावरण से चलाया जाए। यहाँ कोड है:
$is_web=http_response_code()!==FALSE;
यह तब भी काम करेगा जब आप गलती से (?) इस कॉल से पहले CLI (या CLI जैसी कोई चीज़) से चलने वाली स्क्रिप्ट से एक प्रतिक्रिया कोड सेट करें।
http_response_code()CLI से चलने पर कोड / रिटर्न सेट कोड सेट करता है। द्वारा सत्यापित <?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();। तो अगर http_response_code()===falseयह CLI मानने के लिए सुरक्षित शर्त है, लेकिन अगर आपको अन्य मेट्रिक्स की भी जांच करने की आवश्यकता नहीं है।
मुझे लगता है कि उसका मतलब है कि अगर PHP सीएलआई को लागू किया जा रहा है या अगर यह एक वेब अनुरोध से प्रतिक्रिया है। इसका सबसे अच्छा तरीका यह होगा php_sapi_name()कि अगर यह एक वेब अनुरोध चला रहा है तो यह अपाचे को गूंज देगा यदि यह चल रहा था।
Php डॉक्सphp_sapi_name() से लिए गए कुछ की सूची पर :
function is_cli() {
return !http_response_code();
}
उदाहरण:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);... अगर मैं अब फोन http_response_code()करता हूं तो यह 200 वापस आ जाएगा;
http_response_code();सीएलआई वातावरण से कहा जाता है तो यह वास्तविक स्थिति कोड की परवाह किए बिना हमेशा FALSE लौटाएगा। मैंने पहले ही अपने उत्तर में यह समझाया है, लेकिन आप "रिटर्न वैल्यूज़" के तहत मैनुअल पेज को पढ़कर या इसे आज़माकर भी यह पता लगा सकते हैं।
php -r 'http_response_code(200); echo http_response_code()."\n";' आउटपुट "200" जब तक आप गारंटी दे सकते हैं कि कुछ पुस्तकालय या अज्ञानी ढांचे ने प्रतिक्रिया कोड को http_response_code(यहां तक कि एक cli env में) सेट नहीं किया है , तब यह काम करेगा। व्यक्तिगत रूप से, मैं का उपयोग करें$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
मैंने इसका उपयोग किया:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
यह Drush codebase, environment.inc से है जहां इन्हें बनाने के लिए समान जांच होती है।
Http://jp2.php.net/manual/en/features.commandline.php के अनुसार , सीएलआई से चलने पर केवल कई स्थिरांक निर्धारित होते हैं। ये स्थिरांक STDIN, STDOUT और STDERR हैं। उनमें से एक के लिए परीक्षण आपको बताएगा कि क्या यह क्ली मोड में है
मैं यह जांचने का सुझाव दूंगा कि क्या $ _SERVER सरणी में से कुछ प्रविष्टियां सेट की गई हैं।
उदाहरण के लिए:
if (isset($_SERVER['REQUEST_METHOD'])) {
print "HTTP request\n";
} else {
print "CLI invocation\n";
}
php-cgiकमांड लाइन के साथ काम नहीं करेगा , इसे इसके लिए सेट किया जाएगा GET:php-cgi -f file.php arg1=2
मेरा पसंदीदा तरीका:
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
}
एक आसान तरीका $argvचर को पूछताछ करना है, (जो आप वैसे भी कमांड लाइन मापदंडों के लिए करेंगे)। यहां तक कि अगर कोई पैरामीटर नहीं है तो $argvएक खाली सरणी देता है।
यदि यह सेट है, तो क्ली का उपयोग किया गया था। फिर आप मान सकते हैं कि अन्य सभी चालान किसी वेब सर्वर या अन्य के माध्यम से हैं।
उदाहरण के लिए:
if (isset($argv)) {
// Do the cli thing.
}
ऊपर सिल्वर मून के उत्तर के आधार पर , मैं सही लाइनब्रेक लौटाने के लिए इस फ़ंक्शन का उपयोग कर रहा हूं:
/**
* 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>";
}
इस प्रश्न का सही उत्तर इसके पीछे की वास्तविक मंशा पर निर्भर करता है:
यदि पूर्व में दिए गए उत्तर और लिखी गई टिप्पणियां काम करने वाले समाधान खोजने के लिए पर्याप्त हैं।
यदि उत्तरार्द्ध, यहां दिए गए व्यंजनों को विफल कर दिया जाएगा यदि उपकरण को क्रोनजोब के रूप में चलाया जाता है, या किसी अन्य डेमॉन से पृष्ठभूमि-नौकरी के रूप में - उस मामले में मैं आगे परीक्षण करने का सुझाव देता हूं यदि STDINएक टीटीवाई है:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
मैं कोशिश करूँगा:
echo exec('whoami');
आमतौर पर webservers एक अलग उपयोगकर्ता नाम के तहत चलाए जाते हैं, इसलिए यह बताना चाहिए।