Làm cách nào để chuyển các biến $ _GET cho tập lệnh PHP thông qua dòng lệnh?


15

Tôi đang cố gắng tạo một máy chủ web phục vụ các tập lệnh PHP. Hiện tại, nó hoạt động như sau:

  1. Các yêu cầu khách hàng /index.php?test=value
  2. Máy chủ gọi php index.php
  3. Máy chủ cung cấp các tiêu đề yêu cầu HTTP dưới dạng STDIN cho quy trình PHP
  4. Máy chủ đọc đầu ra của phptừ STDOUT và trả về cho khách hàng

Tất cả điều này đang hoạt động ngoại trừ việc các tham số không được chuyển đến tập lệnh PHP vì:

var_dump($_GET);

trả về:

mảng (0) {}

Làm thế nào để $_GETcác tham số được truyền vào nhị phân PHP khi nó được gọi?


Máy chủ web nào? Bạn đã cấu hình máy chủ web như thế nào? Bạn đã cấu hình PHP như thế nào?
joschi

@jos: Đó là JetHTTP - một bản tôi tự viết.
Nathan Osman

Câu trả lời:


30

Bạn đang sử dụng nhị phân PHP nào? CLI hay CGI? Tôi nghi ngờ bạn cần một phiên bản CGI của nhị phân cho PHP để xử lý đúng cách chấp nhận các biến môi trường và dữ liệu POST nếu bạn vượt qua điều đó.

Các php-cgidụng cụ nhị phân giao diện CGI, cho phép bạn để vượt qua các thông số trên dòng lệnh:

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

Mà kết thúc trong $_GET:

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

Bạn có thể muốn đọc về cách CGI hoạt động để bạn có thể thực hiện điều đó trong máy chủ web của mình.

Tham chiếu: RFC3875


Phải ... chắc chắn rồi. Đó là vấn đề.
Nathan Osman

4

Theo Wikipedia , câu trả lời là đặt QUERY_STRINGbiến môi trường:

QUERY_STRING='user=foo&pass=bar&left=1234' php-cgi index.php

hoặc trong các bước riêng biệt:

export QUERY_STRING='user=foo&pass=bar&left=1234'
php-cgi index.php

Điều này hoạt động nếu bạn sử dụng php-cgilệnh, bởi vì đây là một phần của đặc tả CGI. Lệnh thông thường phpbỏ qua biến này, nhưng tập lệnh của bạn có thể sử dụng nó.


1

Nếu bạn vượt qua php script.php test = asdf

$result = parse_args($argv,$argc,$help);
print_r($result);

Nếu bạn chuyển nó cho STDIN, bạn sẽ cần đọc STDIN và tự phân tích các tiêu đề. REQUEST_URI sẽ chứa dữ liệu bạn cần và bạn có thể vượt qua điều đó.


Tôi cần các biến có sẵn $_GETgiống như khi PHP được sử dụng trong Apache.
Nathan Osman

Tất cả đều tốt và tốt cho đến khi có ai đó ghé thăm/index.php?test=asdf;rm%20-rf%20/
danlefree

@dan: Đừng lo lắng, máy chủ web của tôi đủ thông minh để xử lý việc đó.
Nathan Osman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.