Почему это работает на одном сайте, а не на другом? - PullRequest
0 голосов
/ 14 апреля 2020

Я использую этот js внутри php, чтобы показать имена файлов при их повторении. У меня это отлично работает на 6 разных сайтах, все они имеют одинаковый точный код (плагин WordPress). Но, с другой стороны, html не обновляется, пока php не завершится. Есть 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();

Спасибо!

edit За запрос

        $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 голосов
/ 15 апреля 2020

Хорошо, проблема в том, что какой-то другой плагин или тема на этом сайте создавал дополнительный выходной буфер и не очищал его, когда закончил. Когда я 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)
  }
}

Это означало, что каждый посылаемый мной грипп sh или ob_flu sh явно сбрасывал неправильный буфер и ничего не выводил. Итак, решение, которое я придумал, состояло в том, чтобы проверить, прежде чем я начал отправлять вывод, чтобы увидеть, сколько там буферов. Если их было больше одного, я очищал и закрывал все буферы, кроме одного. И, что удивительно, он начал работать.

Вот хакерский код, который я быстро придумал:

<code>```
        $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 '
'; if (count ($ buffers)> 1) {for ($ i = 0; $ i
0 голосов
/ 14 апреля 2020

Есть пара вещей, с которыми вы пытаетесь 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, он собирается в буфер, пока не будет сброшен ... после первый foreach - затем буфер мог бы стать бесполезным. Если это так, вы можете открывать буфер на каждой итерации:

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path), RecursiveIteratorIterator::SELF_FIRST);        
foreach ($objects as $filename => $value) {
     // Start the buffer here.
     ob_start();
     // 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.
     // Flush the buffer.
     ob_flush();
     flush();
     // repeat
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...