【问题标题】:Opinions/expertise/suggestions wanted - provide feedback from php performing a lengthy task需要意见/专业知识/建议 - 提供执行冗长任务的 php 的反馈
【发布时间】:2010-08-27 02:02:28
【问题描述】:

我正在考虑将 Visual Basic 应用程序(采用管道分隔文件并将它们导入 Microsoft sql 数据库)转换为 php 页面。其中一个文件的大小平均约为 9 兆字节。 (我无法准确估计所涉及的行数,但我会说大约是 2 万行)

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

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

到目前为止,我能想到的最好的办法是使用 ajax 逐步完成。假设一次导入 1000 条记录,然后反馈,实施下 1000 条,再反馈,依此类推。

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

【问题讨论】:

    标签: php sql-server ajax


    【解决方案1】:

    您不必进行 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 接口,因此不是页面重新加载(HTTP 刷新),而是每 n 秒进行一次 AJAX 调用,并且只是更新状态框。某种动画图标(旋转轮)会给用户一种在两次刷新之间正在发生的事情的印象。
    • 听起来 (B) 可能受益于多线程方法(一次加载多个文件),具体取决于文件是否相关。正如小马所指出的,对于这样的负载可能有更好的策略,但这是一个不同的话题:)
    • 如果页面 (A) 可能同时被多个用户同时点击并且 (B) 需要几秒钟来启动和报告状态,则可能需要某种信号量/标志方法。

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

    【讨论】:

    • 在您的回复的指导下,我已实现如下...第一个加载的页面具有上传文件的表单。以正常方式提交表单(无 ajax)... 提交的页面 (A) 创建文件的永久副本,然后调用 ajax 页面 (B),传递文件名... Ajax 页面 (B) 执行数据库更新该文件...同时页面(A)每秒运行第三个页面(C),它只是执行数据库调用(从the_table中选择计数(*)...当页面B完成时,页面A停止运行页面C并报告最终记录数。所有的“页面”实际上只是一个具有不同模式的页面。
    • 听起来不错。您可能需要担心的唯一另一件事 - 如果用户在 B/C 周期期间关闭浏览器或在页面 A 上点击刷新会发生什么? B 是完成、重新启动还是失败?它可能永远不会出现,但您真的不需要重复数据,或者由于过度热心的用户而导致的不完整加载。
    【解决方案2】:

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

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

    【讨论】:

    • 这和我刚刚被打的“评论作为答案”是一样的吗?
    • @TML:我不知道你“刚刚被打败了”,但我提供了一个加快导入速度的选项,因为不清楚正在使用什么......并给出了我使用过和看到使用过的方法。
    • 只是想了解这里是什么,因为问题似乎是“我如何提供反馈”,而您的回答似乎是“我认为这不值得做”,想通了'最好问一个得分为 44k 的人,以澄清这是对所问问题的答案。
    • 我认为这是一个不错的答案并接受了它。 VB 应用程序中的原始代码没有使用批量插入(令人惊讶,因为作者应该是 SQL 专家和开发人员),我没有考虑过,但我一定会试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多