2009-11-15 81 views
1

我是PHP新手。我熟悉支持異步編程的ASP.NET。也就是說,如果一個請求需要做一些I/O工作。建議使用BeginProcess/EndProcess方式對網頁進行編程。異步編程是提高可伸縮性的關鍵。PHP支持異步編程嗎?

我想知道PHP世界中是否有異步編程(BeginXXXX/EndXXXX)的對應物。

+0

如果請求正在執行IO,那麼IO在進行時還有什麼其他功能?爲什麼不給出一個關於PHP中發生的事情的故事,並瞭解如何利用它提供的功能來處理它。 – 2009-11-15 15:25:34

+1

在ASP.NET中,每個請求都在一個線程中處理。由於線程作爲資源是有限的,我們不希望線程在I/O操作上被阻塞。而且,ASP.NET中的線程池大小總是有限的。所以,開始/結束模式是必要的。 我想這是PHP的不同故事。每個請求在單個進程中處理? fork進程處理請求並不重要。所以,這個開始/結束異步編程模型是沒有必要的。 – 2009-11-16 02:12:41

回答

1

在.NET中BeginXXX/EndXXX範式嚴重依賴於線程,而在PHP中,我不確定你甚至可以啓動一個新線程(除了可能是PECL package)。

FastCGI是多數解釋語言中多線程的替代方案。它不是產生新的線程,而是使用進程,但是產生一個新的進程很昂貴,它保留了一個可重用的進程池,就像.NET中的ThreadPool一樣。

+0

可悲的消息。 那麼,我們可以做的是分叉過程? – 2009-11-15 13:25:55

+0

是的,你可以分叉進程,但由於這是一個昂貴的操作,我不確定你會得到很多性能改進。當然,一如往常,你可能不得不測量。 – 2009-11-15 13:27:59

+0

我認爲分叉過程應該在* nix OS中加權。 – 2009-11-15 13:28:57

1

如果I/O與插座或文件執行的,你應該使用分別stream_socket_select()或stream_select()(類似於系統調用C/C++)。

下面是用PHP做了一個簡單的命令行聊天教程: Simple PHP socket-based terminal chat

注:這不是一般的多線程解決方案,但情況下一個簡單的解決方案,你需要「半平行的」 I/O

0

PHP沒有,但是你可以使用AJAXØ頁面已加載,這將允許異步請求。

老實說,沒有意義。如果你真的想要重量級的後端,你最好寫一個獨立的程序來完成繁重的任務。就我所知,PHP模塊是用純C編寫的,所以你應該可以使用它,然後從PHP調用你自己的自定義函數。

0

使用stream_select可以通過HTTP請求創建子進程。檢查http://drupal.org/project/httprl中的代碼,瞭解如何執行此操作的一些想法。一旦我把它更加打磨,我打算把這個庫推到github上;可以在Drupal之外運行的東西。但現在它居住在Drupal的土地上。