繁体   English   中英

通过curl和php检索大量数据

[英]Retrieving a large amount of data through curl and php

我有一个项目,我们有一个内部mssql仓库,不能通过Internet获得。 用户需要能够从普通网站上运行查询,该网站可以查询此内部仓库并接收报告。

为此,我在内部服务器(可通过Internet访问)上创建了一个脚本,该脚本在mssql服务器上(通过Intranet)运行查询并返回数据字符串(使用php:// output)

为了使该功能在网站上正常运行,我在远程服务器上创建了一个php文件,该文件向内部服务器发出curl请求(带有我传入的变量),当curl请求完成时,它将变量传回进入将内容写入文件的网站,然后依次将用户重定向到该文件。

只需注意以下几点即可完美工作...

如果正在运行的查询很大(它们可能绝对很大),则服务器可能需要较长时间(超过3/4小时)来运行查询(内部仓库的索引编制不由我处理)。 尽管curl请求继续运行,但我确实发现有时它失败了。

我为用户提供2个选项,其中1个是等待请求完成,因此ajax请求将关闭以完成所有这些操作,完成后将它们重定向到文件。 。所以用户一直等待它永远回来-我试图通过每5秒检查一次文件系统上的文件来解决这个问题,如果找到就下载它-这在某种程度上已经奏效了……但是再次有时它仍然会失败。

第二种选择是在完成报告后通过电子邮件发送报告,允许用户离开该网站,让它继续在后台执行curl请求,但是,如果查询运行时间过长,我似乎会收到空的电子邮件,好像卷曲请求已超时。

我有点迷茫,为什么查询需要很长时间才能失败,或者为什么javascript有时无法报告它已完成。 任何向我指出正确方向的信息都将很有用-我认为让它完美运行还差得远。

仓库有超过1亿条记录。

似乎您正在尝试使用OLTP工具集解决OLAP问题。

考虑到您的情况和CURL超时的问题(对于这样的长期运行的报告生成,HTTP通常不是最好的方法),我的建议是为客户机提交报告,接收报告的异步路径取消同步路径。返回令牌,然后客户经常检查一次,以查看与令牌有关的作业是否已完成。

您甚至可以幻想并在客户端签入未完成时为客户提供状态更新,或者将其绑定到您的电子邮件提示中(取决于呈现的报告的大小)并发送电子邮件。 关键是不要依靠脆弱的curl连接,而要依靠本地进程(通过crontab或pthread库)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM