Используя комету с PHP?

Еще один простой способ - просто использовать систему событий 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

enter image description here [/g0]

82
задан ryeguy 2 March 2009 в 17:30
поделиться

10 ответов

Согласование / расширение того, что уже было сказал: «Я не думаю, что FastCGI решит проблему.

Apache

Каждый запрос в Apache будет использовать один рабочий поток до тех пор, пока запрос не завершится, что может занять много времени для запросов COMET.

Эта статья о Ajaxian упоминает об использовании COMET на Apache, что это сложно. Проблема не только в PHP, «проблема сохранения активности» в HTTP. После того, как клиент завершит первую запрос, клиент может оставить соединение открыто, и отправляем дальше запросы, использующие тот же сокет. Эта может сэкономить значительные накладные расходы в создание TCP-соединений. Однако, Apache традиционно хранит дочерний процесс / поток, ожидающий данных от клиента, который приносит свой недостатки. Чтобы решить эту проблему, этот MPM использует выделенный поток для обрабатывать оба разъема Listening и все сокеты, которые находятся в Keep Alive состояние.

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

PHP

Сейчас с учетом другой стороны проблемы, даже если вы решите проблему с задержкой одного потока на запрос кометы, вам все равно понадобится один поток PHP на запрос - вот почему FastCGI не поможет.

Вам нужно что-то вроде Продолжения , которые позволяют возобновить запросы комет, когда наблюдается событие, по которому они инициированы. AFAIK, это невозможно в PHP. Я видел это только на Java - см. Сервер Apache Tomcat .

Изменить:

Там '

61
ответ дан 24 November 2019 в 09:19
поделиться

mod_php не является единственным способом использовать PHP. Можно использовать fastcgi. PHP должен быть скомпилирован с --enable-fastcgi.

PHP как FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10

7
ответ дан vartec 5 November 2019 в 17:04
поделиться

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

0
ответ дан benlumley 5 November 2019 в 17:04
поделиться

У меня похожая проблема. Один вариант, который я нахожу интересным, - это использовать существующий сервер Comet, такой как cometd-java или cometd-python, в качестве основного центра сообщений. Тогда ваш PHP-код является просто клиентом для сервера Comet - он может публиковать или читать сообщения из каналов, как и другие клиенты.

Здесь есть интересный фрагмент кода: http://morglog.org/ ? p = 22 = 1 , который реализует часть этого метода (хотя есть и части разбросанного кода отладки, также разбросанные).

4
ответ дан 24 November 2019 в 09:19
поделиться

Вам будет сложно реализовать комету в PHP только из-за присущей ей однопоточности.

Посмотрите Websync On-Demand - сервис позволяет интегрировать PHP через публикацию на стороне сервера, разгружая тяжелый материал, связанный с одновременным подключением, и позволяет мгновенно создавать чат-приложение в реальном времени.

3
ответ дан 24 November 2019 в 09:19
поделиться

PHP

Я нашел это забавное маленькое скринкасты , объясняющие простую комету. В качестве примечания я действительно думаю, что это убьет ваш сервер при любой реальной нагрузке. Когда у вас всего пара пользователей, я бы сказал, что просто выберу это решение. Это решение действительно просто реализовать (скринкасты занимают всего 5 минут вашего времени :)). Но, как я уже говорил ранее, я не думаю, что это хорошо для большого количества одновременных пользователей (думаю, вы должны протестировать его;)), потому что:

  1. Он использует файловый ввод-вывод, который намного медленнее, чем просто получение данных из памяти . Как, например, функции filemtime () ,
  2. Во-вторых, но я не думаю, что по крайней мере PHP не имеет достойной модели потоков. PHP в любом случае не был разработан для этого из-за модели ничего не разделять . Как показано на слайдах: «Общие данные передаются на уровень хранилища данных», как, например, MySQL.

Альтернативы

Я действительно думаю, что вам следует попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать множество языков, например:

Простое выполнение простого поиска в Google покажет вам множество альтернатив, в том числе PHP (который, я думаю, при любой большой нагрузке ваш сервер убьет).

Альтернативы

Я действительно думаю, что вам стоит попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать множество языков, например:

Простое выполнение простого поиска в Google покажет вам множество альтернатив, включая PHP (который, я думаю, при любой большой нагрузке ваш сервер убьет).

Альтернативы

Я действительно думаю, что вам стоит попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать множество языков, например:

Простое выполнение простого поиска в Google покажет вам множество альтернатив, в том числе PHP (который, я думаю, при любой большой нагрузке ваш сервер убьет).

10
ответ дан 24 November 2019 в 09:19
поделиться

В настоящее время я реализую масштабируемый сервер PHP Comet с использованием функций сокетов. Он называется «phet» ([ph] p com [et])

Страница проекта: http://github.com/Tim-Smart/phet

Бесплатное участие в разработке. В настоящее время мне удалось выполнить большую часть логики сервера, просто нужно закончить работу на стороне клиента.

РЕДАКТИРОВАТЬ:

3
ответ дан 24 November 2019 в 09:19
поделиться

Только что вышел новый модуль для веб-сервера nginx, который позволяет Comet работать с любым языком, включая PHP.

http://www.igvita.com/2009/10/ 21 / nginx-comet-low-latency-server-push /

1
ответ дан 24 November 2019 в 09:19
поделиться

Вам нужно будет создать свой собственный сервер на PHP. Использование Apache / mod_php или даже fastcgi вообще не масштабируется. Несколько лет назад, но вы можете начать:

PHP-Comet-Server: http://sourceforge.net/projects/comet/

1
ответ дан 24 November 2019 в 09:19
поделиться

Вы можете использовать Nginx и JavaScript для реализации системы чата на базе Comet, которая очень масштабируема и требует мало памяти или ЦП.

У меня есть очень простой пример, с которого можно начать. Он охватывает компиляцию Nginx с модулем NHPM и включает код для простых ролей издателя/подписчика в jQuery, PHP и Bash.

http://blog.jameisaacs.com/2010/08/27/comet-with-nginx-and-jquery/

14
ответ дан 24 November 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: