PHP ส่งผ่าน $ _GET ในพรอมต์คำสั่ง linux


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ตัวแปรส่วนกลางหรือgetopt :

// 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
มันน่าสังเกตว่าใน Centos 6 เครื่องของเราใช้ PHP 5.3 เรียกphp [script name] "a=1&b=2&c=3"จะไม่เติมแต่คุณสามารถส่งผลกระทบต่อสิ่งเดียวกันโดยอ้างอิง$_SERVER['QUERY_STRING'] $_SERVER['argv'][1]
Eric L.

4
ลองใช้คำตอบนี้เพื่อเติมข้อมูลสตริงการสืบค้นจากบรรทัดคำสั่งโดยไม่ต้องแก้ไขสคริปต์ PHP
qris

นี่ไม่ใช่คำตอบที่ดีที่สุด ดูคำตอบอื่น ๆ ในหน้านี้: stackoverflow.com/a/11965479/543738
LS

คำตอบที่เป็นประโยชน์แม้ว่าคุณจะสงสัยว่าโคลอนเหล่านั้นคืออะไรหลังจากชื่ออาร์กิวเมนต์getopt()แต่สิ่งนี้จะบอก PHP ว่าคุณต้องการอาร์กิวเมนต์ fไม่ใช่ตัวเลือก f (ซึ่งจะระบุลบด้วยเครื่องหมายจุดคู่) มันก็แค่ไวยากรณ์
Mitya

ฉันชอบคำตอบสุดท้ายมากและฉันใช้มันเมื่อวานนี้ สามารถเปลี่ยนเป็นสคริปต์ได้เช่นกัน
Reinierpost

239

จากคำตอบนี้บน ServerFault :

ใช้php-cgiไบนารีแทน just 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
micha

2
ยอดเยี่ยมสิ่งนี้สามารถรวมเข้ากับสคริปต์ที่ขึ้นอยู่กับระบบปฏิบัติการได้อย่างง่ายดาย
Sebastian

2
+1 วิธีแก้ปัญหาที่ยอดเยี่ยมตอนนี้ฉันกำลังสำรองสคริปต์ CLI ทั้งหมดของฉันเพื่อรองรับสิ่งนี้ในตอนนี้;)
ehime

ข้อเสียเพียงอย่างเดียวที่ฉันเคยเห็นคือเอาต์พุตเทอร์มินัลคือ HTML ที่มี <br /> แทนที่จะเป็นแค่ \ n สิ่งนี้ใช้กับประกาศและข้อผิดพลาดทั้งหมดเช่น<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca

+1 สุดยอดใช้งานได้ในสคริปต์ปกติ $ _GET Value For Ex as: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Works Good ..
Ajmal Praveen

16

ฉันไม่มี php-cgi ไบนารีบน Ubuntu ดังนั้นฉันจึงทำสิ่งนี้:

% alias php-cgi = "php -r '"' parse_str (ระเบิด ("&", array_slice ($ argv, 2)), $ _GET); รวม ($ argv [1]); '"' -"
% php-cgi test1.php foo = 123
<html>
คุณตั้งค่า foo เป็น 123
</ html>

% cat test1.php
<html> คุณตั้งค่า foo เป็น <? php print $ _GET ['foo']?> </html>

ดูเหมือนวิธี php ในการแก้ไขพนักงาน
FelikZ

14

บางครั้งคุณไม่มีตัวเลือกในการแก้ไขไฟล์ php เพื่อตั้งค่า $ _GET เป็นพารามิเตอร์ที่ส่งผ่านและบางครั้งคุณไม่สามารถหรือไม่ต้องการติดตั้ง php-cgi

ฉันพบว่านี่เป็นทางออกที่ดีที่สุดสำหรับกรณีนั้น:

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

วิธีนี้หลีกเลี่ยงการแก้ไขไฟล์ php ของคุณและให้คุณใช้คำสั่ง php ธรรมดา หากคุณติดตั้ง php-cgi แล้วให้ใช้สิ่งนั้น แต่นี่เป็นสิ่งที่ดีที่สุดถัดไป คิดว่าตัวเลือกนี้ควรค่าแก่การกล่าวถึง

