需要的意见/专业知识/建议 - 提供来自php执行冗长任务的反馈

时间:2010-08-27 02:02:29

标签: php sql-server ajax

我正在考虑将可视化基础应用程序(将管道分隔文件并将其导入微软sql数据库)转换为php页面。其中一个文件的平均大小约为9兆字节。 (我对所涉及的行数无法准确,但我会说它大约有2万行)

其中一个优点是对页面所做的任何更改都会自动“部署”到目标用户(当前我对Visual Basic应用程序进行了更改时,最初是由其他人创建的,我必须将所有使用它的人的PC上的最新版本。)

问题是这些导入可能需要两分钟才能完成。在网站时间两分钟是很长的一段时间,所以我想向用户提供反馈,表明该页面没有失败/超时,并且肯定正在做些什么。

到目前为止,我能想到的最好的想法是使用ajax逐步进行。假设一次导入1000条记录,然后反馈,实施下一条1000,反馈,等等。

有没有更好的方法来做这种事情,不需要我学习新的编程语言或下载应用程序或库?

2 个答案:

答案 0 :(得分:2)

您不必制作Visual Basic - > PHP开关。您可以在ASP或ASP.NET应用程序中坚持使用VB语法。使用基于ASP的解决方案,您可以重用大量现有代码,因此不会从头开始学习新语言。

至于如何向用户呈现长时间运行的进程,您正在寻找“异步处理程序” - 基本前提是用户访问启动进程页面(B)的网页(A)。

  • (A)发起(B),向用户报告并将页面设置为在 n 秒内重新加载。
  • (B)完成所有繁重工作 - 就像您现有的VB应用程序一样。进度存储在一些共享空间(平面文件,数据库,内存缓存等)
  • 重新加载后,(A)通过只读访问共享空间(B)报告(B)的当前进度正在继续进行。

(A)的范围:

  • 查找正在运行的(B)流程 - 如果找到则报告状态,或启动新的(B)流程。由于(B)似乎基于文件的存在(来自您的描述),您可以授予(A)确定调用(B)中是否有任何点的能力(即。如果存在文件调用( B)其他报告:无事可做)或者您可能希望保持范围完全免费并致电(B)。
  • 报告(B)的进展情况。
  • 执行时间非常短,可能需要包含HTTP刷新标头,以便用户自动获取更新。

(B)的范围:

  • 与现有的VB脚本相同 - 查找文件,加载... yada yada yada。
  • 应该花费类似的时间来执行现有的VB脚本(2分钟)

潜在改进:

  • (A)可以使用AJAX接口,因此,每隔 n 秒进行一次AJAX调用,而不是页面重新加载(HTTP刷新),只需更新状态框。某种动画图标(旋转轮)会给用户留下刷新之间的印象。
  • 听起来(B)可以从多线程方法(一次加载多个文件)中受益,具体取决于文件是否相关。正如Ponies所指出的,对于这样的负载可能有更好的策略,但这是一个不同的主题:)
  • 如果多个用户可以同时同时点击页面(A)并且(B)需要几秒钟来启动并报告状态,则可能需要某种信号量/标记方法。

(A)和(B)都可以用PHP或ASP技术开发。

答案 1 :(得分:1)

您如何将数据导入数据库?理想情况下,您应该使用SQL Server's BULK INSERT,这可能会加快速度。但是仍然需要上传文件进行解析......

我认为获得插入状态的努力是不值得的 - 大多数网站只显示动画gif / etc(如沙漏等),以表明系统正在处理事物但没有真正的细节。