PHP स्क्रिप्ट की कमांडलाइन बनाम http निष्पादन को निर्धारित करने के लिए विहित तरीका क्या है?


155

मेरे पास एक PHP स्क्रिप्ट है जिसे यह निर्धारित करने की आवश्यकता है कि यह कमांड-लाइन या HTTP के माध्यम से निष्पादित किया गया है, मुख्य रूप से आउटपुट-स्वरूपण प्रयोजनों के लिए। ऐसा करने का विहित तरीका क्या है? मैंने सोचा था कि यह निरीक्षण करना है SERVER['argc'], लेकिन यह पता चला है कि यह 'अपाचे 2.0 हैंडलर' सर्वर एपीआई का उपयोग करते समय भी आबाद है।

जवाबों:


228

php_sapi_name()फ़ंक्शन का उपयोग करें ।

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}

यहाँ डॉक्स से कुछ प्रासंगिक नोट्स दिए गए हैं:

php_sapi_name - वेब सर्वर और PHP के बीच इंटरफ़ेस का प्रकार लौटाता है

हालांकि संपूर्ण नहीं, संभावित रिटर्न मानों में एओलसेवर, अपाचे, अपाचे 2फिल्टर, अपाचे 2 हैंडलर, कौडियम, PHP (जब तक PHP 5.3), cgi-fcgi, cli, cli-server, निरंतरता, एम्बेड, isapi, litespeed, मिल्टर, nsapi, phttpd शामिल हैं। pi3web, roxen, thttpd, tux, और webjames।

PHP> = 4.2.0 में, एक पूर्वनिर्धारित स्थिरांक भी है PHP_SAPI, जिसका मान उतना ही है php_sapi_name()


धन्यवाद। मैं क्यों डॉक्टर के रूप में intrigued रहा हूँ। उदाहरण पहले 3 वर्णों का निरीक्षण करता है, जबकि वर्णन बताता है कि स्ट्रिंग बिल्कुल "cgi" होनी चाहिए लेकिन, इसके अलावा, मुझे लगता है कि यह एकदम सही है।
बॉबी जैक

जब तक, निश्चित रूप से, लौटा स्ट्रिंग 'cgi' था, जो कंसोल से php निष्पादित होने का भी संकेत है। जैसा कि, whaddayaknow, मेरा मामला।
एड्रियानो वरोली पियाज़ा

@ एड्रियानो: शायद आपके मामले में स्क्रिप्ट को निष्पादित करने के लिए php-cgi का उपयोग किया जाता है।

3
@ बॉबी, php.net डॉक्स में उदाहरण वास्तव में "cgi" और "cgi-fcgi" दोनों से मेल खाता है, स्ट्रिंग के पहले तीन पात्रों को देखकर ... यही कारण है और यह वास्तव में समझ में आता है। अगर कुछ भी हो तो बस वापस आना होगा @ पीएचपी को गंभीर प्रोग्रामर के लिए कोई भाषा नहीं बोलने के लिए: D
ChrisR

1
यहाँ एक दिलचस्प बात यह है: php.net/manual/en/function.php-sapi-name.php यह है कि वास्तविक बाइनरी कहा जाता है के आधार पर, आप कमांड लाइन से php चला सकते हैं और फिर भी cgi-fgi प्राप्त कर सकते हैं
DAB

22

यह हमेशा काम करेगा। (यदि PHP संस्करण 4.2.0 या उच्चतर है)

define('CLI', PHP_SAPI === 'cli');

जो आपकी स्क्रिप्ट के शीर्ष पर उपयोग करना आसान बनाता है:

<?php PHP_SAPI === 'cli' or die('not allowed');

8
आपका दूसरा स्निपेट एक गैर अनुक्रमिक की तरह लगता है, मुझे उम्मीद हैCLI or die('not allowed');
Madbreaks

1
@ मैडब्रेक्स, मैं दो अलग-अलग उपयोग बता रहा था। मैं यह सोचते गया था या तो एक या अन्य - लेकिन अगर आप दोनों का उपयोग तो CLI or die('not allowed');एकदम सही है।
Xeoncross

स्पष्ट करने के लिए धन्यवाद, +1
Madbreaks

7
Which makes it easy to use at the top of your scriptsवास्तव में यह दो अलग-अलग उपयोगों की तरह आवाज नहीं करता है। हां, मैं एक नेक्रोमन्ट हूं।
जॉर्ज दिमित्रिदिस


8

मुझे लगता है

$_SERVER['REMOTE_ADDR']

सीएलआई से आबादी नहीं होगी।

इसके अलावा, $ _SERVER सुपरग्लोबल में सभी HTTP_ * कुंजियाँ CLI से पॉपुलेट नहीं की जाएंगी, या इसे सही तरीके से किया गया होप सिर्फ उल्लेख किया है :-)


4

php_sapi_Name के लिए प्रलेखन पृष्ठ स्पष्ट रूप से बताता है कि यह कैसे काम करता है:

एक लोअरकेस स्ट्रिंग देता है जो इंटरफ़ेस के प्रकार (सर्वर एपीआई, एसएपीआई) का वर्णन करता है जिसे PHP उपयोग कर रहा है ...।

हालांकि संपूर्ण नहीं है, संभावित रिटर्न मानों में एओलसेवर, अपाचे, अपाचे 2फिल्टर, अपाचे 2 हैंडलर, कौडियम, PHP (जब तक PHP 5.3), cgi-fcgi, cli, निरंतरता, एम्बेड, isapi, litespeed, मिल्टर, nsapi, phttpd, pi3web, ro3 शामिल हैं। thttpd, tux, और webjames।

मुझे यकीन नहीं है कि हॉप यह क्यों नहीं सोचता है कि पीएचपी गंभीर प्रोग्रामर के लिए है (मैं एक गंभीर प्रोग्रामर हूं, और मैं रोजाना PHP का उपयोग करता हूं), लेकिन अगर वह प्रलेखन को स्पष्ट करने में मदद करना चाहता है, तो शायद वह सभी संभव वेब सर्वरों का ऑडिट कर सकता है वह PHP चल सकता है और प्रत्येक सर्वर के लिए सभी संभावित इंटरफ़ेस प्रकारों के नाम निर्धारित कर सकता है। बस उस सूची को नए वेब सर्वर और इंटरफेस के रूप में अद्यतन रखने के लिए सुनिश्चित करें।

इसके अलावा, बॉबी ने कहा:

मैं क्यों डॉक्टर के रूप में intrigued रहा हूँ। उदाहरण पहले 3 वर्णों का निरीक्षण करता है, जबकि वर्णन बताता है कि स्ट्रिंग बिल्कुल "CGI" होनी चाहिए

उदाहरण के लिए विवरण बताता है:

यह उदाहरण स्थानापन्न cgi के लिए जाँच करता है क्योंकि यह cgi-fcgi भी हो सकता है।


आह - या तो मैं उस दिन अविश्वसनीय रूप से अनभिज्ञ था, या उदाहरण को अपडेट किया गया है क्योंकि मैंने वह टिप्पणी की है। यद्यपि PHP के बारे में आपके बिंदुओं से पूरी तरह सहमत हैं, हालांकि; कोसने बहुत थक गया हो जाता है।
बॉबी जैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.