-r หมายถึงรันโค้ด php ในสตริงต่อไปนี้ คุณตั้งค่า $ _GET ด้วยตนเองที่นั่นจากนั้นอ้างอิงไฟล์ที่คุณต้องการเรียกใช้

เป็นที่น่าสังเกตว่าคุณควรเรียกใช้สิ่งนี้ในโฟลเดอร์ที่ถูกต้องซึ่งมักจะไม่ใช่โฟลเดอร์ที่มีไฟล์ php เสมอไปคำสั่งที่ต้องการจะใช้ตำแหน่งของคำสั่งของคุณเพื่อแก้ไข URL ที่เกี่ยวข้องไม่ใช่ตำแหน่งของไฟล์


1
ฉันอยากจะขอบคุณสำหรับการแก้ปัญหานี้ สำหรับความคิดเห็นของฉันนี่ควรเป็นคำตอบที่ยอมรับได้ คุณไม่จำเป็นต้องติดตั้งไลบรารีเพิ่มเติมเพื่อใช้งาน
swordsecurity

นี่เป็นวิธีที่ดีกว่าคำตอบที่ยอมรับ โหวตให้คุณ!
faraday703

ทางออกที่น่ากลัวและง่าย!
derRobert

คำตอบที่ยอดเยี่ยม คุณไม่มีเครื่องหมายคำพูดปิดท้ายในโค้ดของคุณ :)
Pedro Araujo Jorge

10
php file_name.php var1 var2 varN

จากนั้นตั้งค่า$_GETตัวแปรของคุณในบรรทัดแรกของคุณใน PHP แม้ว่านี่จะไม่ใช่วิธีที่ต้องการในการตั้งค่า$_GETตัวแปรและคุณอาจประสบปัญหาขึ้นอยู่กับสิ่งที่คุณทำในภายหลังกับตัวแปรนั้น

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

ตัวแปรที่คุณเรียกใช้สคริปต์ด้วยจะสามารถเข้าถึงได้จาก$argvอาร์เรย์ในแอป PHP ของคุณ รายการแรกจะเป็นชื่อของสคริปต์ที่มาจากดังนั้นคุณอาจต้องการarray_shift($argv)วางรายการแรกนั้นหากคุณต้องการประมวลผลตัวแปรจำนวนมาก หรือเพียงแค่โหลดลงในตัวแปรท้องถิ่น


วิธีแก้ปัญหาที่ง่ายและง่ายที่สุด
João Pimentel Ferreira

9

ลองใช้WGET:

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

1
คุณต้องการใส่ URL ในเครื่องหมายคำพูดเดี่ยวเป็น? และ & ในส่วนของคิวรีคือเมตาอักขระเชลล์ (อักขระตัวแทนเดียว + "รันคำสั่งนี้ในพื้นหลัง")
Marc B

7
สิ่งนี้จะได้ผล แต่ต้องใช้เว็บเซิร์ฟเวอร์ที่ทำงานอยู่และทำให้กระบวนการทั้งหมดไม่มีประสิทธิภาพมากกว่าที่ต้องการ
Brad

มันเป็น แต่โดยทั่วไป$_GETหมายถึงเว็บเซิร์ฟเวอร์ที่ทำงานอยู่
quickshiftin

6

- ตัวเลือกที่ 1: php-cgi -

ใช้ 'php-cgi' แทน 'php' เพื่อเรียกใช้สคริปต์ของคุณ นี่เป็นวิธีที่ง่ายที่สุดเนื่องจากคุณไม่จำเป็นต้องแก้ไขโค้ด 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:

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"
}

เพิ่งพบว่าสิ่งนี้ใช้ได้กับเซิร์ฟเวอร์โฮสติ้งของฉัน แต่ไม่ใช่บนเซิร์ฟเวอร์ภายในของฉันนอกลู่นอกทาง
Asaf

อาจจะมีความแตกต่างในเวอร์ชันที่ติดตั้ง? เวอร์ชันใดใช้งานได้กับคุณและเวอร์ชันใดที่ล้มเหลว
Kzqai

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 จากบรรทัดคำสั่ง สิ่งนี้เรียกใช้เบราว์เซอร์ที่เรียกใช้เว็บเซิร์ฟเวอร์ผ่านทางบรรทัดคำสั่ง
Andrea Lazzarotto
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.