लिनक्स कमांड प्रॉम्प्ट में $ _GET पास कर रहा है


125

कहो हम आम तौर पर के माध्यम से पहुँचते हैं

http://localhost/index.php?a=1&b=2&c=3

हम linux कमांड प्रॉम्प्ट में कैसे निष्पादित करते हैं?

php -e index.php

लेकिन $ _GET चर को पारित करने के बारे में क्या? शायद php -e index.php --a 1 --b 2 --c 3 जैसे कुछ? संदेह है कि काम करेंगे।

धन्यवाद!

जवाबों:


122

सामान्यतया, कमांड लाइन स्क्रिप्ट में तर्क पारित करने के लिए, आप या तो argvवैश्विक चर का उपयोग करेंगे या गेटअप करेंगे :

// bash command:
//   php -e myscript.php hello
echo $argv[1]; // prints hello

// bash command:
//   php -e myscript.php -f=world
$opts = getopt('f:');
echo $opts['f']; // prints world

$ _GET HTTP GET विधि मापदंडों को संदर्भित करता है, जो कमांड लाइन में अनुपलब्ध हैं, क्योंकि उन्हें आबाद करने के लिए वेब सर्वर की आवश्यकता होती है।

यदि आप वास्तव में $ _GET को किसी भी तरह से आबाद करना चाहते हैं, तो आप ऐसा कर सकते हैं:

// bash command:
//   export QUERY_STRING="var=value&arg=value" ; php -e myscript.php
parse_str($_SERVER['QUERY_STRING'], $_GET);
print_r($_GET);
/* outputs:
     Array(
        [var] => value
        [arg] => value
     )
*/

आप किसी दिए गए स्क्रिप्ट को निष्पादित कर सकते हैं, $_GETकमांड लाइन से पॉपुलेट कर सकते हैं , बिना स्क्रिप्ट को संशोधित किए बिना:

export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'

ध्यान दें कि आप के साथ $_POSTऔर साथ ही कर सकते हैं $_COOKIE


1
यह ध्यान देने योग्य है कि, PHP 5.3 पर चलने वाले हमारे Centos 6 मशीन पर, कॉलिंग php [script name] "a=1&b=2&c=3"पॉप्युलेट नहीं होगी $_SERVER['QUERY_STRING'], लेकिन आप आसानी से संदर्भित करके उसी चीज़ को प्रभावित कर सकते हैं $_SERVER['argv'][1]
एरिक एल।

4
PHP स्क्रिप्ट को संशोधित किए बिना कमांड लाइन से क्वेरी स्ट्रिंग को पॉप्युलेट करने के लिए इस उत्तर को आज़माएं ।
13

यह सबसे अच्छा जवाब नहीं है। इस पृष्ठ पर अन्य उत्तर देखें: stackoverflow.com/a/11965479/543738
LS

मददगार जवाब, हालांकि अगर मेरी तरह आप सोच रहे हैं कि उन कॉलोनों में तर्क नामों के बाद क्या है getopt(), तो यह स्पष्ट रूप से PHP को बताता है कि आप तर्क चाहते हैंf , न कि विकल्प f (जो कि कोलन निर्दिष्ट किया जाएगा)। तो यह सिर्फ वाक्यविन्यास है।
Mitya

मुझे वास्तव में अंतिम उत्तर पसंद है, और मैंने कल इसका इस्तेमाल किया। इसे स्क्रिप्ट में भी बदला जा सकता है।
रीइनियरियरपोस्ट

239

ServerFault पर इस जवाब से :

php-cgiबाइनरी का उपयोग केवल के बजाय करें php, और इस तरह कमांड लाइन पर तर्क पास करें:

php-cgi -f index.php left=1058 right=1067 class=A language=English

जो इस में डालता है $_GET:

Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)

आप पर्यावरण चर भी सेट कर सकते हैं जो इस तरह से वेब सर्वर द्वारा निर्धारित किया जाएगा:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English

10
+1 और +1: यह उत्तर स्वीकृत उत्तर होना चाहिए था। बहुत कम परेशानी! Php स्रोत को बदलने की आवश्यकता नहीं है।
मिका

2
बहुत बढ़िया, यह आसानी से किसी भी ओएस-निर्भर स्क्रिप्ट में लपेटा जा सकता है।
सेबस्टियन

2
+1, ज़बरदस्त समाधान, मैं वर्तमान में अपने सभी CLI लिपियों का समर्थन कर रहा हूं, अब इसका समर्थन करता हूं;)
ehime

मैंने अब तक जो एकमात्र नकारात्मक पहलू देखा है, वह यह है कि टर्मिनल आउटपुट सिर्फ \ n के बजाय <br /> के साथ HTML है। यह सभी नोटिस और त्रुटियों पर भी लागू होता है, उदाहरण के लिए<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
बाफ्रोमका

+1 विस्मयकारी, यह सामान्य स्क्रिप्ट $ _GET मान के लिए पूर्व की तरह php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething काम करता है : वर्क्स गुड ..
अजमल प्रवीण

16

मेरे पास उबंटू पर php-cgi बाइनरी नहीं है, इसलिए मैंने ऐसा किया:

% उर्फ ​​php-cgi = "php -r '" "parse_str (implode (" & ", array_slice ($ argv, 2)), $ _GET); शामिल हैं ($ argv [1]); "" - "
% php-cgi test1.php foo = 123
<Html>
आपने फू को 123 पर सेट किया है।
</ Html>

% बिल्ली test1.php
<html> आपने foo को <? php प्रिंट $ _GET ['फू']?> </ html में सेट किया है।

कर्मचारियों को ठीक करने के लिए एक php- तरह दिखता है।
फेलिकजैड

14

कभी-कभी आपके पास पास किए गए मापदंडों के लिए $ _GET सेट करने के लिए php फ़ाइल को संपादित करने का विकल्प नहीं होता है, और कभी-कभी आप php-cgi को स्थापित या नहीं कर सकते हैं।

मैंने इसे उस मामले के लिए सबसे अच्छा समाधान पाया:

php -r '$_GET["key"]="value"; require_once("script.php");' 

यह आपकी php फ़ाइल को बदलने से बचता है और आपको सादे php कमांड का उपयोग करने देता है। यदि आपके पास php-cgi स्थापित है, तो हर तरह से इसका उपयोग करें, लेकिन यह अगली सबसे अच्छी बात है। सोचा यह विकल्प उल्लेख के योग्य था

-r का अर्थ है निम्नलिखित स्ट्रिंग में php कोड को रन करना। आप $ _GET मान को वहां मैन्युअल रूप से सेट करते हैं, और फिर उस फ़ाइल का संदर्भ देते हैं जिसे आप चलाना चाहते हैं।

इसकी ध्यान देने योग्य बात आपको इसे सही फ़ोल्डर में चलाना चाहिए, अक्सर नहीं, लेकिन हमेशा फ़ोल्डर में php फ़ाइल नहीं होती है। बयानों के अनुसार आपके आदेश के स्थान का उपयोग रिश्तेदार यूआरएल को हल करने के लिए करेंगे, फ़ाइल का स्थान नहीं।


1
मैं आपको इस समाधान के लिए धन्यवाद देना चाहता हूं। मेरे विचार से यह स्वीकृत उत्तर होना चाहिए। आपको इसका उपयोग करने के लिए एक अतिरिक्त लाइब्रेरी स्थापित करने की आवश्यकता नहीं है।
तलवारबाजी

यह स्वीकृत उत्तर की तुलना में बेहतर है। आप के लिए Upvote!
faraday703

awsome और आसान समाधान!
व्युत्पन्न

बहुत बढ़िया जवाब। आप अपने कोड में केवल एक अंतिम उद्धरण याद कर रहे हैं :)
पेड्रो अरुजो जॉर्ज

10
php file_name.php var1 var2 varN

फिर $_GETPHP में अपनी पहली पंक्ति पर अपने चर सेट करें , हालांकि यह $_GETचर सेट करने का वांछित तरीका नहीं है और आप उस चर के साथ बाद में क्या करते हैं, इसके आधार पर आपको समस्याओं का अनुभव हो सकता है।

if (isset($argv[1])) {
   $_GET['variable_name'] = $argv[1];
}

आपके द्वारा स्क्रिप्ट लॉन्च करने वाले चर $argvआपके PHP ऐप में सरणी से सुलभ होंगे । पहली प्रविष्टि उस स्क्रिप्ट का नाम होगी, जिससे वे आए थे, इसलिए आप array_shift($argv)उस ड्रॉप को पहली प्रविष्टि करना चाहें, यदि आप चर का एक गुच्छा संसाधित करना चाहते हैं। या बस एक स्थानीय चर में लोड करें।


