【问题标题】:php progress bar?php进度条?
【发布时间】:2009-10-22 00:14:20
【问题描述】:

有没有办法在 php 中显示进度条?我喜欢让用户知道 php 脚本在做什么。

这是来自我的网站http://www.bestsellprice.com/search.php?itemnum=0&keyword=harry+potter+book的结果示例

我有一个静态加载图像,其中包含一些文本,上面写着“正在加载...”,当页面完全加载时,我隐藏了加载 div。我的 php 脚本输出到 amazon api、ebay api 和屏幕抓取其他几个站点,而不是静态加载 div,我想用以下内容更新加载 div

正在加载 amazon.com

//亚马逊进度,完成后更新加载div

正在加载 ebay.com

等等。等等

这可能吗?如果是这样,最好的方法是什么?提前感谢您的帮助!

【问题讨论】:

    标签: php progress-bar loading


    【解决方案1】:

    使用 AJAX 询问 PHP 目前正在做什么,并有一个队列系统来定义哪些任务已完成或未完成。这是一个非常基本的例子:

    任务启动时,使其设置以下变量:

    $_SESSION['isEbayLoaded'] = false;
    $_SESSION['isAmazonLoaded'] = false;
    

    一旦 PHP 加载 eBay,它会将 isEbayLoaded 设置为 true,然后 AJAX 可以简单地询问 PHP 是否已加载 ebay,然后是 amazon,然后是您需要的任何其他内容。 PHP 所要做的就是检查这些变量是否设置为 true,这意味着任务已经完成。

    【讨论】:

    • 是否可以从主页访问会话变量而无需重新加载该页面?这是您可能需要考虑的事情。
    • 会话变量正在被通过 AJAX 调用的页面读取,因此当它们在主脚本中设置时,它们应该在设置后可用于请求。如果没有,仍然可以使用临时文件或数据库来存储信息,然后在发出 AJAX 请求时读取这些信息。为了避免调用 PHP,甚至可以将文件存储为 .json,然后使用 JavaScript 请求文件并处理有关哪些任务已完成和哪些任务未完成的信息。
    【解决方案2】:

    我以前用一个非常简单的解决方案完成了这个:

    ob_flush();
    

    只需要创建一个具有适当类名的 div:

    <div class="loading">
        Loading...
    </div>
    

    然后,我的 PHP 基本上是:

    foreach ($sites as $site) {
       printAndFlush(<<<CSS
         <style>
           div.loading {
             background: url($site.png) no-repeat right center;
           }
         </style>
    CSS;
    
       scrapeSite($site);
    }
    

    这将使用背景样式来显示您要抓取的网站。

    如果你必须使用标记,你可以简单地每次打印出一个新的“正在加载”的 div(具有唯一的 ID),连同一个样式来将前一个 div 的样式设置为“显示:无”。

    当然,请记住,某些浏览器至少需要 1024 字节(大约 4k!)才能呈现任何内容。

    【讨论】:

    • 次要细节,但您永远不会关闭 PrintAndFlush 函数中的括号。另外,我看不出有任何理由多次打印样式标签。
    • 不是一个实际的函数,只是一个伪php函数。样式标签被多次打印的原因是强制浏览器对其进行编译,因为每个
    • 这是为数不多的不需要 AJAX 功能的方法之一。
    【解决方案3】:

    最好的方法是让你的 javascript 对服务器进行 ajax 调用并找出它在哪里,这样你就可以给用户一些反馈。

    您可以从有一个上传进度条开始,然后继续显示应用程序的进度。

    【讨论】:

      【解决方案4】:

      我会为每个站点发出请求,并使用该页面的输出(XML、JSON 等)让其他页面知道发生了什么。

      例如...伪代码:

      • 收集网站
      • 加载 ajax 页面的 for 循环
      • ajax 页面返回带有状态消息的每个请求,例如- “加载亚马逊....”

      就是这样!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多