Еще один простой способ - просто использовать систему событий pygame.
Вот простой пример:
import pygame
pygame.init()
screen = pygame.display.set_mode((128, 128))
clock = pygame.time.Clock()
counter, text = 10, '10'.rjust(3)
pygame.time.set_timer(pygame.USEREVENT, 1000)
font = pygame.font.SysFont('Consolas', 30)
while True:
for e in pygame.event.get():
if e.type == pygame.USEREVENT:
counter -= 1
text = str(counter).rjust(3) if counter > 0 else 'boom!'
if e.type == pygame.QUIT: break
else:
screen.fill((255, 255, 255))
screen.blit(font.render(text, True, (0, 0, 0)), (32, 48))
pygame.display.flip()
clock.tick(60)
continue
break
[/g0]
Согласование / расширение того, что уже было сказал: «Я не думаю, что FastCGI решит проблему.
Каждый запрос в Apache будет использовать один рабочий поток до тех пор, пока запрос не завершится, что может занять много времени для запросов COMET.
Эта статья о Ajaxian упоминает об использовании COMET на Apache, что это сложно. Проблема не только в PHP, «проблема сохранения активности» в HTTP. После того, как клиент завершит первую запрос, клиент может оставить соединение открыто, и отправляем дальше запросы, использующие тот же сокет. Эта может сэкономить значительные накладные расходы в создание TCP-соединений. Однако, Apache традиционно хранит дочерний процесс / поток, ожидающий данных от клиента, который приносит свой недостатки. Чтобы решить эту проблему, этот MPM использует выделенный поток для обрабатывать оба разъема Listening и все сокеты, которые находятся в Keep Alive состояние.
К сожалению, это тоже не работает, потому что он будет «откладывать» только после запроса, ожидая нового запроса от клиента.
Сейчас с учетом другой стороны проблемы, даже если вы решите проблему с задержкой одного потока на запрос кометы, вам все равно понадобится один поток PHP на запрос - вот почему FastCGI не поможет.
Вам нужно что-то вроде Продолжения , которые позволяют возобновить запросы комет, когда наблюдается событие, по которому они инициированы. AFAIK, это невозможно в PHP. Я видел это только на Java - см. Сервер Apache Tomcat .
Изменить:
Там '
mod_php не является единственным способом использовать PHP. Можно использовать fastcgi. PHP должен быть скомпилирован с --enable-fastcgi
.
PHP как FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10
Я думаю, что это - больше проблема, что наличие большого количества апачских потоков, работающих все время, является проблемой. Это будет существующий с любым языком, если он будет работать через апача таким же образом, как PHP (обычно) делает.
У меня похожая проблема. Один вариант, который я нахожу интересным, - это использовать существующий сервер Comet, такой как cometd-java или cometd-python, в качестве основного центра сообщений. Тогда ваш PHP-код является просто клиентом для сервера Comet - он может публиковать или читать сообщения из каналов, как и другие клиенты.
Здесь есть интересный фрагмент кода: http://morglog.org/ ? p = 22 = 1 , который реализует часть этого метода (хотя есть и части разбросанного кода отладки, также разбросанные).
Вам будет сложно реализовать комету в PHP только из-за присущей ей однопоточности.
Посмотрите Websync On-Demand - сервис позволяет интегрировать PHP через публикацию на стороне сервера, разгружая тяжелый материал, связанный с одновременным подключением, и позволяет мгновенно создавать чат-приложение в реальном времени.
Я нашел это забавное маленькое скринкасты , объясняющие простую комету. В качестве примечания я действительно думаю, что это убьет ваш сервер при любой реальной нагрузке. Когда у вас всего пара пользователей, я бы сказал, что просто выберу это решение. Это решение действительно просто реализовать (скринкасты занимают всего 5 минут вашего времени :)). Но, как я уже говорил ранее, я не думаю, что это хорошо для большого количества одновременных пользователей (думаю, вы должны протестировать его;)), потому что:
filemtime ()
, Я действительно думаю, что вам следует попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать множество языков, например:
Простое выполнение простого поиска в Google покажет вам множество альтернатив, в том числе PHP (который, я думаю, при любой большой нагрузке ваш сервер убьет).
Я действительно думаю, что вам стоит попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать множество языков, например:
Простое выполнение простого поиска в Google покажет вам множество альтернатив, включая PHP (который, я думаю, при любой большой нагрузке ваш сервер убьет).
Я действительно думаю, что вам стоит попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать множество языков, например:
Простое выполнение простого поиска в Google покажет вам множество альтернатив, в том числе PHP (который, я думаю, при любой большой нагрузке ваш сервер убьет).
В настоящее время я реализую масштабируемый сервер PHP Comet с использованием функций сокетов. Он называется «phet» ([ph] p com [et])
Страница проекта: http://github.com/Tim-Smart/phet
Бесплатное участие в разработке. В настоящее время мне удалось выполнить большую часть логики сервера, просто нужно закончить работу на стороне клиента.
РЕДАКТИРОВАТЬ:
Только что вышел новый модуль для веб-сервера nginx, который позволяет Comet работать с любым языком, включая PHP.
http://www.igvita.com/2009/10/ 21 / nginx-comet-low-latency-server-push /
Вам нужно будет создать свой собственный сервер на PHP. Использование Apache / mod_php или даже fastcgi вообще не масштабируется. Несколько лет назад, но вы можете начать:
PHP-Comet-Server: http://sourceforge.net/projects/comet/
Вы можете использовать Nginx и JavaScript для реализации системы чата на базе Comet, которая очень масштабируема и требует мало памяти или ЦП.
У меня есть очень простой пример, с которого можно начать. Он охватывает компиляцию Nginx с модулем NHPM и включает код для простых ролей издателя/подписчика в jQuery, PHP и Bash.
http://blog.jameisaacs.com/2010/08/27/comet-with-nginx-and-jquery/