2011-01-28 79 views
3

我有一個超過5百萬行的數據庫,並且對於每一行,我必須以500個連接的最大速率向服務器做一個http post。每個帖子請求需要12秒來處理。所以舊的連接完成後,我必須做新的連接並保持〜500連接。然後我必須用從這些webcalls返回的值更新DB。 如何製作上述網絡電話?異步網絡調用php

我的應用程序使用PHP。我可以使用PHP或者我應該切換到其他的東西。

+0

看看這篇文章http://stackoverflow.com/a/13690590/599993 – jzafrilla 2012-12-04 09:01:17

回答

1

PHP不是製作長時間運行的腳本的正確工具,因爲默認情況下它的最大執行時間非常短。您可能會考慮使用python來執行此任務。另外請注意,如果您使用PHP的唯一原因是可以輕鬆地集成Web前端,則可以使用system()函數從PHP調用外部腳本(例如python腳本)。

但是,你可以[b]在cron-job中通過簡單地讓你的PHP腳本只處理一行,並且每次都用cron-job調用php腳本第二。只需將索引保存到其他地方(在數據庫中的其他位置或者將該數字寫入文件)

如果您想要達到500個連接限制,請讓腳本一次執行40行。 40行/秒大致爲500行/ 12秒

+2

爲了補充一點:我相信PHP的默認`max_execution_time`作爲一個web服務器模塊是30秒。 PHP CLI(獨立命令行程序)的默認值沒有限制,因爲設置限制對於非web任務來說會非常麻煩。默認的內存限制仍然適用於PHP CLI,但是,如果維護500個同時資源連接,請記住這一點。 – Wiseguy 2011-01-28 17:25:13

2

實際上,您可以使用稱爲長輪詢的技術,通過PHP完成此操作。基本上它是如何工作的是客戶端機器ping服務器並且說「你有什麼給我」,服務器認爲它沒有。它不是響應而是持有請求並在需要發送時作出響應。

長輪詢是DrupalChat和APE項目(AJAX Push Engine)都使用的方法。 http://drupal.org/project/drupalchat
http://www.ape-project.org/

下面是推動高新技術一些更多的信息:http://en.wikipedia.org/wiki/Push_technologyhttp://en.wikipedia.org/wiki/Comet_%28programming%29

這裏是一個計算器後一下:How do I implement basic "Long Polling"?

現在,我不得不說,有12秒真的宕長時間運行數據庫查詢。這聽起來像查詢需要優化或數據庫(或兩者)。你是否規範了數據庫並設置了良好的表格和表格間索引?

現在爲了防止數據庫更新衝突,您需要使用事務(PostgreSQL和PostgreSQL的新版本以及大多數企業數據庫系統)。事務將允許您回滾數據庫更改並保留表ID和類似的東西。 http://en.wikipedia.org/wiki/Database_transaction