Zgadzając się / rozszerzając to, co już zostało powiedziane, nie sądzę, że FastCGI rozwiąże problem.
Apache
Każde żądanie do Apache będzie używać jednego wątku roboczego do zakończenia żądania, co może być długim czasem w przypadku żądań COMET.
Ten artykuł o Ajaxian wspomina o używaniu COMET na Apache i że jest to trudne. Problem nie jest specyficzny dla PHP i dotyczy każdego modułu CGI zaplecza, którego możesz chcieć użyć na Apache.
Sugerowanym rozwiązaniem było użycie modułu MPM „zdarzenia”, który zmienia sposób wysyłania żądań do wątków roboczych.
Ten MPM próbuje rozwiązać problem z utrzymaniem aktywności w HTTP. Gdy klient zakończy pierwsze żądanie, może pozostawić połączenie otwarte i wysyłać kolejne żądania przy użyciu tego samego gniazda. Może to zaoszczędzić znacznych kosztów związanych z tworzeniem połączeń TCP. Jednak Apache tradycyjnie utrzymuje cały proces / wątek potomny w oczekiwaniu na dane od klienta, co ma swoje wady. Aby rozwiązać ten problem, ten MPM używa dedykowanego wątku do obsługi zarówno gniazd nasłuchujących, jak i wszystkich gniazd, które są w stanie utrzymywania aktywności.
Niestety to też nie działa, ponieważ „drzemie” dopiero po zakończeniu żądania, czekając na nowe żądanie od klienta.
PHP
Teraz, biorąc pod uwagę drugą stronę problemu, nawet jeśli rozwiążesz problem z zatrzymywaniem jednego wątku na żądanie komety, nadal będziesz potrzebować jednego wątku PHP na żądanie - dlatego FastCGI nie pomoże.
Potrzebujesz czegoś takiego jak Kontynuacje, które pozwolą na wznowienie żądań komety, gdy zostanie zaobserwowane zdarzenie, przez które zostały wyzwolone. AFAIK, to nie jest coś, co jest możliwe w PHP. Widziałem to tylko w Javie - zobacz serwer Apache Tomcat .
Edytować:
Jest tutaj artykuł o używaniu load balancera ( HAProxy ), który pozwala na uruchomienie zarówno serwera Apache, jak i serwera obsługującego kometę (np. Jetty, tomcat dla Java) na porcie 80 tego samego serwera.