सबसे आसान और सरल उपाय
जोओ पिमेंटेल फरेरा 20

9

प्रयोग करके देखें WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'

1
आप URL को एकल उद्धरणों में संलग्न करना चाहेंगे, जैसे? और क्वेरी भाग में शेल मेटाचैकर (एकल चार वाइल्डकार्ड + "पृष्ठभूमि में इस कमांड को चलाएं") हैं।
मार्क बी

7
यह काम करेगा, लेकिन एक चलने वाले वेब सर्वर की आवश्यकता है, और पूरी प्रक्रिया को आवश्यक की तुलना में थोड़ा अधिक अक्षम बनाता है।
ब्रैड

यह करता है, लेकिन आमतौर पर $_GETएक वेबसर्वर चल रहा है।
क्विकशिफ्टिन

6

- विकल्प 1: php-cgi -

अपनी स्क्रिप्ट चलाने के लिए 'php' के स्थान पर 'php-cgi' का उपयोग करें। यह सबसे सरल तरीका है क्योंकि आपको इसके साथ काम करने के लिए अपने php कोड को विशेष रूप से संशोधित करने की आवश्यकता नहीं होगी:

php-cgi -f /my/script/file.php a=1 b=2 c=3

- विकल्प 2: यदि आपके पास एक वेब सर्वर है -

यदि php फ़ाइल एक वेब सर्वर पर है, तो आप कमांड लाइन पर 'wget' का उपयोग कर सकते हैं:

wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'

या:

wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"

- चर में पहुँच php -

1 और 2 दोनों विकल्प में आप इन मापदंडों को इस तरह एक्सेस करते हैं:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];

2

आप पारित करने के लिए की जरूरत है $_GET, $_REQUEST, $_POST, या कुछ और आप भी पीएचपी इंटरैक्टिव मोड का उपयोग कर सकते हैं:

php -a

फिर टाइप करें:

<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");

यह मैन्युअल रूप से आपके इच्छित किसी भी चर को सेट करेगा और फिर उन चर सेट के साथ अपनी php फ़ाइल चलाएगा।


1

यदि आपके पास PHP स्क्रिप्ट को संपादित करने की संभावना है, तो आप स्क्रिप्ट की शुरुआत में निम्नलिखित कोड का उपयोग करके $ _GET सरणी को कृत्रिम रूप से आबाद कर सकते हैं और फिर स्क्रिप्ट को सिंटैक्स के साथ कॉल कर सकते हैं: php -f script.php name1=value1 name2=value2

// When invoking the script via CLI like "php -f script.php name1=value1 name2=value2", this code will populate $_GET variables called "name1" and "name2", so a script designed to be called by a web server will work even when called by CLI
if (php_sapi_name() == "cli") {
    for ($c = 1; $c < $argc; $c++) {
        $param = explode("=", $argv[$c], 2);
        $_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1'
    }
}

1

कमांड लाइन पर निम्नलिखित चिपकाएँ

export QUERY_STRING="param1=abc&param2=xyz" ;  
POST_STRING="name=John&lastname=Doe" ; php -e -r 
'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"], 
$_POST);  include "index.php";'

0

मैं उन्हें इस तरह से पास करता हूं:

php5 script.php param1=blabla param2=yadayada

ठीक काम करता है, $ _GET सरणी है:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}

अभी पता चला है कि यह मेरे होस्टिंग सर्वर पर काम करता है, लेकिन मेरे स्थानीय सर्वर पर नहीं।
आसफ

शायद स्थापित संस्करण में अंतर है? किस संस्करण ने आपके लिए यह काम किया और यह विफल रहा?
क्ज़कई

होस्टिंग पर php 5.2, काम करता है, 5.3 स्थानीय रूप से नहीं करता है ... इससे कोई फर्क नहीं पड़ता कि मैंने $ argv को वैसे ही किया है जब $ _GET खाली है
Asaf

-1

php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&b=2'

आप पहले भाग को उपनाम के रूप में बना सकते हैं:

alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'

तो बस का उपयोग करें:

php-get some_script.php 'a=1&b=2&c=3'


-2

या बस (यदि आपके पास LYNX है):

lynx 'http://localhost/index.php?a=1&b=2&c=3'

3
यह कमांड लाइन से PHP नहीं चलाता है। यह एक ब्राउज़र चलाता है जो कमांड लाइन के माध्यम से वेब सर्वर को आमंत्रित करता है।
एंड्रिया लज्जाज़ारो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.