खोज…


तर्क संभालना

अधिकांश सी-शैली भाषाओं के समान तरीके से तर्क को कार्यक्रम में पारित किया जाता है। $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 के आउटपुट में संबंधित मान एक सरणी बन जाएगा।
  • आवश्यक तर्क विकल्प (एक कोलन) विभाजक के रूप में एक स्थान या कोई स्थान (वैकल्पिक तर्क विकल्प की तरह) स्वीकार करते हैं
  • एक तर्क के बाद किसी भी विकल्प में मैप नहीं किया जा सकता है, पीछे के विकल्प को भी मैप नहीं किया जाएगा।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow