2011-01-28 76 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