2013-05-01 2 views
17

Я хочу писать неблокирующие приложения. Я использую apache2, но я читал о nginx и его преимуществах в отношении процессов apache. Я рассматриваю возможность изменения apache для nginx. Мой вопрос в том, можно ли писать неблокирующие веб-приложения с php и nginx ?.Напишите PHP неблокирующие приложения

Или лучше попытаться сделать это с помощью python, используя какой-либо обратный прокси, например uwsgi или gunicorn с nginx? Или это решение для изучения nodejs?

ответ

12

Написание неблокирующих приложений в php возможно, но это, вероятно, не лучшая среда для этого, поскольку она не была создана, учитывая это! Вы получаете довольно приличный контроль над дочерними процессами, используя библиотеку управления процессом PCNTL, но она, очевидно, никогда не предложит вам такой же простоты использования, которую могут предоставить другие среды!

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

Nodejs действительно прост в освоении, если вы когда-либо наткнулись на веб-приложения, вы все равно знаете javascript! он все еще не документирован, но есть много готовых к использованию модулей, которые вы можете скачать и использовать прямо сейчас!

+3

@DarthVader Javascript действительно мощный язык, как только вы знаете, как подойти к нему! Вы знаете, что у вас будет много обратных вызовов, верно? зная, что предыдущее дает вам возможность мыслить иначе, чем средний веб-разработчик, которому просто нужна функция jquery: D я действительно не думаю, что nodejs - это просто приложение для игрушек! Ну, как всегда, все зависит от того, что вам нужно! Но я могу гарантировать, что я видел проклятые большие проекты, поставленные в js! – Ivo

+0

@DarthVader несколько комментариев о python? –

+0

нет нет. вы можете сравнить js с C# или java? это другой язык. – DarthVader

2

Если вы хотите иметь неблокирующее приложение без особых усилий, попробуйте использовать pushpin. Я использую его в одном из моих приложений, и он отлично работает. Вы можете узнать дополнительную информацию об авторе blog post. Я добавил это поверх существующего проекта, почти не меняя существующий код.

Если вы хотите использовать узел, убедитесь, что это правильный инструмент для задания. Проверьте проблемы переполнения стека, потому что на этот вопрос уже есть ответы. Спросите себя, если ваша идея приложения вписывается в возможности узла. Попробуйте Why and When to use node js? и How to decide when to use NodeJS? например.

3

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

React http://reactphp.org/

Он поддерживает привязку сервера к HTTP или WebSocket и может использоваться с программным обеспечением веб-сервера, таким как Nginx, путем пересылки (с использованием proxy_pass) запросов на него через HTTP. Вы даже можете использовать HTTPS на веб-сервере и пересылать его без шифрования. (SSL-поддержка в React отсутствует.)

Пока что не поддерживается поддержка FastCGI или UWSGI, по крайней мере, не в проекте вверх.

Стиль подобен написанию node.js, вы добавляете блокировки PHP 5.3+ к событиям и прозрачно используете незаблокированные сокеты под ним. На этом веб-сайте есть хорошие примеры, поэтому я не буду повторять их здесь, так как вы не запрашивали конкретный вариант использования.

ОБНОВЛЕНО: Я просто просмотрел веб-сайт pushpin и не является фреймворком или инструментом для написания неблокирующих PHP приложений по запросу в заголовке вопроса. Похоже, что это было бы полезно как часть решения.

4

Насколько я знаю, для создания неблокирующих приложений доступно несколько библиотек.

  1. Skyray, библиотека сети для PHP прописан в C http://github.com/bixuehujin/skyray
  2. reactphp, как уже упоминалось выше, написан на чистом PHP
  3. swoole, https://github.com/swoole/swoole-src
  4. phpdaemon, https://github.com/kakserpom/phpdaemon

Кстати: я автор Skyray, и один из разработчиков swoole.

4

Swoole является хорошим выбором для записи без блокировки приложения PHP

вот пример:

$fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3); 
$http_request = "GET /index.html HTTP/1.1\r\n\r\n"; 
fwrite($fp, $http_request); 
swoole_event_add($fp, function($fp){ 
    echo fread($fp, 8192); 
    swoole_event_del($fp); 
    fclose($fp); 
}); 
swoole_timer_after(2000, function() { 
    echo "2000ms timeout\n"; 
}); 
swoole_timer_tick(1000, function() { 
    echo "1000ms interval\n"; 
}); 
Смежные вопросы