为什么我在通过 ajax 获取 php 时得到一个文件 2 次?

Why am I getting a file 2 times when fetching a php via ajax?

我很好奇。我有一个像这样的 php 测试文件:

<div class="live-ajax-messages">message from deep ajax</div>

我将使用此函数获取它:

public function get_ajax_messages_template() {
    ob_start();
    include(__DIR__. '/../templates/search-results-messages.php');
    $content = ob_get_contents();
    exit($content);
}

我会得到这样的函数输出:

    load_ajax_messages_template: function(){
        jQuery.ajax({
            url: ajax_url,
            data: 'action=my_action', // executes get_ajax_messages_template
            dataType: 'html',
            type: "GET",
            success: function(response){
                console.log(response); // getting 2 times <div class="live-ajax-messages">message from deep ajax</div>
                //this.results_el.find('.ajax-results').html(response);
            }.bind(this),
        })
    },

基本上,我会得到

<div class="live-ajax-messages">message from deep ajax</div>
<div class="live-ajax-messages">message from deep ajax</div>

为什么?

输出缓冲(ob_*函数)临时缓冲输出。如果脚本在仍有缓冲输出时退出,它将被写入响应。

因此,您在这里缓冲 search-results-messages.php 的输出。调用 ob_get_contents returns 当前缓冲区,但不清除它。

然后,当您调用 exit($contents) 时,它会将内容写入响应,然后刷新 包含内容的输出缓冲区。

这里有两种可能的解决方案。 (1) 是用 ob_get_clean 替换 ob_get_contents 做同样的事情,但清除缓冲区。

另一个(更简单的)解决方案是只包含文件 而没有 输出缓冲,因为无论如何你都想写出它的内容,然后只需调用 exit();没有参数。