Використання комети з PHP?


82

Я думав про реалізацію чату в режимі реального часу з використанням серверного коду PHP, але натрапив на цей коментар на сайті, де обговорювали комети:

Я розумію, що PHP - це жахлива мова для Comet, тому що Comet вимагає від вас постійного зв’язку, відкритого для кожного клієнта браузера. Використання mod_php означає підключення дочірньої компанії Apache на повний робочий день для кожного клієнта, що взагалі не масштабується. Люди, яких я знаю, займаючись кометами, в основному використовують Twisted Python, який призначений для обробки сотень або тисяч одночасних з'єднань.

Це правда? Або це щось, що можна налаштувати навколо?


4
ти можеш запустити php як fastcgi ...
Itay Moav -Malimovka 02.03.09

4
Використовуйте nodeJS як сервер для підтримки клієнтських з'єднань, веб-сокети в javascript для підключення до сервера з браузера. PHP в цьому сенсі може бути привілейованим клієнтом, який буде підключатися до nodejs, передавати деякі сервісні дані, які будуть якось оброблятися на стороні клієнта.
Артжом Курапов 20.03.12

1
@ArtjomKurapov Ви можете перетворити PHP на веб-сервер, тим самим обминаючи метод обробки запитів Apache - думайте про це як про справжній сервер PHP, який опікується лише запитами комет .
Крістіан

@Christian, якщо ви мали на увазі вбудований веб-сервер php з 5.4, тоді його лише для розробки та використання його у виробництві - погана ідея
Артжом Курапов

2
@ArtjomKurapov Ні, я мав на увазі писати справжній сервер PHP, використовуючи сокети PHP для прослуховування порту 80 та блокування вводу на невизначений час - ефективно, як працюють сервери. Це вже можна побачити в дії в таких проектах, як phpwebsocket .
Крістіан

Відповіді:


61

Погоджуючись / розширюючи вже сказане, я не думаю, що FastCGI вирішить проблему.

Апачі

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

У цій статті про Ajaxian згадується використання COMET на Apache, і що це важко. Проблема не стосується PHP і стосується будь-якого внутрішнього модуля CGI, який ви можете використовувати на Apache.

Запропонованим рішенням було використання модуля MPM 'event', який змінює спосіб надсилання запитів до робочих потоків.

Цей MPM намагається виправити "проблему збереження життя" в HTTP. Після того, як клієнт виконає перший запит, клієнт може тримати з'єднання відкритим і надсилати подальші запити, використовуючи той самий сокет. Це може заощадити значні накладні витрати при створенні TCP-з'єднань. Однак Apache традиційно тримає цілий дочірній процес / потік в очікуванні даних від клієнта, що приносить свої недоліки. Для вирішення цієї проблеми цей MPM використовує виділений потік для обробки як сокетів прослуховування, так і всіх сокетів, які перебувають у стані Keep Alive.

На жаль, це теж не працює, оскільки воно буде «відкладатися» лише після завершення запиту, чекаючи нового запиту від клієнта.

PHP

Тепер, враховуючи іншу сторону проблеми, навіть якщо ви вирішите проблему, затримавши один потік на запит комети, вам все одно знадобиться один потік PHP на запит - ось чому FastCGI не допоможе.

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

Редагувати:

Тут є стаття про використання балансувача навантаження ( HAProxy ), що дозволяє запускати як сервер apache, так і сервер із підтримкою комет (наприклад, причал, tomcat для Java) на порту 80 того самого сервера.


20
Я усвідомлюю, що це точно не забезпечує рішення: /
Майк Х'юстон,

+1, оскільки Apache / PHP - це не найкращі варіанти масштабування рішення комети. Варіанти для користувачів PHP: 1) як ви вже згадували, божевільні конфігурації додаткових серверів та проксі-серверів або 2) використання рішення SaaS та розвантаження комет через щось на зразок WebSync On-Demand.
jvenema

1
Це неправильно з кількох аспектів. Якщо хтось хоче залишити метод одного потоку на користувача, цього можна легко досягти, видаливши Apache як посередника і дозволивши PHP обробляти ці запити. Звичайно, Apache працює краще при обслуговуванні вмісту, тому я б запускав цей апаш-сервер PHP sever на піддомені, який не обслуговує жодного вмісту.
Крістіан

