gpt4 book ai didi

javascript - 允许执行时间较长的 PHP 脚本将更新发送回浏览器

转载 作者:行者123 更新时间:2023-12-02 14:17:36 25 4
gpt4 key购买 nike

我查看了一些问题,即

似乎没有人回答我的问题,其中一部分似乎是“我该怎么做?”另一半是“嘿,我现在这样做的方式 - 这是最好的方式吗?我可以更好地编码吗?”

我有一个简单的 ajax 脚本,它将一些数据发送到 PHP 脚本:

$.ajax({
type: 'POST',
url: 'analysis.php',
data: { reportID:reportID, type:type, value:value, filter_type:filter_type, filter_value:filter_value, year:year },
success:function(dataReturn){
analysis_data = JSON.parse(dataReturn);
/* do stuff with analysis_data... */
});

这个 PHP 脚本运行大约需要 3 分钟,因为它循环访问数据库并运行一些非常复杂的查询:

<?php
session_start();
ob_start();
ini_set('max_execution_time', 180);

$breaks = [ 1000, 2000, 4000, 6000, 8000, 10000, 20000, 50000, 99999999 ];
$breaks_length = count($breaks);
$p = 0;

foreach ( $breaks as $b ) {

$p++;
$percentage_complete = number_format($p / $breaks_length,2) . "%";

$sql = "query that takes about 20 seconds to run each loop of $b....";

$query = odbc_exec($conn, $sql);
while(odbc_fetch_row($query)){
$count = odbc_result($query, 'count');
}

$w[] = $count;

/* tried this... doesn't work as it screws up the AJAX handler success which expects JSON
echo $percentage_complete;
ob_end_flush();
*/
}

echo json_encode($w);
?>

所有这些都有效 - 但我真正想做的是在每个 foreach 循环之后找到一种方法,将 $percentage_complete 输出回​​用户,以便他们可以看到它正在工作,而不是仅仅坐在那里 2 分钟,看着 FontAwesome 图标在他们面前旋转。我尝试使用 ob_start(); ,但它不仅在页面运行完成之前不会输出任何内容,而且还会回显该值,该值是发送回我的 AJAX 成功处理程序的一部分,导致它搞砸了。 (我需要 JSON_encoded 格式的输出,因为我稍后会将其用于其他用途。)

到目前为止,在我读过的线程中,我唯一的想法是在上一页上启动 $breaks 数组循环,因此我不是在同一页上循环 6 次,而是循环一次,返回答案,然后使用 $breaks 数组的第二个元素再次调用analysis.php,但我不确定这是最好的方法。

此外 - 在用户等待此脚本执行的 3 分钟内,他们无法在页面上执行任何其他操作,因此他们只能坐下来等待。我确信有一种方法可以让这个脚本以一种不会为用户“锁定”服务器其余部分的方式执行,但是我在 Google 中搜索的所有内容都没有给我一个好的结果回答这个问题,因为我不确定要搜索什么......

最佳答案

您遇到的是所谓的Session Locking 。所以基本上 PHP 不会接受另一个使用 session_start() 的请求,直到第一个请求完成。

立即解决您的问题的方法是从第 #1 行完全删除 session_start();,因为我发现您不需要它。

<小时/>

现在,对于有关在屏幕上显示百分比的问题:

analysis.php(已修改)

<?php
ob_start();
ini_set('max_execution_time', 180);

$breaks = [ 1000, 2000, 4000, 6000, 8000, 10000, 20000, 50000, 99999999 ];
$breaks_length = count($breaks);
$p = 0;

foreach ( $breaks as $b ) {

$p++;

session_start();
$_SESSION['percentage_complete'] = number_format($p / $breaks_length,2) . "%";
session_write_close();

$sql = "query that takes about 20 seconds to run each loop of $b....";

$query = odbc_exec($conn, $sql);
while(odbc_fetch_row($query)){
$count = odbc_result($query, 'count');
}

$w[] = $count;

/* tried this... doesn't work as it screws up the AJAX handler success which expects JSON
echo $percentage_complete;
ob_end_flush();
*/
}

echo json_encode($w);

check_analysis_status.php获取此文件的百分比

<?php
session_start();
echo (isset($_SESSION['percentage_complete']) ? $_SESSION['percentage_complete'] : '0%');
session_write_close();

一旦您的 AJAX 调用了 analysis.php,那么只需调用这段 JS:

// every half second call check_analysis_status.php and get the percentage
var percentage_checker = setInterval(function(){
$.ajax({
url: 'check_analysis_status.php',
success:function(percentage){
$('#percentage_div').html(percentage);

// Once we've hit 100% then we don't need this no more
if(percentage === '100%'){
clearInterval(percentage_checker);
}
}
});
}, 500);

关于javascript - 允许执行时间较长的 PHP 脚本将更新发送回浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38904977/

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