Tôi biết PHP thường được sử dụng để phát triển web, trong đó có là 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 print
và echo
, đơ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
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);
?>
Bạn có thể sử dụng fopen()
trên php://stdin
:
$f = fopen('php://stdin', 'r');
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.
Đây phải là một chú thích –
Đọc từ STDIN là recommended way
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
Để tránh phải mess xung quanh với filehandles, sử dụng file_get_contents()
và 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.)
'file_get_contents' .... sẽ gây ra một vấn đề lớn như độ lớn của tệp. – Pacerier
Một phương pháp đơn giản là
$var = trim(fgets(STDIN));
Ngoài ra chúng ta có thể sử dụng '$ contents = file_get_contents (" php: // input ");' –
Grab nó tất cả trong một shot:
$contents = file_get_contents("php://stdin");
echo $contents;
này cũng hoạt động:
$data = stream_get_contents(STDIN);
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
- 1. Đầu vào thiết bị đầu cuối theo chuẩn Canonical và phi chuẩn tắc
- 2. Đọc một số nguyên từ đầu vào tiêu chuẩn
- 3. Chuyển hướng đầu vào chuẩn \ output trong Windows PowerShell
- 4. Kiểm tra đầu vào tiêu chuẩn trong C#
- 5. Phân tích cú pháp từ đầu vào tiêu chuẩn
- 6. Cách đọc từ dòng đầu vào chuẩn theo dòng?
- 7. Ngăn Ghostscript ghi các lỗi vào đầu ra tiêu chuẩn
- 8. perl Padre IDE chuẩn đầu vào không làm việc
- 9. Tại sao php: // cắt đầu vào?
- 10. Tôi có cần phải khử trùng đầu vào nếu sử dụng các truy vấn PHP/MySQL chuẩn bị không?
- 11. Đơn vị đầu vào và đầu ra tiêu chuẩn trong Fortran 90?
- 12. Cách chuyển hướng đầu vào và đầu ra tiêu chuẩn bằng Bash
- 13. Ranh giới biểu mẫu và ghi php: // đầu vào vào một tệp trong php
- 14. chuyển hướng đầu ra tiêu chuẩn bằng c sau đó đặt lại đầu ra tiêu chuẩn
- 15. Cách đọc ký tự không phải ASCII từ đầu vào tiêu chuẩn CLI
- 16. Báo cáo chuẩn bị PDO PHP
- 17. PHP thiết lập các giá trị đầu vào với isset
- 18. PHP để dọn dẹp dán đầu vào Microsoft
- 19. PHP sử dụng fwrite và fread với luồng đầu vào
- 20. PHP chờ cho đầu vào từ dòng lệnh
- 21. Cách chuẩn bị trang web php/mysql
- 22. PHP ::: chuẩn bị Báo cáo ::: freeresult() ::: close()
- 23. Đo điểm chuẩn trang PHP lần
- 24. PHP MySQLi multi_query chuẩn bị tuyên bố
- 25. Có tiêu chuẩn PHPCS nhắm mục tiêu vào tài liệu PHP không?
- 26. Cách tiêu chuẩn để loại bỏ không gian từ đầu vào trong cobol?
- 27. làm thế nào để đọc từ đầu vào tiêu chuẩn không chặn?
- 28. Bash - Cách chuyển đối số cho tập lệnh được đọc qua đầu vào tiêu chuẩn
- 29. Đọc một nhân vật từ đầu vào tiêu chuẩn tại Gò (mà không cần nhấn Enter)
- 30. Làm cách nào để cắt các đường được đọc từ đầu vào chuẩn trên bash?
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
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. –
@EricJ., Lạ thật, chuyện đó đã xảy ra như thế nào? Bạn đã 'fclose'' STDIN' chưa? – Pacerier