gpt4 book ai didi

javascript - 进度条 AJAX 和 PHP

转载 作者:太空狗 更新时间:2023-10-29 15:50:24 25 4
gpt4 key购买 nike

我想为服务器端任务创建一个进度条(用 php 编写)

出于学习目的,示例和任务将非常简单。我会在客户端页面上有一个文本字段,读取一个 number,使用 ajax 将它传递给 php 脚本并让它计算所有数字的总和 from 0 to number (简单的任务,对于大数字来说需要一些时间,只是为了模拟一些服务器端的工作)

在 .html 文件中,我将创建一个计时器,它会每 n 秒调用一个函数,获取我的 for 循环到达的索引并更新进度条。

我的问题是:
是否可以在同一个 php 文件中包含两个函数,以及如何使用 ajax 调用特定函数:一个会阻止循环到 number 的函数,另一个我会调用以获取当前索引的函数for 循环得到。

我目前的代码:

<!DOCTYPE html>
<html>
<head>
<script>
function myTimer()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("percentageDiv").innerHTML=xmlhttp.response;
alert(xmlhttp.response);
}
}
xmlhttp.open("GET","getter.php",true);
xmlhttp.send();
}

function loop(){
var loop_index = document.getElementById("loop_nr").value;
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("sumDiv").innerHTML="Total sum = " + xmlhttp.response;
clearInterval(myVar);
}
}
xmlhttp.open("GET","server_side.php?nr="+loop_index,true);
xmlhttp.send();
var myVar=setInterval(function(){myTimer()},1000);
}
</script>
</head>
<body>
<div id="percentageDiv"> Percentage div</div>
<div id="sumDiv"></div>
<input type="text" id="loop_nr">
<input type="submit" onclick="loop()">

</body>
</html>

server_side.php

<?php
session_start();
$index=$_GET["nr"];
$progress = 0 ;
$sum = 0 ;

for ($i = 1; $i <= $index; $i++) {
$sum = $sum + $i;
$progress++;
$_SESSION['progress'] = $progress;
}
echo $sum;
?>

getter.php

<?php
session_start();
$progress = $_SESSION['progress'];
echo $progress;
?>

谢谢!

最佳答案

这里不止一个问题

你的问题有两个:

  • 如何对 PHP 中的特定函数进行 AJAX 调用?
  • 如何使用 AJAX 制作进度条?

如何对 PHP 中的特定函数进行 AJAX 调用?

您的 AJAX 代码没问题。您在 PHP 中唯一需要做的就是接收此调用。

看看你的要求。您随请求发送一个变量 nr:

server_side.php?nr="+loop_index

这将帮助我们在 php 代码中确定这是一个执行求和操作的 AJAX 调用。现在在 PHP 中:

<?php session_start();

//We look at the GET php variable to see if the "nr" is coming
if(isset($_GET['nr'])) {
//Its coming!. Now we procede to call our function to sum
sum($_GET['nr']);
}

function sum($nr) {
$progress = 0 ;
$sum = 0 ;
for ($i = 1; $i <= $nr; $i++) {
$sum = $sum + $i;
$progress++;
$_SESSION['progress'] = $progress;
}
echo $sum;
}

就是这样。

如何使用 AJAX 制作进度条?

我们需要进行其他 AJAX 调用以向 PHP 请求进度。
首先,我们进行另一个 AJAX 调用以使用计时器检索进度!

    var timer;

//try to delete duplications. Do a generic function that does the request to php
function makeRequest(toPHP, callback) {
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
callback(xmlhttp.response);
}
}
xmlhttp.open("GET",toPHP,true);
xmlhttp.send();
}

function loop() {
var loop_index = document.getElementById("loop_nr").value;
makeRequest("server_side.php?nr="+loop_index, function(response) {
document.getElementById("sumDiv").innerHTML="Total sum = " + response;
clearInterval(timer);
});
timer=setInterval(makeRequest("getter.php", function(response) {
document.getElementById("percentageDiv").innerHTML=response;
}),1000);
}

然后在 php 端,我们像以前一样检索此调用并回显 $_SESSION['progress'](正如您已经拥有的那样)

<?php
session_start();
$progress = $_SESSION['progress'];
echo $progress;
?>

就是这样!

编辑: session 不得保存到文件(默认 PHP 行为),因为如果您这样做,“进度”AJAX 将被阻止。您应该将 session 存储在 Redis 等键值数据库中,以实现并行性和水平可伸缩性。

关于javascript - 进度条 AJAX 和 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20453015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com