2010-12-08 113 views
2

我有一個基本的HTML文件,使用jQuery的ajax,每2秒連接到我的polling.php腳本。PHP + AJAX與MySQL - 查詢每2秒,在TIME_WAIT太多

polling.php只是連接到mysql,檢查ID是否比我隱藏的當前ID更新,如果有新內容,則返回echo。由於JavaScript每2秒連接一次,因此我在TIME_WAIT中獲得了數千個連接,僅用於我的客戶端。這是因爲我的腳本一遍又一遍地重新連接到MySQL。我試過mysql_pconnect但它沒有任何幫助。

有什麼辦法可以讓PHP打開1個連接,並繼續使用它進行查詢?而不是重新連接每一個時間並完成所有這些TIME_WAIT連接。不確定在這裏做什麼才能正常工作。

回答

1

我真的結束了基本的長輪詢。我做了一個簡單的PHP腳本來無限循環,並且每2秒查詢一次。如果它發現新的東西,它會迴應出來,並打破循環。我的jQuery只是ajax連接到它,並等待響應;在響應時,它會更新我的頁面,並重新啓動輪詢。很簡單!

PS,長輪詢方法還減少了瀏覽器內存問題,並大大減少了服務器上的TIME_WAIT連接。

0

有沒有這樣做的微不足道的方法,因爲pconnect不適用於多個網頁調用。但是,一些最小化數據庫吞吐量的方法是:

  1. 降低輪詢時間。 (2秒是或許有點過度?)

  2. 有運行每「n」個秒「主」 PHP腳本,從數據庫中提取的數據,並以適當的格式將其保存(序列PHP數組,XML, HTML數據等)在文件系統中。 (我建議寫入臨時文件,然後重命名現有文件以最小化任何部分文件收集問題。)Ajax請求的PHP頁面將僅使用此數據文件中的信息。

在執行主PHP腳本,您既可以使用cron或者乾脆讓當文件的內容被認爲過於陳舊誰第一次請求頁面的用戶而言。 (您可以通過filemtime函數將數據文件的時間戳用於此目的。)我個人會使用後一種方法,因爲cron爲此目的過於矯枉過正。

如果需要,您可以更進一步,使用memcached而不是平面文件等。 (也就是說,這可能是在這個階段的事情過於複雜的解決方案。)

+0

「(序列化PHP數組,XML,HTML數據等)」。 memcached是否容易在這裏使用? – Keyo 2010-12-08 23:20:05

+0

@Keyo很大程度上取決於他的PHP安裝是否提供memcached。 :-)因此,我首先提到了基本的文件系統方法。 – 2010-12-08 23:21:43