@MikeHouston Що можна сказати про спробу комети з php у IIS.?
ravi404

@ravz, тут є щось про IIS та комети: stackoverflow.com/questions/1898848/comet-programming-in-iis , але я підозрюю, що PHP-модуль fast-cgi має ті самі обмеження, що і у apache. Тут згадується одне потокове середовище: microsoft.com/web/platform/phponwindows.aspx - я сам не використовую сервери Windows, тому я не впевнений у моделі потоків.
Mike Houston,

14

Ви можете використовувати Nginx та JavaScript для реалізації системи чату на основі Comet, яка є дуже масштабованою з невеликим використанням пам'яті або центрального процесора.

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

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


10

PHP

Я знайшов цей кумедний маленький сценарій, який пояснює просту комету. Як додаткове зауваження, я справді думаю, що це призведе до знищення вашого сервера при будь-якому реальному навантаженні. Якщо у мене лише пара користувачів, я б сказав, що просто варто вибрати це рішення. Це рішення дуже просте у впровадженні (трансляції екрану займають лише 5 хвилин вашого часу :)). Але, як я вже говорив раніше, я не думаю, що це добре для багатьох одночасних користувачів (мабуть, вам слід порівняти його;)), оскільки:

  1. Він використовує введення / виведення файлів, що набагато повільніше, ніж просто отримання даних з пам'яті. Як, наприклад, функції filemtime(),
  2. По-друге, але, на мою думку, PHP не має гідної моделі потоків. PHP так чи інакше не був розроблений через модель нічого спільного . Як і на слайдах, написано "Спільні дані переносяться на рівень сховища даних", як, наприклад, MySQL.

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

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

  • Java / JVM: продовження причалу .
  • Python: Дастін вихлюпування .
  • Ерланг: Популярна мова для комет / тощо.
  • Lua, Ruby, C, Perl, щоб назвати лише декілька.

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



6

Ви також можете спробувати https://github.com/reactphp/react

React - це бібліотека низького рівня для програмування на основі подій у PHP. В його основі лежить цикл подій, поверх якого він надає утиліти низького рівня, такі як: абстракція потоків, асинхронний вирішувач dns, мережевий клієнт / сервер, клієнт / сервер http, взаємодія з процесами. Сторонні бібліотеки можуть використовувати ці компоненти для створення асинхронних мережевих клієнтів / серверів тощо.

Цикл подій базується на шаблоні реактора (звідси і назва) та натхненний бібліотеками, такими як EventMachine (Ruby), Twisted (Python) та Node.js (V8).

Вступний приклад показує простий прослуховування сервера HTTP через порт 1337:

<?php

$i = 0;

$app = function ($request, $response) use (&$i) {
    $i++;

    $text = "This is request number $i.\n";
    $headers = array('Content-Type' => 'text/plain');

    $response->writeHead(200, $headers);
    $response->end($text);
};

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket);

$http->on('request', $app);

$socket->listen(1337);
$loop->run();

4

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

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


3

Зараз я реалізую масштабований сервер PHP Comet, використовуючи функції сокета. Це називається 'phet' ([ph] p com [et])

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

Безкоштовно беруть участь у розробці. В даний час мені вдалося виконати більшу частину логіки сервера, просто потрібно закінчити роботу на стороні клієнта.

РЕДАГУВАТИ: нещодавно додані можливості багатопоточності за допомогою pcntl_forkметоду :)


Немає легко доступних прикладів використання цієї бібліотеки.
ftrotter

3

Вам буде важко впровадити комету в PHP, саме через її властиву однопоточність.

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



1

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

Сервер PHP-комет: http://sourceforge.net/projects/comet/


0

Я думаю, це більше проблема, тому що постійно працює багато потоків apache - це проблема. Це буде існувати з будь-якою мовою, якщо вона працює через apache так само, як працює PHP (зазвичай).


1
Я думаю, справа в тому, що ви зазвичай запускаєте php в процесі за запитом, а не за потік для запиту.
troelskn 02.03.09
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.