2013-06-20 33 views
6

Khi bạn chạy một kịch bản PHP thông qua một trình duyệt nó trông giống nhưGửi thông số yêu cầu khi gọi một kịch bản PHP thông qua dòng lệnh

http://somewebsite.com/yourscript?param1=val1&param2=val2. 

Tôi cố gắng để đạt được điều tương thông qua dòng lệnh mà không cần phải viết lại tập lệnh để chấp nhận argv thay vì $_REQUEST. Có cách nào để làm điều gì đó như thế này không:

php yourscript.php?param1=val1&param2=val2 

sao cho thông số bạn gửi hiển thị trong biến số $_REQUEST?

Trả lời

5

Không, không có cách nào dễ dàng để đạt được điều đó. Máy chủ web sẽ chia chuỗi yêu cầu và chuyển nó vào trình thông dịch PHP, sau đó sẽ lưu trữ nó trong mảng $_REQUEST.

Nếu bạn chạy từ dòng lệnh và bạn muốn chấp nhận các thông số tương tự, bạn sẽ phải phân tích cú pháp chúng. Dòng lệnh có cú pháp hoàn toàn khác với các tham số truyền qua HTTP. Bạn có thể muốn xem xét getopt.

Đối với một cách tiếp cận sức mạnh vũ phu mà không mất lỗi người dùng vào tài khoản, bạn có thể thử đoạn này:

<?php 
foreach($argv as $argument) { 
     if($argument == $argv[ 0 ]) continue; 

     $pair = explode("=", $argument); 
     $variableName = substr($pair[ 0 ], 2); 
     $variableValue = $pair[ 1 ]; 
     echo $variableName . " = " . $variableValue . "\n"; 
     // Optionally store the variable in $_REQUEST 
     $_REQUEST[ $variableName ] = $variableValue; 
} 

Sử dụng nó như thế này:

$ php test.php --param1=val1 --param2=val2 
param1 = val1 
param2 = val2 
+0

Cảm ơn, tôi đã làm điều gì đó tương tự và nó hoạt động tốt. – emilyk

12

Trong trường hợp bạn không muốn thay đổi kịch bản đang chạy, bạn có thể chỉ định tham số bằng tham số -B để chỉ định mã để chạy trước tệp đầu vào. Nhưng trong trường hợp này, bạn cũng phải thêm thẻ -F để xác định tập tin đầu vào của bạn:

php -B "\$_REQUEST = array('param1' => 'val1', 'param2' => 'val2');" -F yourscript.php 
+1

$ cần phải được thoát, nếu không shell của bạn sẽ thay thế $ _REQUEST, có thể cho một chuỗi rỗng và đưa ra lỗi: Lỗi phân tích cú pháp PHP: lỗi cú pháp, bất ngờ '=' trong dòng lệnh bắt đầu mã trên dòng 1 – steveayre

+0

Không hoạt động thoát khỏi $. Điều này có nghĩa là: 'php -B" \ $ _ REQUEST = mảng ('param1' => 'val1', 'param2' => 'val2'); " -F yourscript.php' – Noam

0

tôi đã viết một hàm ngắn để xử lý tình trạng này - nếu đối số dòng lệnh có mặt và mảng $ _REQUEST là rỗng (tức là , khi bạn đang chạy một kịch bản từ dòng lệnh thay vì mặc dù một giao diện web), có vẻ cho các đối số dòng lệnh trong cặp = giá trị quan trọng,

Argv2Request($argv); 

print_r($_REQUEST); 

function Argv2Request($argv) { 
    /* 
     When $_REQUEST is empty and $argv is defined, 
     interpret $argv[1]...$argv[n] as key => value pairs 
     and load them into the $_REQUEST array 

     This allows the php command line to subsitute for GET/POST values, e.g. 
     php script.php animal=fish color=red number=1 has_car=true has_star=false 
    */ 


    if ($argv !== NULL && sizeof($_REQUEST) == 0) { 
     $argv0 = array_shift($argv); // first arg is different and is not needed 

     foreach ($argv as $pair) { 
      list ($k, $v) = split("=", $pair); 
      $_REQUEST[$k] = $v; 
     } 
    } 
} 

đầu vào mẫu gợi ý trong bình luận của chức năng là:

php script.php animal=fish color=red number=1 has_car=true has_star=false 

trong đó sản lượng đầu ra:

Array 
(
    [animal] => fish 
    [color] => red 
    [number] => 1 
    [has_car] => true 
    [has_star] => false 
) 
1

Tôi không thể lấy tín dụng cho điều này nhưng tôi chấp nhận này trong file bootstrap của tôi:

// Concatenate and parse string into $_REQUEST 
if (php_sapi_name() === 'cli') { 
    parse_str(implode('&', array_slice($argv, 1)), $_REQUEST); 
} 

Sau khi thực hiện một file PHP từ dòng lệnh:

php yourscript.php param1=val1 param2=val2 

Ở trên sẽ chèn khóa và giá trị vào $ _REQUEST để truy xuất sau.

Các vấn đề liên quan