Есть ли ф-я, возвращающая код клавиши или false, если ничего не нажато?

ColoneL

Новичок
Есть ли ф-я, возвращающая код клавиши или false, если ничего не нажато?

Перепробовал целую кучу: readln, fegts, fgetc. Пробовал читать из stdin - все работает, но с одним исключением - функции ждут нажатия enter или хотя бы на клавишу. И пока не получат хотя бы символ, прога замирает.

Но это не подходит - нужно опросить буфер, и получить очередную клавишу, или false если ничего нет. Пробовал предварительно определить размер stdin и опрашивать клавиатуру если его размер больше нуля, но получить его размер не удается.

Есть ли стандартное решение?

Спасибо.
 

deepslam

Новичок
так php - серверный язык
в нем невозможно узнать какую клавишу пользователь на клавиатуре нажал, можешь использовать Ajax для передачи значения в PHP
 

ColoneL

Новичок
Ситуация следующая - на PHP написана некоторая прога, которая крутится на сервере. Скажем так - собирает статистику и к HTTP запросам не имеет никакого отношения. Т.е. крутится постоянно.

И ей нужно иногда определять чего от нее хочет администратор, подходящий и тыкающий в клавиатуру пальцами.
 

uliss

Новичок
Что вы так накинулись на парня - он про консоль спрашивал
Это зависит от настроек терминала, а не от php.
man stty
особенно про аргумент raw

грубый пример:
файл tty.php
PHP:
$cmds = array(
        'e' => 'edit',
        'd' => 'delete',
        'q' => 'quit'
);

$fd = fopen("/dev/tty", "r");
$chr = '';
while(($chr = fgetc($fd)) !== false){
        if(isset($cmds[$chr])){
                echo $cmds[$chr]."\r\n";
                if($chr == 'q')
                        exit;
        }
        else
                echo "Unknown command: $chr\r\n";
}
запускать так:
stty raw -echo ; php tty.php ; stty -raw echo

Вообще stty raw не самая лучшая идея, т.к. программа не реагирует на Crtl+D - смотри другие флаги (нкжно подобрать нужную для тебя комбинацию)
 

ColoneL

Новичок
uliss, hermit_refined спасибо, попробую. Но ваши примеры заточены под Линукс. А у меня нет пока информации на какой платформе будут работать консольное приложение.

Кто нибудь знает, как это реализовать под Windows?

ps библиотека nurses по докам реализована для всех, кроме Windows.
 

Фанат

oncle terrible
Команда форума
а чо - проверять флаг уже не модно?
самый примитивный способ, который приходит в голову: оператор тыкает в шелловый скрипт, который создаёт в нужном каталоге нужный файл, и прога его читает
 

ColoneL

Новичок
Может я чего-то не корректно объясняю, тогда начну сначала :)

Есть консольное приложение, которое постояно крутится на сервере. Что оно делает - не так важно. Это может быть обработка статистики, ожидание входящего TCP соединения или еще чего.
Важно то, что к ней в любой момент может подойти человек и нажав на кнопку сказать ей : делай это или то.

В старом добром паскале, еще на заре времен, это решалось так(с названиями ф-й могу набрехать):

PHP:
while true do 
begin
   if keypressed then
   begin
     c := get_char;
     ......
   end;
   .....
end;
т.е. программа не затыкалась (в ожидании ввода пользователя) при попытке считать очередную клавишу из буфера.

При чем здесь обмен файлами? :))
 

Фанат

oncle terrible
Команда форума
не при чём.
отдыхай.

-~{}~ 27.10.06 11:14:

а чо бы тебе не написать эту мощную тулзу на на старом добром паскале?
раз уж ты не в состоянии пачетать в мане раздел про запуск пыха из командной строки?
 

ColoneL

Новичок
Уважаемый Фанат.

Вижу, что мы с Вами говорим на разных языках, и, тем более, о разных вещах. Я могу написать эту "мощную тулзу" и на паскале и еще на паре других языков. Но от всего этого вопрос не снимается, посколько я лично с PHP еще не на такой короткой ноге, как, похоже, Вы.

Задача стоит сделать это на PHP. И если это не форум по вопросам PHP программирования, то тогда по каким вопросам?

В любом случай, если Вам нечего сказать по теме, прошу не флудить. Спасибо.
 

hermit_refined

Отшельник
ColoneL
Зря огрызаетесь, вы, конечно, не заметили, но вам предложили вполне разумную вещь - запускать скрипт в фоновом режиме, а управлять его работой другим скриптом.
 

ColoneL

Новичок
Хм... :) Коллеги.

Еще более разумная вещь - это управлять скриптом, через реестр Windows . Пиши туда команды, а он их читает и выполняет.

Вопрос стоял не как это обойти, а возможно ли такое вообще. Если получить ввод пользователя невозможно без затыкания (вызванного ожиданием ввода), то так и скажите. И я вас не буду раздражать тем, что это умел делать любой язык, кроме PHP.

Если это возможно - я с благодарностью воспользуюсь вашим советом. Пока же, кроме ответов hermit_refined'ера и uliss'a все остальное - просто флуд.
 

StUV

Rotaredom
И я вас не буду раздражать тем, что это умел делать любой язык, кроме PHP.
пхп не для этого предназначен
за то время, которое ты здесь убил можно 10 раз написать требуемое на C или C++ и под линукс и под вин...

с учетом высокого уровня самомнения и способности сделать это "на старом добром паскале"... вот это как раз дико раздражает
 

hermit_refined

Отшельник
Еще более разумная вещь - это управлять скриптом, через реестр Windows . Пиши туда команды, а он их читает и выполняет.
Запуск демона и управление им при помощи другой программы - это стандартный и наиболее правильный способ. Интерактивное исполнение из консоли плохо уже тем, что если она отвалится, скрипт прервется.

P.S. Если всё-таки "интерактивно" - тогда заставьте администратора нажимать Enter и делайте в начале скрипта stream_set_blocking(STDIN, false);
 

ColoneL

Новичок
Привожу свои извинения за флуд.

StUV - ты, похоже, считаешь, что обращение на Вы и упоминание паскаля в положительном контексте является задраной планкой самомнения. Так вот, специально для тебя объясняю: Вы - это вежливая форма обращения, так как мы с тобой пиво не пили. Что касается паскаля - был приведен конкретный пример - какой результат нужно получить.

Если бы мне надо было написать это на C++ или паскале с дельфями, я бы это уже 100 раз сделал. Но мне интересно это сделать на PHP, поскольку я его только изучаю, и писать простенькую консольку на компилируемом языке не интересно. У меня возник конкретный вопрос - я его задал. Если ты не знаешь ответа - то к чему весь базар?

Еще раз сорри всем остальным.
 
Сверху