2010-10-27 28 views
5

Cập nhật:Làm cách nào để chuyển dữ liệu POST tới PHP-CGI?

Trong một cơn tuyệt vọng, tôi đã làm như sau trong một vỏ:

REDIRECT_STATUS=true 
SCRIPT_FILENAME=/var/www/... 
REQUEST_METHOD=POST 
GATEWAY_INTERFACE=CGI/1.1 
export REDIRECT_STATUS 
export SCRIPT_FILENAME 
export REQUEST_METHOD 
export GATEWAY_INTERFACE 
echo "test=1" | php-cgi 

... và VẪN không $_POST biến được hiển thị trong kết quả của việc này:

<?php var_dump($_POST); ?> 

Tôi đang cố tạo một máy chủ web nhỏ có giao diện với php-cgi nhị phân. Tuy nhiên, mọi thứ sẽ không tốt lắm. Mã nhị phân php-cgi xử lý chính xác các yêu cầu GET. Khi nói đến các yêu cầu POST, mảng $_POST bị trống, ngay cả khi mọi thứ đang được POST.

Tôi đã kiểm tra các tiêu đề HTTP được đưa vào mã nhị phân php-cgi và chúng thực sự bao gồm dữ liệu POST và tiêu đề Content-type: application/x-www-form-urlencoded.

Điều gì có thể giữ mã nhị phân php-cgi khi thấy có dữ liệu POST được bao gồm trong yêu cầu?


tôi tiến bộ, tôi đã đào lên một số nội dung từ PHP source code:

  • /sapi/cgi/cgi_main.c:

    468: static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)

(. Tôi không có ý tưởng mà chức năng này được gọi từ)


Sau khi đọc câu trả lời dưới đây, tôi đã cố gắng:

<?php 

var_dump($HTTP_RAW_POST_DATA); 

?> 

... mà mang lại kết quả:

NULL 

... chỉ ra rằng một điều gì đó thậm chí còn xa lạ hơn là ở nơi làm việc ở đây.


tôi nhận được gần gũi hơn ... Tôi tìm thấy chức năng này trong /main/php_content_types.c:

SAPI_API SAPI_POST_READER_FUNC (php_default_post_reader)

... và nó có vẻ là mã mà xử lý các yêu cầu POST.

+0

Thời gian để chọn thông qua nguồn PHP: P –

+1

Tôi không có câu trả lời, nhưng dữ liệu POST phải đến bằng thông qua stdin. –

+0

Máy chủ web của bạn có thực hiện đúng đặc điểm kỹ thuật CGI 1.1 không? – joschi

Trả lời

4

tôi cuối cùng figured it out:

Rõ ràng các biến môi trường CONTENT_LENGTH cần phải được thiết lập.

Thêm:

CONTENT_LENGTH=6 
export CONTENT_LENGTH 

lại ví dụ của tôi ở trên làm cho nó hoạt động đúng!

+0

Bạn cũng nên đặt Nội dung ở mức tối thiểu - về cơ bản, tất cả những thứ HTTP bạn đang cố gắng vào stdin trong phiên bản trước của kịch bản lệnh shell cần phải được đặt làm biến môi trường trước khi bắt đầu CGI. Ồ, và bạn nên đánh dấu câu trả lời này là "được chấp nhận" :) – TML

+0

@TML: Đúng - Tôi đã thêm 'Loại nội dung' ngay bây giờ khi nó hoạt động. Tôi không thể chấp nhận điều này cho đến 24 giờ sau khi tôi đăng nó. (IIRC) –

0

Thử kiểm tra biến $ HTTP_RAW_POST_DATA.

http://php.net/manual/en/reserved.variables.httprawpostdata.php

+0

Nó xuất hiện dưới dạng 'NULL'. Tại sao nó làm điều đó? –

+0

Bởi vì $ HTTP_RAW_POST_DATA là một giải pháp khủng khiếp - file_get_contents ('php: // input') là tốt hơn, nhưng sẽ không hoạt động với dữ liệu được mã hóa đa dạng/dữ liệu biểu mẫu. – TML

+0

Đọc thêm về những khác biệt tại http://us3.php.net/manual/en/wrappers.php.php – TML

2

Bạn đã đề cập rằng hệ thống của bạn đã NHẬN tốt. chiều dài nội dung chỉ cần được đặt cho POSTs

Điều này cũng có thể hữu ích, đó là đặc điểm kỹ thuật CGI/1.1. Nó cho thấy những gì biến môi trường cần phải được thiết lập:

http://graphcomp.com/info/specs/cgi11.html và lib.ru/WEBMASTER/cgi1_1spec/interface.html này

các biến môi trường tối thiểu mà bạn cần để có được yêu cầu GET làm việc là gì?

+0

SCRIPT_FILENAME, REQUEST_METHOD và REDIRECT_STATUS. –

+0

REDIRECT_STATUS không bắt buộc nếu bạn có cgi.force_redirect = 0 trong tệp php.ini của mình. Tôi đã thử thêm nó và SCRIPT_FILENAME và nó vẫn không hoạt động –

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