我有一个超过500万行的数据库,对于每一行,我必须向服务器发送一个http帖子,其中一些参数的最大速率为500个连接。每个帖子请求需要12秒才能处理。因此,当旧连接完成时,我必须做新的连接并保持~500连接。然后我必须使用从这些网络门户返回的值更新数据库。 如何制作如上所述的网络连接?
我的应用程序是PHP。我可以使用PHP,还是应该切换到其他内容。
答案 0 :(得分:2)
实际上,您可以使用称为长轮询的技术使用PHP。基本上它是如何工作的是客户端机器ping服务器并说“你有什么东西给我”,服务器看到它没有。而不是响应它保留在请求上并在它有发送内容时响应。
长轮询是DrupalChat和APE项目(AJAX Push Engine)使用的方法。
http://drupal.org/project/drupalchat
http://www.ape-project.org/
以下是有关推送技术的更多信息:http://en.wikipedia.org/wiki/Push_technology和http://en.wikipedia.org/wiki/Comet_%28programming%29
这是关于它的stackoverflow帖子:How do I implement basic "Long Polling"?
现在我不得不说12秒对于DB查询来说真的很长。听起来好像需要优化查询或DB(或两者)。您是否规范了数据库并设置了良好的表和表间索引?
现在,就防止数据库更新冲突而言,您需要使用事务(PostGres和MySQL的新版本以及大多数企业数据库系统都提供这些事务)。事务将允许您回滚数据库更改并保留表ID和类似的东西。 http://en.wikipedia.org/wiki/Database_transaction
答案 1 :(得分:1)
PHP不是制作长时间运行脚本的正确工具,因为默认情况下它的最大执行时间非常短。您可以考虑使用python执行此任务。另请注意,如果您使用PHP的唯一原因是可以轻松集成Web前端,则可以使用system()函数从PHP调用外部脚本(例如python脚本)。
然而,你[b]可以[/ b]在php中使用cron-job执行此操作,只需让php脚本一次只处理一行,然后让cron-job每秒调用php脚本。只需将索引保存到其他地方的表中(在DB中的其他位置或只是将数字写入文件)
如果您想要满足500连接限制,请让您的脚本一次完成40行。 40行/秒大约是500行/ 12秒