2009-02-16 32 views
44

Tôi biết PHP thường được sử dụng để phát triển web, trong đó có không có đầu vào tiêu chuẩn, nhưng PHP tuyên bố có thể sử dụng như ngôn ngữ kịch bản đa năng, nếu bạn tuân theo quy ước dựa trên web. Tôi biết rằng PHP in tới stdout (hoặc bất cứ điều gì bạn muốn gọi nó) với printecho, đơn giản, nhưng tôi tự hỏi làm thế nào một tập lệnh PHP có thể nhận đầu vào từ stdin (cụ thể với fgetc(), nhưng bất kỳ chức năng đầu vào nào là tốt), hoặc điều này thậm chí có thể?Đầu vào chuẩn PHP?

Trả lời

64

Có thể đọc stdin bằng cách tạo ra một tập tin xử lý để php://stdin và sau đó đọc từ nó với fgets() cho một dòng ví dụ (hoặc, như bạn đã tuyên bố, fgetc() cho một nhân vật duy nhất):

<?php 
$f = fopen('php://stdin', 'r'); 

while($line = fgets($f)) { 
    echo $line; 
} 

fclose($f); 
?> 
+21

Bạn cũng có thể sử dụng được xác định trước liên tục STDIN thay vì mở nó bằng tay: $ line = fgets (STDIN); – gix

+2

STDIN không hoạt động đối với tôi, nhưng 'php: // stdin', 'r' đã làm. Sử dụng PHP 5.2.9-2 (cli) (được xây dựng: ngày 9 tháng 4 năm 2009 08:23:19) trên Vista. –

+0

@EricJ., Lạ thật, chuyện đó đã xảy ra như thế nào? Bạn đã 'fclose'' STDIN' chưa? – Pacerier

8

Bạn có thể sử dụng fopen() trên php://stdin:

$f = fopen('php://stdin', 'r'); 
5

IIRC, bạn cũng có thể sử dụng như sau:

$in = fopen(STDIN, "r"); 
$out = fopen(STDOUT, "w"); 

Về mặt kỹ thuật giống nhau, nhưng tốt hơn một chút về cú pháp.

+1

Đây phải là một chú thích –

36

Đọc từ STDINrecommended way

<?php 
while (FALSE !== ($line = fgets(STDIN))) { 
    echo $line; 
} 
?> 
12

Để tránh phải mess xung quanh với filehandles, sử dụng file_get_contents()php://stdin:

$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");' 
Hello, World! 

(Nếu bạn đang đọc một lượng thực sự khổng lồ dữ liệu từ stdin bạn có thể muốn sử dụng phương pháp tiếp cận tệp, nhưng điều này sẽ tốt cho nhiều megabyte.)

+1

'file_get_contents' .... sẽ gây ra một vấn đề lớn như độ lớn của tệp. – Pacerier

11

Một phương pháp đơn giản là

$var = trim(fgets(STDIN)); 
+2

Ngoài ra chúng ta có thể sử dụng '$ contents = file_get_contents (" php: // input ");' –

5

Grab nó tất cả trong một shot:

$contents = file_get_contents("php://stdin"); 
echo $contents; 
2

này cũng hoạt động:

$data = stream_get_contents(STDIN); 
0

Khi sử dụng fgets, nó có thể cản trở trong kịch bản bash, nếu stdin không được đặt hoặc để trống, kể cả khi đang sử dụng @php error control operator.

#!/usr/bin/php 
<?php 
$pipe = @trim(fgets(STDIN)); 
// Script was called with an empty stdin 
// Fail to continue, php warning 

Hành vi này có thể tránh được bằng cách thiết lập stream_set_blocking vào tiêu đề php:

#!/usr/bin/php 
<?php 
stream_set_blocking(STDIN, 0); 
$pipe = @trim(fgets(STDIN)); 
// Script was called with an empty stdin 
// No errors or warnings, continue 
Các vấn đề liên quan