我正在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();
}
```
答案 0 :(得分:1)
您尝试echo
进行的操作有几件事。
</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的回复,并帮助我将其表达出来。