为什么这会在一个站点上起作用而在另一个站点上却不起作用?

时间:2020-04-14 18:45:29

标签: javascript wordpress output-buffering

我正在php内使用此js来显示文件名,因为它们是经过迭代的。我在6个不同的网站上都能完美运行,它们都具有完全相同的代码(WordPress插件)。但是,另一方面,直到php完成后html才更新。这些站点中有4个位于同一共享主机上,因此不起作用的站点的服务器设置应与不起作用的站点相同。就像ob没有启动或刷新一样。

    add_action('init', array($this, 'Do_output_buffer'));

    function Do_output_buffer() {
        ob_start();
    }
   echo "<script>
      const element = document.querySelector('#filefind');
      </script>";
   @ob_flush();
   @flush();
   echo "<script>
        element.innerHTML = `<div>" . $value . "</div>`;
        </script>";
   @ob_flush();
   @flush();

谢谢!

编辑 每个请求

        $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path), RecursiveIteratorIterator::SELF_FIRST);        
        foreach ($objects as $filename => $value) {
             echo "<script>element.innerHTML = `<div>" . $filename . "</div>`;  
             </script>";
             @ob_flush();
             @flush();
        }

    ```

2 个答案:

答案 0 :(得分:1)

您尝试echo进行的操作有几件事。

  1. 回声中的反引号可能会引起问题
  2. </script>的结尾并没有得到回应。

我将代码更改为此:

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path), RecursiveIteratorIterator::SELF_FIRST);        
foreach ($objects as $filename => $value) {
     // Enclose the echo in single quotes and use double quotes for the actual JS.
     echo '<script>element.innerHTML = "<div>' . $filename . '</div>";</script>';    
     // Remove the error suppression so you can actual see errors.
     ob_flush();
     flush();
}

我也不确定您的主插件如何与Do_output_buffer()函数一起使用-因为它是在init上调用的,所以它将一直缓冲直到被刷新……在第一个{{1}之后}-然后缓冲区可能变得无用。如果是这种情况,您可以在每次迭代中打开缓冲区:

foreach

答案 1 :(得分:1)

好吧,问题是一个站点上的其他插件或主题正在创建额外的输出缓冲区,并且在完成时并没有清除它。当我var_dumped ob_get_status(true)时,我看到了。

  [0]=>
  array(7) {
    ["name"]=>
    string(22) "default output handler"
    ["type"]=>
    int(0)
    ["flags"]=>
    int(112)
    ["level"]=>
    int(0)
    ["chunk_size"]=>
    int(0)
    ["buffer_size"]=>
    int(16384)
    ["buffer_used"]=>
    int(0)
  }
  [1]=>
  array(7) {
    ["name"]=>
    string(22) "default output handler"
    ["type"]=>
    int(0)
    ["flags"]=>
    int(112)
    ["level"]=>
    int(1)
    ["chunk_size"]=>
    int(0)
    ["buffer_size"]=>
    int(32768)
    ["buffer_used"]=>
    int(28778)
  }
}

这意味着我发送的每个flush或ob_flush显然都刷新了错误的缓冲区,并且什么也不输出。因此,我想到的解决方案是在开始发送输出之前进行检查,以查看有多少缓冲区。如果有多个缓冲区,我将刷新并关闭除一个缓冲区之外的所有缓冲区。而且,令人惊讶的是,它开始起作用。

这是我很快想到的hacky代码:

```
        $buffers = ob_get_status(true);

        //shows the array of how many buffers are active.
        //echo '<pre>';
        //echo 'Buffer Count: '. count($buffers).'<br>';
        //var_dump(ob_get_status(true));
        //echo '</pre>';

        if (count($buffers) > 1) {
            for ($i=0;$i<count($buffers)-1;$i++) {
                ob_end_flush();
            }
        }
```

感谢@disinfor的回复,并帮助我将其表达出来。

相关问题