PHP mengirimkan $ _GET dalam command prompt linux

125

Katakanlah kita biasanya mengakses via

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

Bagaimana kita menjalankan yang sama di command prompt linux?

php -e index.php

Tetapi bagaimana dengan meneruskan variabel $ _GET? Mungkin sesuatu seperti php -e index.php --a 1 --b 2 --c 3? Keraguan itu akan berhasil.

Terima kasih!

Patrick
sumber

Jawaban:

122

Biasanya, untuk meneruskan argumen ke skrip baris perintah, Anda akan menggunakan argvvariabel global atau 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 merujuk ke parameter metode HTTP GET, yang tidak tersedia di baris perintah, karena mereka membutuhkan server web untuk diisi.

Jika Anda benar-benar ingin mengisi $ _GET, Anda dapat melakukan ini:

// 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
     )
*/

Anda juga dapat menjalankan skrip yang diberikan, mengisi $_GETdari baris perintah, tanpa harus mengubah skrip tersebut:

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

Perhatikan bahwa Anda dapat melakukan hal yang sama dengan $_POSTdan $_COOKIEjuga.

netcoder
sumber
1
Perlu dicatat bahwa, pada mesin Centos 6 kami yang menjalankan PHP 5.3, panggilan php [script name] "a=1&b=2&c=3"tidak akan mengisi $_SERVER['QUERY_STRING'], tetapi Anda dapat dengan mudah mempengaruhi hal yang sama dengan merujuk $_SERVER['argv'][1].
Eric L.
4
Coba jawaban ini untuk mengisi string kueri dari baris perintah tanpa memodifikasi skrip PHP.
qris
Ini bukan jawaban terbaik. Lihat jawaban lain ini di halaman ini: stackoverflow.com/a/11965479/543738
LS
Jawaban yang membantu, meskipun jika seperti saya Anda bertanya-tanya dalam urutan dua setelah nama argumen getopt(), ini memberi tahu PHP bahwa Anda menginginkan argumen f , bukan opsi f (yang akan ditentukan dikurangi titik dua). Jadi itu hanya sintaks.
Mitya
Saya sangat menyukai jawaban terakhir, dan saya menggunakannya kemarin. Itu bisa diubah menjadi skrip juga.
reinierpost
239

Dari jawaban ini di ServerFault :

Gunakan php-cgibiner alih-alih adil php, dan berikan argumen pada baris perintah, seperti ini:

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

Yang menempatkan ini dalam $_GET:

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

Anda juga dapat mengatur variabel lingkungan yang akan ditetapkan oleh server web, seperti ini:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
qris
sumber
10
+1 dan +1: Jawaban ini seharusnya merupakan jawaban yang diterima. Jauh lebih mudah! Tidak perlu mengubah sumber php.
micha
2
Luar biasa, ini bisa dengan mudah dibungkus dengan skrip yang tergantung pada OS.
Sebastian
2
+1, solusi hebat, saya saat ini mendukung semua skrip CLI saya untuk mendukung ini sekarang;)
ehime
Satu-satunya downside yang saya lihat sejauh ini adalah bahwa keluaran terminal adalah HTML dengan <br /> bukan hanya \ n. Ini berlaku untuk semua pemberitahuan dan kesalahan juga, misalnya<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca
+1 Luar Biasa, Ini berfungsi dalam Skrip Normal $ _GET Nilai Untuk Ex sebagai: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Bekerja Baik ..
Ajmal Praveen
16

Saya tidak memiliki biner php-cgi di Ubuntu, jadi saya melakukan ini:

% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); termasuk ($ argv [1]); '"' -"
% php-cgi test1.php foo = 123
<html>
Anda mengatur foo ke 123.
</html>

% cat test1.php
<html> Anda menyetel foo ke <? php print $ _GET ['foo']?>. </html>
Tim Booth
sumber
Sepertinya cara php untuk memperbaiki staf.
FelikZ
14

Terkadang Anda tidak memiliki opsi untuk mengedit file php untuk menetapkan $ _GET ke parameter yang diteruskan, dan kadang-kadang Anda tidak bisa atau tidak ingin menginstal php-cgi.

Saya menemukan ini menjadi solusi terbaik untuk kasus itu:

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

Ini menghindari mengubah file php Anda dan memungkinkan Anda menggunakan perintah php biasa. Jika Anda telah menginstal php-cgi, tentu saja gunakan itu, tetapi ini adalah hal terbaik berikutnya. Pikir opsi ini layak disebutkan

-r berarti menjalankan kode php dalam string berikut. Anda menetapkan nilai $ _GET secara manual di sana, dan kemudian merujuk file yang ingin Anda jalankan.

Perlu dicatat bahwa Anda harus menjalankan ini di folder kanan, sering tetapi tidak selalu folder di mana file php berada. Membutuhkan pernyataan akan menggunakan lokasi perintah Anda untuk menyelesaikan url relatif, BUKAN lokasi file

derrick the white
sumber
1
Saya ingin mengucapkan terima kasih atas solusi ini. Menurut pendapat saya ini harus menjadi jawaban yang diterima. Anda tidak perlu menginstal perpustakaan tambahan untuk menggunakannya.
swordsecurity
Ini jauh lebih baik daripada jawaban yang diterima. Suara positif untuk Anda!
faraday703
solusi awsome dan mudah!
derRobert
Jawaban yang luar biasa. Anda baru saja melewatkan penawaran akhir dalam kode Anda :)
Pedro Araujo Jorge
10
php file_name.php var1 var2 varN

Kemudian atur $_GETvariabel Anda di baris pertama Anda di PHP, meskipun ini bukan cara yang diinginkan untuk mengatur $_GETvariabel dan Anda mungkin mengalami masalah tergantung pada apa yang Anda lakukan nanti dengan variabel itu.

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

variabel yang Anda luncurkan skrip akan dapat diakses dari $argvarray di aplikasi PHP Anda. entri pertama adalah nama skrip asal mereka, jadi Anda mungkin ingin melakukan array_shift($argv)untuk menghapus entri pertama itu jika Anda ingin memproses banyak variabel. Atau hanya memuat ke variabel lokal.

T. Brian Jones
sumber
solusi termudah dan sederhana
João Pimentel Ferreira
9

Coba gunakan WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Giuseppe Accaputo
sumber
1
Anda ingin melampirkan URL dalam tanda kutip tunggal, sebagai? dan & di bagian permintaan adalah karakter meta shell (wildcard char tunggal + "jalankan perintah ini di latar belakang").
Marc B
7
Ini akan bekerja, tetapi membutuhkan server web yang sedang berjalan, dan membuat seluruh proses sedikit lebih tidak efisien daripada yang dibutuhkan.
Brad
Ya, tetapi biasanya $_GETmenyiratkan server web yang berjalan.
quickshiftin
6

- Opsi 1: php-cgi -

Gunakan 'php-cgi' sebagai pengganti 'php' untuk menjalankan skrip Anda. Ini adalah cara paling sederhana karena Anda tidak perlu memodifikasi kode php khusus untuk bekerja dengannya:

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

- Opsi 2: jika Anda memiliki server web -

Jika file php ada di server web, Anda dapat menggunakan 'wget' di baris perintah:

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

ATAU:

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

- Mengakses variabel dalam php -

Di kedua opsi 1 & 2 Anda mengakses parameter ini seperti ini:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Benteng pertahanan
sumber
2

Jika Anda harus lulus $_GET, $_REQUEST, $_POST, atau apa pun yang Anda bisa juga menggunakan modus interaktif PHP:

php -a

Kemudian ketik:

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

Ini akan secara manual mengatur variabel yang Anda inginkan dan kemudian menjalankan file php Anda dengan variabel-variabel yang ditetapkan.

makman99
sumber
1

Jika Anda memiliki kemungkinan untuk mengedit skrip PHP, Anda dapat secara artifisial mengisi array $ _GET menggunakan kode berikut di awal skrip dan kemudian memanggil skrip dengan sintaks: 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'
    }
}
lucaferrario
sumber
1

Pada baris perintah tempel berikut ini

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";'
Jimmy Moran
sumber
0

Saya hanya melewati mereka seperti ini:

php5 script.php param1=blabla param2=yadayada

berfungsi dengan baik, array $ _GET adalah:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}
Asaf
sumber
baru tahu ini berfungsi di server hosting saya, tetapi tidak di server lokal saya, aneh.
Asaf
Mungkin ada perbedaan dalam versi yang diinstal? Versi apa yang cocok untuk Anda, dan versi mana yang gagal?
Kzqai
php 5.2 tentang hosting, bekerja, 5.3 lokal tidak ... tidak masalah saya melakukannya dengan cara $ argv kalau-kalau $ _GET kosong
Asaf
-1

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

Anda bisa menjadikan bagian pertama sebagai alias:

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

maka cukup gunakan:

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

meong
sumber
-2

atau hanya (jika Anda memiliki LYNX):

lynx 'http://localhost/index.php?a=1&b=2&c=3'
quardas
sumber
3
Ini tidak menjalankan PHP dari baris perintah. Ini menjalankan browser yang memanggil server web melalui baris perintah.
Andrea Lazzarotto