首页 > 解决方案 > 输出一些 HTML 后的 PHP 刷新页面(将操作分成块)

问题描述

这些天我主要在客户端编写代码,所以我的 PHP 生锈了,在这种特殊情况下我更喜欢纯 PHP 设计。

我不需要任何客户端代码。我想读取很多文本文件,提取一些数据并将其插入 MySql 数据库。

  1. 这可能需要相当长的时间,所以
  2. 我想要echo()一些进展的迹象。还,
  3. 我担心它可能需要比默认的 30 秒更长的时间,但我不想弄乱这个限制,以防我的脚本挂起。

为了做到#2,我通常会使用header('Refresh:1');但是如果刷新发生在 MySqlINSERT操作的中间呢?

我想在页面重新加载之前INSERT和页面重新加载时,我可以只COUNT使用 MySql 表条目来确定从哪里开始处理下一个文本文件。

头韵,我可以在循环的几次迭代中重新加载页面,在INSERT完成之后,但是如何,因为我已经无法使用,header('Location:X');因为我已经echo()编辑了进度。也许我可以以某种方式伪造表单提交?但是,这感觉很hacky。

这似乎是一种通用的设计模式,我敢肯定,比我更好的大脑很久以前就想出了一个优雅的解决方案。有人能告诉我那个解决方案是什么吗?最好是纯PHP。我已经搜索过,但找不到任何东西。


目前,我正在使用 JS 解决方案: echo '<script language="javascript">window.location.href ="sciprt.php"</script>';,但更喜欢纯 PHP

标签: php

解决方案


您可能不认为这是一个PHP 解决方案,因为为标签onload指定了一个参数。<BODY>再说一次,纯洁并不是人们吹捧的那样。但是我把它作为一种技术扔掉了,你可以用它来给用户一个正在运行的伪“进度条”,你的脚本只会在你想要的时候被打断,你可以将任何重启参数传回给脚本。在这个演示中,唯一传回的“重启参数”是驱动进度条的连续整数,但你可以理解:

<?php
if (!isset($_REQUEST['progress'])) {
    // initially no parameters specified, so use starting value of 0:
    $progress = 0;
}
else {
    $progress = (int)$_REQUEST['progress'];
}
// increment progress:
$progress++;
// draw progress bar:
$progress_bar = str_repeat ('+' , $progress);

// simulate doing some work:
sleep(5);

// simulate being done or not:
$done = $progress == 5;
?>
<html>
    <head>
        <title>Test</title>
    </head>
<?php if (!$done) { ?>
    <body onload="document.f.submit();">
<?php } else { ?>
    <body>
<?php } ?>
    Progress: <?= $progress_bar ?><br>
<?php if (!$done) { ?>
        <form name="f" method="post">
            <input type="hidden" name="progress" value="<?= $progress ?>">
            <!-- add any other hidden variables you need to resume where you left off -->
        </form>
<?php } else { ?>
        Done!
<?php } ?>
    </body>
</html>

推荐阅读