php - 输出一些 HTML 后的 PHP 刷新页面(将操作分成块)
问题描述
这些天我主要在客户端编写代码,所以我的 PHP 生锈了,在这种特殊情况下我更喜欢纯 PHP 设计。
我不需要任何客户端代码。我想读取很多文本文件,提取一些数据并将其插入 MySql 数据库。
- 这可能需要相当长的时间,所以
- 我想要
echo()
一些进展的迹象。还, - 我担心它可能需要比默认的 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 解决方案,因为为标签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>
推荐阅读
- postgresql - 如何避免 Spring Data JPA/Hibernate 生成的数据库中的 id 冲突?
- python - 如何将变量从 TCL 传递给 python 并将 python 输出返回到同一个 TCL 脚本?
- spring - RabbitMQ 与 Spring 避免重试
- html - 使用带有 React 根 div 的 css 网格
- html - 在一个 html 中打印多个“@page size”css 属性
- javascript - 识别 Plotly 中的子图
- watson-openscale - 角色为“target”的 Watson OpenScale 字段“CHURN”具有不同的类型“StringType”,该字段“prediction”的角色“prediction”类型为“IntegerType”
- fluent-assertions - 在 As 项目上使用 Should().NotBeNull() 时的不明确调用
- loopbackjs - loopback3 的主密码或其他无需密码的内部获取令牌的方式
- django - BasicAuthentication 在检查权限时不对用户进行身份验证