显示部分页面,然后插入需要一段时间才能完成的函数的输出

Show partial page and then insert output from a function that takes a while to finish

我需要在从函数输出内容之前显示页面的大部分内容。该函数需要一段时间才能执行,并且 returns 页面的一些内容。我需要先显示页面的其余部分,然后 运行 函数,然后 'insert' 函数输出。

我似乎需要在函数的开头使用 ob_start,然后将该数据存储在带有 ob_get_content() 的变量中。但我还需要 运行 在页面的其余部分显示后执行此功能。

这是我尝试过但没有成功的一些代码(这是 body 标签内的内容区域):

<div id='part1'>
   <p>here is part 1 of the content</p>
</div>
<div id='part2'> // this is where the function output will be inserted after processing it
   <p>part 2</p>
<?php echo long_function();?>
</div>
<div id='part3'>
   <p>this is part 3 of the content
</div>

<?php
function long_function() {
   // some process that takes a long time to get data
   // and stores it in the $part2_content
   return $part2_content;
}

结果应该是第 1 部分和第 3 部分 div 内容应该显示。然后,当 long_function() 完成收集数据时,该数据应该在 'part2' 部分输出。

我尝试在 long_function() 的开头放置一个 ob_start(),然后 $part2_content = ob_get_contents() 来存储输出数据(没有 ob_flush)。

我认为我可能需要在 'part2' ID 中添加某种 DOM 'write',但不确定要完成的正确组合。

基于这个完全可以接受的答案:

PHP is a server-side programming language. It gets executed when you request a page. So you cannot execute it after the page has been loaded. If you need to check if something has loaded on the client side, you'll have to use a client-side programming language like JavaScript.

我建议您将此 long_function 放在另一条路线中,并在加载页面期间(或之后)使用 Ajax 请求它。

我相信你不能做服务器端渲染。 php 是后端语言,即运行 hole 脚本文件,然后最后薄打印输出

例如: 在一个函数中: 你不能 return 然后在

之后调用代码
function sayHi(){
    $word = 'hi';
    return "bye";
    echo $word; // this code will never work :) 
}

懒惰?

所以需要使用Clint端渲染

例如使用ajax

AJAX stands for Asynchronous JavaScript and XML. AJAX is a new technique for creating better, faster, and more interactive web applications with the help of XML, HTML, CSS, and Java Script.

根据提供的答案和链接(以及记住 PHP 是服务器端的,因此在呈现页面后无法更改内容),我想出了这段适用于我的代码目的。根据需要把<some-page-on-your-site>改成你想获取的页面。

我包含了一个仅 CSS 的微调器,这样您就可以在 Ajax 请求工作时观看一些东西。

<!DOCTYPE html>
<html>
    <head>
<style>
/* for the loading spinner  */
#spinner {
    display:none;
    position: fixed;
    margin: auto;
    width: 30%;
    background-color: white;
    top:40%;
    left:30%;
    border:thin solid darkblue;
}
.spinner {
 border: 8px solid gray;
    border-radius: 50%;
    border-top: 8px solid green;
    border-right: 8px solid lightgreen;
    border-bottom: 8px solid green;
    border-left: 8px solid lightgreen;
    width: 30px;
    height: 30px;
    -webkit-animation: spin 2s linear infinite;
    animation: spin 2s linear infinite;
}
.spinner_book {
    transform: rotate(360deg);
    -webkit-transform: rotate(360deg);
    overflow: hidden;
    transition-duration: 0.8s;
    transition-property: transform;
}

@-webkit-keyframes spin {
    0% { -webkit-transform: rotate(0deg); }
    100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}
</style>

    </head>
<body onload='loadDoc()'>
    <div>
        <div id='ajax_results'>
            <div align='center'>
                <p align='center' class='spinner'></p>
                <p align='center'>Please wait we get the data ...</p>
            </div>
        </div>
    </div>
<script>
function loadDoc() {
    const xhttp = new XMLHttpRequest();
    xhttp.onload = function() {
        document.getElementById("ajax_results").innerHTML = this.responseText;
        }
    xhttp.open("GET", "<some-page-on-your-site>");
    xhttp.send();
}
</script>

</body>
</html>

您可以将查询参数添加到 <some-page-on-your-site> .

请注意,'ajax_results' div(微调器和消息)中的初始文本将被请求的内容替换。因此在请求完成后无需删除微调器。

感谢帮助我找到解决方案的答案。我希望这能帮助到这里徘徊的其他人。