Я знаю, что PHP обычно используется для веб-разработки, где нет стандартного ввода, но PHP утверждает, что он может использоваться в качестве языка сценариев общего назначения, если вы следуете его фанковым веб-соглашениям. Я знаю, что PHP печатает до stdout
(или того, что вы хотите назвать) с print
и echo
, что достаточно просто, но мне интересно, как PHP-скрипт может получить ввод от stdin
(в частности, с помощью fgetc()
, но любая функция ввода хорошо), или это даже возможно?PHP стандартный ввод?
ответ
можно прочитать stdin
, создав дескриптор файла php://stdin
, а затем читать из него с fgets()
для линии, например (или, как вы уже заявил, что fgetc()
для одного символа):
<?php
$f = fopen('php://stdin', 'r');
while($line = fgets($f)) {
echo $line;
}
fclose($f);
?>
Вы можете использовать fopen()
на php://stdin
:
$f = fopen('php://stdin', 'r');
IIRC, вы можете также использовать следующие:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
Технически то же самое, но немного чище синтаксиса.
Это должен быть комментарий –
Чтение из STDIN является recommended way
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
Чтобы избежать необходимости возиться с дескрипторов файлов, используйте file_get_contents()
и php://stdin
:
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
(Если вы читаете по-настоящему огромное количество данные от stdin
, вы можете использовать подход filehandle, но это должно быть хорошо для многих мегабайт.)
'file_get_contents' .... даст такую же огромную проблему, как и огромность файла. – Pacerier
Простой метод
$var = trim(fgets(STDIN));
Также мы можем использовать '$ contents = file_get_contents (" php: // input ");' –
захватить все это в одном кадре:
$contents = file_get_contents("php://stdin");
echo $contents;
Это также работает:
$data = stream_get_contents(STDIN);
При использовании fgets, он может блокировать в Баш сценариев, если stdin
не установлен или не пуст, в том числе при использовании @
php error control operator.
#!/usr/bin/php
<?php
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// Fail to continue, php warning
Такое поведение можно избежать, установив stream_set_blocking
на 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. Как завершить стандартный ввод?
- 2. Невозможно перенаправить стандартный ввод
- 3. пытаясь понять стандартный ввод, стандартный вывод
- 4. Как очистить стандартный ввод (термин)
- 5. Проверяется вход стандартный ввод - IStream
- 6. Как читать стандартный ввод непрерывно?
- 7. Linux команда клейстер стандартный ввод
- 8. Как очистить стандартный ввод процесса?
- 9. Сокат блокировки на стандартный ввод
- 10. CLion стандартный ввод при отладке
- 11. Nemiver - Невозможно направить стандартный ввод
- 12. Использовать стандартный ввод в shellscript
- 13. Python - программа перестает читать стандартный ввод
- 14. Как печатать на стандартный ввод из пользовательского плагина WordPress PHP?
- 15. Linux: стандартный вывод одной программы на стандартный ввод другой программы
- 16. Управление стандартный вывод и стандартный ввод в IPython ноутбук
- 17. Перенаправление стандартный вывод и стандартный ввод в файл
- 18. с стандартный вывод в стандартный ввод в реальном времени
- 19. Переадресовка стандартный ввод и стандартный вывод из C
- 20. Ввод ввода через стандартный ввод-вывод в многопоточном приложении
- 21. стандартный вводный поток cin, не запрашивающий ввод
- 22. Связь через стандартный ввод/вывод в Java
- 23. Perl стандартный ввод с аргументом внутри Bash
- 24. Как читать файл PPM в стандартный ввод
- 25. Стандартный ввод C: Неверная строка, если $ присутствует
- 26. консоль приложение не хочет читать стандартный ввод
- 27. Введите стандартный ввод для значений карты
- 28. Баш: перенаправлять стандартный ввод в файл
- 29. Стандартный ввод в C++ с моим контуром
- 30. Perl Padre IDE стандартный ввод не работает
Вы можете также использовать предопределенный постоянный STDIN, а не открывать его вручную: $ строки = fgets (STDIN); – gix
STDIN не работал для меня, но «php: // stdin», «r». Использование PHP 5.2.9-2 (cli) (построено: 9 апреля 2009 г. 08:23:19) в Vista. –
@EricJ., Странно, как это случилось? Вы 'fclose'' STDIN'? – Pacerier