За последние 24 часа нас посетили 17596 программистов и 1678 роботов. Сейчас ищут 1908 программистов ...

Ввод с консоли

Тема в разделе "Прочие вопросы по PHP", создана пользователем Raa, 16 сен 2006.

  1. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Есть консольный скрипт. Он постоянон запущен. Висит себе и работает. Но иногда хочется прервать его работу и ввести что-то ему прямо в консоли. Как это можно сделать?
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    смотрите исходник
    php/PEAR/go-pear.phar
     
  3. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Ti
    Не совсем понял, куда имеено смотреть. На stdin? Так вопрос не в том, как ввести, а в том, как прервать.
     
  4. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    понял ничего.
    управление скриптом-демоном из консоли?
     
  5. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Извиняюсь за свою безграмотность в терминологии, термин "демон" меня немного смущает. Если

    то не демон, но консольное приложение, работающее столь долго, сколько от него потребуется - т.е. до прерывания процесса пользователем.
     
  6. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Это корректное определение демона?

    http://prostohosting.com/infocenter/forAll/hosting_vocabulary.html

    Если да, то точно не демон, так как это CLI
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Raa

    открой сокет и слушай, а заходи на сокет телнетом?
     
  8. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Тоже вариант. Спасибо, в крайнем случае так и сделаю.

    Просто, когда у меня и так одна консоль висит, то зачем мне еще одна? Хочется не запускать еще что-то, а сказать как-то основному приложению, чтобы то почитало stdin. Т.е. тыркнуть в него чем-то, чтобы оно одуплилось. И чтобы вывод и ввод были в одном окне как история. Примерно вот так:

    PHP:
    1.  
    2. <?php
    3. while (true) {
    4.     doSemething();
    5.     printStatus();
    6.     $bInterruption = ...;
    7.     if ($bInterruption) {
    8.         echo "Да, сэр?\n";
    9.         $sCommand = fgets(STDIN, 1024);
    10.         echo "Слушаюсь, сэр!\n";
    11.         doCommand($sCommand);
    12.         echo "Готово, сэр!\n";
    13.     }
    14. }
    15. ?>
    16.  
    Проблема в переменной $bInterruption. Как установить ее, не прилагая лишних усилий :) И желательно не запуская других приложений.
     
  9. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    ЗЫ: Помню, в "сях" читал нажатую клавишу и по ней прерывался. Вот хотелось найти решение приблизительно такого уровня сложности :)
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Raa

    ну и выдай прилжению какой нить сигнал TERM1 что ли ...
     
  11. Anonymous

    Anonymous Guest

    Ну и тут так же сделай. Консольное приложение - оно и в африке консольное приложение...
     
  12. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    А можно с этого места поподробнее? :))) Как его выдать и как его получить?
     
  13. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Дык а как??? Не вижу я тут никаких функций для работы с клавиатурой.
     
  14. Anonymous

    Anonymous Guest

    А в С - они есть? у консольного приложения?
    Оно просто считывает входной поток stdin - если есть команды - обрабатывает, нет - дальше крутится....
    И PHP так же...
     
  15. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Есть, к примеру, в WinAPI функция: SHORT GetKeyState(int nVirtKey); Под юниксом, наверное, тоже есть - не знаю, не разбирался. А под PHP я никогда не видел никаких функций для работы склавиатурой. А stdin и клавиатура - это не одно и тоже, как вы понимаете.
     
  16. Anonymous

    Anonymous Guest

    - это функция win a не С, как вы понимаете.
    stdin - это клавиатура, это стандартный входной поток. stout - это тоже не монитор.
     
  17. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    По вызову freads(STDIN) приложение зависает и ждет окончания ввода, обозначаемого нажатием клавиши Enter
     
  18. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Горбунов Олег

    Что Вы мне пытаетесь объяснить? Вы меня учите, а на вопрос так и не ответили. Если знаете, как это сделать - прошу поделиться кодом. А чем отличается C от WinAPI и stdout от монитора, я тоже прекрасно понимаю. Вы пробовали читать из стандартного потока в консольном скрипте PHP так, чтобы не вызывать зависание?
     
  19. Anonymous

    Anonymous Guest

    Мы пытались обьяснить, что мы не особо поняли, что вам нужно. )
    Вопрос изначально стоило поставить как
    Ну да это не важно.))
    // Тоже ушел страдать stdin в PHP....
     
  20. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    А мы вот как раз и пытались объяснить так, чтобы это стало понятно не только нам одним :))))))

    Так я специально не ставил вопрос таким образом, дабы не зацикливаться на stdin. Дело в том, что я и не пробовал делать это стдином, потому как подозревал о такой "проблеме", потому что std::in в С++ тоже останавливал выполнение. Теперь попробовал и убедился. Потому-то я и поставил впрос так как поставил, потому что не знаю: может в PHP есть какие-то средства или способы обработать нажатие кнопки или другой другого лего намека пользователя на то что ему хочется пообщатсья с приложением.

    Есть функция хорошая stream_set_timeout() - для STDIN она @ не работает :-(
     
  21. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Я имею в виду библиотеку iostream :)
     
  22. Anonymous

    Anonymous Guest

    Ув. Raa! Не нашли ответа на свой вопрос?
    Мелькнула мыслишка....
     
  23. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Не-а. Пока ничего умного в голову не пришло.

    Мелькнула - рассказывай :) Чрезвычайно любопытно :)
     
  24. Anonymous

    Anonymous Guest

    а stream_set_blocking() - на эти потоки распостраняется?
    или через stream_select() -?
     
  25. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    можно завести переменную откружения, если я правильно понимаю, что требуется)
    ну и дальше понятно.