我有一个项目,我们有一个内部的mssql仓库,无法在互联网上找到。用户需要能够从普通网站运行查询,该网站可以查询此内部仓库并接收报告。
为此,我在内部服务器上创建了一个脚本(可通过互联网获得),该脚本在mssql服务器上运行查询(通过内部网)并返回一串数据(使用php://输出)
为了让这个在网站上运行,我在远程服务器上创建了一个php文件,当curl请求完成时,它向内部服务器发送一个curl请求(我已经传入了变量)变量返回到将内容写入文件的网站,然后我将用户重定向到该文件。
这与一些警告完美配合......
如果正在运行的查询很大(它们可能非常大),服务器可能需要很长时间(超过3/4小时)来运行查询(内部仓库的索引不是由我处理的)。虽然curl请求继续运行,但我发现有时会失败。
我有2个用户选项,1个是等待请求完成,所以ajax请求然后去完成所有这些,当它完成后,它们被重定向到文件....这有时从来没有返回...所以用户等待它永远回来 - 我试图通过每5秒检查文件系统上的文件来解决这个问题,如果找到则下载它 - 这在某种程度上有效...但有时它仍然会失败。
第二个选项是在完成后通过电子邮件发送报告,允许用户离开网站并让它继续在后台执行curl请求,但是如果查询需要很长时间才能运行,我似乎是空的电子邮件好像卷曲请求已经超时。
如果查询需要很长时间或为什么javascript有时无法报告它已完成,我有点迷失它失败的原因。任何指向正确方向的信息都是有用的 - 我不认为我完全没有这个工作。
仓库有超过1亿条记录。
答案 0 :(得分:0)
好像您正在尝试使用OLTP工具集解决OLAP问题。
鉴于CURL超时的情况和问题(对于长期运行的报告生成,HTTP通常不是最好的事情),我的建议是废弃同步路由以进行客户端提交的异步路由报告,接收一个令牌,客户经常检查,以查看与令牌相关的工作是否已完成。
您甚至可以获得幻想,并在客户登记时提供客户状态更新但未完成,或将其与您的电子邮件构思相关联(取决于呈现的报告的大小)并发送电子邮件。关键是不要依赖脆弱的卷曲连接,而是依赖本地进程(通过crontab或pthread库)。