Веб-приложение двунаправленно взаимодействует с серверной программой?

Я хочу написать веб-приложение для игры в шахматы против движка Crafty. Я не новичок в PHP и javascript, но должен научиться взаимодействовать с серверным процессом: как веб-приложение и/или (jQuery) ajax могут двунаправленно взаимодействовать с (linux) программой, работающей на сервере?

На данный момент я разрабатываю на локальном хосте (Apache). Crafty установлен на моем ПК с Ubuntu. Этот известный шахматный движок не имеет графического интерфейса, он запускается в терминале командой

$ /usr/игры/коварный

и поэтому вы можете играть с ним в шахматы и даже видеть его расчеты:

искусно в терминале

Я могу заставить Crafty запускаться с помощью PHP, используя функции proc_open() или exec(), и в большинстве найденных мной документов говорится, что выходной поток должен быть файлом. Но я думаю, что мне не нужна такая настройка, потому что тогда веб-страница должен постоянно опрашивать этот файл (например, с помощью ajax), чтобы увидеть, были ли добавлены какие-то новые данные, верно?

Как Crafty может напрямую обращаться к веб-странице, говоря: «Я рассчитал другой вариант» или «Я решил сделать ход» и т. д., а затем отобразить эту информацию на веб-странице и позволить пользователю сделать встречный ход, как в терминале. Разве нельзя использовать какой-то сеанс/поток/слушатель?

Я понятия не имею вообще, может ли кто-нибудь указать мне правильное направление?


person Roelof Berkepeis    schedule 27.11.2012    source источник
comment
Похоже, голосование было бы выходом.   -  person Joe Green    schedule 27.11.2012
comment
Crafty выглядит чертовски круто, но это НЕ серверный процесс — он разработан как однопользовательское приложение командной строки. Вы могли бы, вероятно, обернуть это, чтобы включить веб-страницу, но это было бы сложно - каждому одновременно работающему пользователю, вероятно, потребуется запущенный хитрый экземпляр, который довольно сильно ограничивает количество одновременных пользователей.   -  person Neville Kuyt    schedule 27.11.2012
comment
Я могу придумать какое-нибудь чистое решение с небольшим изменением принятой идеи. Согласно веб-сайту craftychess.com, Crafty — это программа с открытым исходным кодом. следовательно, вы можете получить его исходный код (ftp.cis.uab.edu/pub/hyatt) и основная бизнес-логика (независимо от языка). У нас есть бизнес-логика. Теперь нам нужно подумать о том, как их реализовать. Вы можете создать для него новый пользовательский интерфейс, который взаимодействует с пользователем и хитрой логикой. Это сложно, но возможно и может дать отличный результат. Что ты говоришь?   -  person Dinesh    schedule 27.11.2012
comment
@Dinesh, это возможно, но превратить однопользовательское приложение в многопользовательское веб-приложение без сохранения состояния явно нетривиально. По моему опыту, на это может уйти столько же времени, сколько на создание исходного однопользовательского приложения...   -  person Neville Kuyt    schedule 27.11.2012
comment
@НевиллК Да. Для начала это непростая задача. Когда нет другого пути, мы можем сделать это. Сейчас у нас очень много шахматных онлайн-сайтов. Не стоит тратить столько усилий. Однако мы можем следовать этому подходу, только если того требует ситуация.   -  person Dinesh    schedule 29.11.2012


Ответы (1)


Я рекомендую вам использовать fifos и оператор & - вот почему:

  • Вы не хотите запускать крафти при каждом запросе PHP, вы хотите запускать его только один раз за игру
  • Вы не хотите иметь лукавый конец в конце вашего запроса
  • Ваши запросы на перемещение будут хотеть взаимодействовать с этим уже запущенным экземпляром.

Итак, я бы сделал что-то вроде:

  • Подготовьте пару FIFO с помощью mkfifo — вы можете сделать это из PHP или из оболочки
  • При запуске игры запустите что-то вроде /usr/games/crafty <stdin.fifo >stdout.fifo 2>stderr.fifo &
  • Для ваших ходов сделайте AJAX PHP-запрос, напишите stdin.fifo
  • Для серверных ходов делайте долгий опрос с помощью AJAX, на стороне сервера открывая stdin.fifo, затем stream_select()
person Eugen Rieck    schedule 27.11.2012