PHP
कमांड लाइन इंटरफ़ेस (सीएलआई)
खोज…
तर्क संभालना
अधिकांश सी-शैली भाषाओं के समान तरीके से तर्क को कार्यक्रम में पारित किया जाता है। $argc
एक पूर्णांक होता है जिसमें प्रोग्राम नाम सहित तर्कों की संख्या होती है, और $argv
एक सरणी होती है जिसमें प्रोग्राम के लिए तर्क होते हैं। $argv
का पहला तत्व प्रोग्राम का नाम है।
#!/usr/bin/php
printf("You called the program %s with %d arguments\n", $argv[0], $argc - 1);
unset($argv[0]);
foreach ($argv as $i => $arg) {
printf("Argument %d is %s\n", $i, $arg);
}
उपरोक्त एप्लिकेशन को php example.php foo bar
साथ php example.php foo bar
(जहाँ example.php में उपरोक्त कोड होता है) के परिणामस्वरूप निम्न मूल्य होगा:
आपने 2 उदाहरणों के साथ प्रोग्राम example.php को बुलाया
तर्क १ फू है
तर्क 2 बार है
ध्यान दें कि $argc
और $argv
वैश्विक चर हैं, $argc
चर नहीं। यदि उन्हें किसी फ़ंक्शन में आवश्यकता होती है, तो उन्हें global
कीवर्ड का उपयोग करके स्थानीय दायरे में आयात किया जाना चाहिए।
यह उदाहरण दिखाता है कि जब ""
या \
का उपयोग किया जाता है तो तर्कों को कैसे वर्गीकृत किया जाता है।
उदाहरण लिपि
var_dump($argc, $argv);
कमांड लाइन
$ php argc.argv.php --this-is-an-option three\ words\ together or "in one quote" but\ multiple\ spaces\ counted\ as\ one
int(6)
array(6) {
[0]=>
string(13) "argc.argv.php"
[1]=>
string(19) "--this-is-an-option"
[2]=>
string(20) "three words together"
[3]=>
string(2) "or"
[4]=>
string(12) "in one quote"
[5]=>
string(34) "but multiple spaces counted as one"
}
अगर PHP स्क्रिप्ट का उपयोग करके चलाया जाता है -r
:
$ php -r 'var_dump($argv);'
array(1) {
[0]=>
string(1) "-"
}
या php
STDIN में लगाया गया कोड:
$ echo '<?php var_dump($argv);' | php
array(1) {
[0]=>
string(1) "-"
}
इनपुट और आउटपुट हैंडलिंग
जब CLI से चलाया जाता है, तो स्थिरांक STDIN , STDOUT और STDERR पूर्वनिर्धारित होते हैं। ये स्थिरांक फ़ाइल हैंडल हैं, और इन्हें निम्न आदेशों को चलाने के परिणामों के बराबर माना जा सकता है:
STDIN = fopen("php://stdin", "r");
STDOUT = fopen("php://stdout", "w");
STDERR = fopen("php://stderr", "w");
स्थिरांक का उपयोग किया जा सकता है कहीं भी एक मानक फ़ाइल संभाल होगी:
#!/usr/bin/php
while ($line = fgets(STDIN)) {
$line = strtolower(trim($line));
switch ($line) {
case "bad":
fprintf(STDERR, "%s is bad" . PHP_EOL, $line);
break;
case "quit":
exit;
default:
fprintf(STDOUT, "%s is good" . PHP_EOL, $line);
break;
}
}
पूर्व में संदर्भित बिल्ड स्ट्रीम पते ( php://stdin
, php://stdout
, और php://stderr
) का उपयोग अधिकांश संदर्भों में फ़ाइल नाम के स्थान पर किया जा सकता है:
file_put_contents('php://stdout', 'This is stdout content');
file_put_contents('php://stderr', 'This is stderr content');
// Open handle and write multiple times.
$stdout = fopen('php://stdout', 'w');
fwrite($stdout, 'Hello world from stdout' . PHP_EOL);
fwrite($stdout, 'Hello again');
fclose($stdout);
एक विकल्प के रूप में, आप इनपुट के लिए रीडलाइन () का भी उपयोग कर सकते हैं, और आउटपुट के लिए इको या प्रिंट या किसी अन्य स्ट्रिंग प्रिंटिंग फ़ंक्शन का भी उपयोग कर सकते हैं।
$name = readline("Please enter your name:");
print "Hello, {$name}.";
कोड वापस करें
एग्जिट कंस्ट्रक्शन का इस्तेमाल एक्ज़ीक्यूटिव एन्वायरमेंट में रिटर्न कोड पास करने के लिए किया जा सकता है।
#!/usr/bin/php
if ($argv[1] === "bad") {
exit(1);
} else {
exit(0);
}
डिफ़ॉल्ट रूप से 0
का एक एग्जिट कोड वापस दिया जाएगा यदि कोई भी प्रदान नहीं किया जाता है, अर्थात exit
exit(0)
। चूंकि exit
एक फ़ंक्शन नहीं है, यदि कोई रिटर्न कोड पारित नहीं किया जा रहा है, तो कोष्ठक की आवश्यकता नहीं है।
रिटर्न कोड 0 से 254 की सीमा में होना चाहिए (255 PHP द्वारा आरक्षित है और इसका उपयोग नहीं किया जाना चाहिए)। सम्मेलन द्वारा, 0
रिटर्न कोड के साथ बाहर निकलने से कॉलिंग प्रोग्राम बताता है कि PHP स्क्रिप्ट सफलतापूर्वक चला। कॉलिंग प्रोग्राम को बताने के लिए एक गैर-शून्य रिटर्न कोड का उपयोग करें जो एक विशिष्ट त्रुटि स्थिति उत्पन्न हुई।
हैंडलिंग कार्यक्रम विकल्प
कार्यक्रम के विकल्प getopt()
फ़ंक्शन के साथ नियंत्रित किए जा सकते हैं। यह जीएनयू-शैली के लंबे विकल्पों के लिए अतिरिक्त समर्थन के साथ पोसिक्स getopt
कमांड के समान सिंटैक्स के साथ काम करता है।
#!/usr/bin/php
// a single colon indicates the option takes a value
// a double colon indicates the value may be omitted
$shortopts = "hf:v::d";
// GNU-style long options are not required
$longopts = ["help", "version"];
$opts = getopt($shortopts, $longopts);
// options without values are assigned a value of boolean false
// you must check their existence, not their truthiness
if (isset($opts["h"]) || isset($opts["help"])) {
fprintf(STDERR, "Here is some help!\n");
exit;
}
// long options are called with two hyphens: "--version"
if (isset($opts["version"])) {
fprintf(STDERR, "%s Version 223.45" . PHP_EOL, $argv[0]);
exit;
}
// options with values can be called like "-f foo", "-ffoo", or "-f=foo"
$file = "";
if (isset($opts["f"])) {
$file = $opts["f"];
}
if (empty($file)) {
fprintf(STDERR, "We wanted a file!" . PHP_EOL);
exit(1);
}
fprintf(STDOUT, "File is %s" . PHP_EOL, $file);
// options with optional values must be called like "-v5" or "-v=5"
$verbosity = 0;
if (isset($opts["v"])) {
$verbosity = ($opts["v"] === false) ? 1 : (int)$opts["v"];
}
fprintf(STDOUT, "Verbosity is %d" . PHP_EOL, $verbosity);
// options called multiple times are passed as an array
$debug = 0;
if (isset($opts["d"])) {
$debug = is_array($opts["d"]) ? count($opts["d"]) : 1;
}
fprintf(STDOUT, "Debug is %d" . PHP_EOL, $debug);
// there is no automated way for getopt to handle unexpected options
इस लिपि का परीक्षण इस प्रकार किया जा सकता है:
./test.php --help
./test.php --version
./test.php -f foo -ddd
./test.php -v -d -ffoo
./test.php -v5 -f=foo
./test.php -f foo -v 5 -d
ध्यान दें कि अंतिम विधि काम नहीं करेगी क्योंकि -v 5
मान्य नहीं है।
नोट: PHP 5.3.0 के रूप में,
getopt
ओएस स्वतंत्र है, विंडोज पर भी काम कर रहा है।
कमांड लाइन के लिए स्क्रिप्ट निष्पादन को प्रतिबंधित करें
फ़ंक्शन php_sapi_name()
और निरंतर PHP_SAPI
दोनों इंटरफ़ेस ( S erver API ) के प्रकार को लौटाते हैं जिसका उपयोग PHP द्वारा किया जा रहा है। उन्हें कमांड लाइन में स्क्रिप्ट के निष्पादन को प्रतिबंधित करने के लिए उपयोग किया जा सकता है, यह जांचकर कि फ़ंक्शन का आउटपुट cli
बराबर है या नहीं।
if (php_sapi_name() === 'cli') {
echo "Executed from command line\n";
} else {
echo "Executed from web browser\n";
}
drupal_is_cli()
फ़ंक्शन एक फ़ंक्शन का एक उदाहरण है जो यह पता लगाता है कि क्या स्क्रिप्ट को कमांड कमांड से निष्पादित किया गया है:
function drupal_is_cli() {
return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}
अपनी स्क्रिप्ट चला रहा हूं
लिनक्स / यूनिक्स या विंडोज पर, स्क्रिप्ट को एक्ज़ीक्यूटेबल के तर्क के रूप में पारित किया जा सकता है, उस स्क्रिप्ट के विकल्प और तर्क के साथ:
php ~/example.php foo bar
c:\php\php.exe c:\example.php foo bar
यह example.php
लिए तर्कों के रूप में foo
और bar
गुजरता है।
लिनक्स / यूनिक्स पर, स्क्रिप्ट चलाने की पसंदीदा विधि एक फ़ाइल की पहली पंक्ति के रूप में शेबंग (जैसे #!/usr/bin/env php
) का उपयोग करना है, और फ़ाइल पर निष्पादन योग्य बिट सेट करना है। स्क्रिप्ट को अपने पथ में मान लेने पर, आप इसे सीधे कॉल कर सकते हैं:
example.php foo bar
/usr/bin/env php
उपयोग से PATH का उपयोग करके पाया जाने वाला PHP निष्पाद्य हो जाता है। PHP कैसे स्थापित किया जाता है, इसका अनुसरण करने के बाद, यह उसी जगह पर स्थित नहीं हो सकता है (जैसे /usr/bin/php
या /usr/local/bin/php
), env
विपरीत जो सामान्यतः /usr/bin/env
से उपलब्ध होता है।
Windows पर, आप पीएचपी की निर्देशिका और पथ को अपनी स्क्रिप्ट जोड़ने और संपादन PATHEXT अनुमति देने के लिए द्वारा एक ही परिणाम हो सकता था .php
पथ का उपयोग कर पता लगाया जा। एक और संभावना है कि आपके पीएचपी स्क्रिप्ट के समान example.bat
या example.cmd
नाम की फ़ाइल जोड़ें और इस पंक्ति को उसमें लिखें:
c:\php\php.exe "%~dp0example.php" %*
या, यदि आपने PATH में PHP की निर्देशिका को सुविधाजनक उपयोग के लिए जोड़ा है:
php "%~dp0example.php" %*
कमांड लाइन पर व्यवहार अंतर
CLI से चलने पर, PHP एक वेब सर्वर से चलने पर कुछ अलग व्यवहार प्रदर्शित करता है। इन मतभेदों को ध्यान में रखा जाना चाहिए, विशेष रूप से उस स्थिति में जहां एक ही स्क्रिप्ट को दोनों वातावरणों से चलाया जा सकता है।
- कोई निर्देशिका नहीं बदलती वेब सर्वर से स्क्रिप्ट चलाते समय, वर्तमान कार्यशील निर्देशिका हमेशा स्क्रिप्ट की ही होती है। कोड की
require("./stuff.inc");
फ़ाइल को स्क्रिप्ट के समान निर्देशिका में है। कमांड लाइन पर, वर्तमान कार्य निर्देशिका वह निर्देशिका होती है जब आप स्क्रिप्ट को कॉल करते हैं। कमांड लाइन से आने वाले वर्णनों को हमेशा निरपेक्ष पथ का उपयोग करना चाहिए। (नोट करें कि मैजिक__DIR__
और__FILE__
उम्मीद के__DIR__
काम करते रहें और स्क्रिप्ट की लोकेशन लौटा दें।) - कोई आउटपुट बफ़र
php.ini
निर्देशोंoutput_buffering
औरimplicit_flush
करने के लिए डिफ़ॉल्टfalse
औरtrue
, क्रमशः। बफरिंग अभी भी उपलब्ध है, लेकिन स्पष्ट रूप से सक्षम होना चाहिए, अन्यथा आउटपुट हमेशा वास्तविक समय में प्रदर्शित किया जाएगा। - कोई समय सीमा नहीं ।
php.ini
निर्देशmax_execution_time
शून्य पर सेट है, इसलिए स्क्रिप्ट डिफ़ॉल्ट रूप से समय नहींmax_execution_time
। - कोई HTML त्रुटी नहीं है जिस स्थिति में आपने
php.ini
निर्देशhtml_errors
को सक्षम किया है, उसे कमांड लाइन पर नजरअंदाज कर दिया जाएगा। - विभिन्न
php.ini
को लोड किया जा सकता है । जब आप cli से php का उपयोग कर रहे हैं तो यह वेब सर्वर की तुलना में अलगphp.ini
उपयोग कर सकता है। आप जान सकते हैं किphp --ini
चलाकर कौन सी फाइल का उपयोग किया जा रहा है।
अंतर्निहित वेब सर्वर चल रहा है
संस्करण 5.4 से, PHP अंतर्निहित सर्वर के साथ आती है। यह बिना http या nachex जैसे अन्य http सर्वर को स्थापित करने की आवश्यकता के बिना एप्लिकेशन को चलाने के लिए उपयोग किया जा सकता है। अंतर्निहित सर्वर केवल विकास और परीक्षण उद्देश्यों के लिए नियंत्रक वातावरण में डिज़ाइन किया गया है।
इसे कमांड php -S के साथ चलाया जा सकता है:
यह परीक्षण करने के लिए index.php
फ़ाइल युक्त बनाएँ
<?php
echo "Hello World from built-in PHP server";
और कमांड php -S localhost:8080
चलाएं php -S localhost:8080
अब आपको ब्राउज़र में सामग्री देखने में सक्षम होना चाहिए। इसे जांचने के लिए, http://localhost:8080
हर पहुंच को लॉग इन में टर्मिनल के लिए लिखा जाना चाहिए
[Mon Aug 15 18:20:19 2016] ::1:52455 [200]: /
गेटअप के किनारे मामले ()
जब उपयोगकर्ता इनपुट असामान्य है, तो यह उदाहरण getopt
के व्यवहार को दर्शाता है:
getopt.php
var_dump(
getopt("ab:c::", ["delta", "epsilon:", "zeta::"])
);
शेल कमांड लाइन $ php getopt.php -a -a -bbeta -b beta -cgamma --delta --epsilon --zeta --zeta=f -c gamma
array(6) {
["a"]=>
array(2) {
[0]=>
bool(false)
[1]=>
bool(false)
}
["b"]=>
array(2) {
[0]=>
string(4) "beta"
[1]=>
string(4) "beta"
}
["c"]=>
array(2) {
[0]=>
string(5) "gamma"
[1]=>
bool(false)
}
["delta"]=>
bool(false)
["epsilon"]=>
string(6) "--zeta"
["zeta"]=>
string(1) "f"
}
इस उदाहरण से, यह देखा जा सकता है कि:
- व्यक्तिगत विकल्प (कोई बृहदान्त्र) हमेशा सक्षम होने पर
false
का बूलियन मान रखते हैं। - यदि एक विकल्प दोहराया जाता है, तो
getopt
के आउटपुट में संबंधित मान एक सरणी बन जाएगा। - आवश्यक तर्क विकल्प (एक कोलन) विभाजक के रूप में एक स्थान या कोई स्थान (वैकल्पिक तर्क विकल्प की तरह) स्वीकार करते हैं
- एक तर्क के बाद किसी भी विकल्प में मैप नहीं किया जा सकता है, पीछे के विकल्प को भी मैप नहीं किया जाएगा।