2013-05-01 67 views
17

我想編寫非阻塞應用程序。我使用apache2,但我正在閱讀關於nginx及其關於apache進程的優勢。我正在考慮更換apache for nginx。我的問題是,是否可以使用php和nginx編寫非阻塞Web應用程序?編寫PHP非阻塞應用程序

或者是使用python,使用一些反向代理(如uwsgi或gunicorn與nginx)來嘗試執行此操作的更好主意?或者是學習nodejs的解決方案?

回答

12

在php中編寫非阻塞應用程序是可能的,但它可能不是最好的環境,因爲它並沒有牢記這一點!使用過程控制庫PCNTL可以很好地控制您的子進程,但它顯然不會爲您提供與其他環境一樣易用的易用性!

我不知道蟒蛇很好,但個人我建議你去nodejs!這是一項相當新的技術,這是真的,但所有東西都是非阻塞的,它就是這樣的!基本上你所擁有的是一個單一的線程(你可以在這個新聞版本中擴展你想要的),並且從字面上看,除了你告訴它做不同的事情之外,所有的事情都是由事件驅動的,在處理隊列上留下空間作爲預期!

Nodejs真的很容易學習,如果你偶然發現了web應用程序,反正你知道javascript!它仍然沒有很大的文件記錄,但是有很多準備使用的模塊可以直接下載和使用!

+3

@DarthVader JavaScript是一種真正強大的語言,一旦你知道如何處理它!你知道你會有很多回調,對吧?知道事先給予你思考不同的可能性,而不是隻需要一些jquery functionallity的普通web開發人員:D我並不認爲nodejs只是一個玩具應用交易!就像往常一樣,一切都取決於你需要的東西!但我可以向你保證,我已經看到了該死的js項目! – Ivo 2013-05-01 05:56:00

+0

@DarthVader關於python的一些評論? – 2013-05-01 05:58:31

+0

不,它不是。你可以比較JS與C#或Java?它是一種不同的語言。 – DarthVader 2013-05-01 05:58:37

2

如果您想要無阻塞的應用程序沒有很多的努力,您可以嘗試使用pushpin。我在我的一個應用程序中使用它,它效果很好。你可以找到作者的更多信息blog post。我在現有項目的基礎上增加了這個功能,幾乎不會改變現有的代碼。

如果您想使用節點,請確保這是正確的工具。檢查堆棧溢出問題,因爲已經有了該問題的答案。問問自己,如果你的應用程序的想法符合節點功能。例如,嘗試使用Why and When to use node js?How to decide when to use NodeJS?

3

我還沒有圖釘看着呢,但我在寫這個答案指向一個支持PHP非阻塞應用另一個框架:

陣營http://reactphp.org/

它支持服務器綁定HTTP或WebSocket,並且可以通過轉發(使用proxy_pass)請求通過HTTP向其通過Web服務器軟件(如Nginx)使用。您甚至可以在網絡服務器中使用HTTPS並轉發未加密的。 (缺乏對React的SSL支持。)

似乎還沒有FastCGI或UWSGI支持,至少在上游項目中沒有。

該風格類似於編寫node.js,您將PHP 5.3+閉包附加到事件,並且它在下面透明地使用了非阻塞套接字。在該網站上有很好的例子,所以我不會在這裏重複,因爲你沒有特別要求用例。

更新:我只是看着圖釘網站,它不是一個框架或工具,用於根據問題標題中的要求編寫非阻塞的PHP應用程序。它看起來好像它將作爲解決方案的一部分很有用。

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"; 
});