На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Бьется кодировка при генерации html
      Добрый день.

      Генерирую очень большую таблицу (10 колонок, 1000+ строк с различными элементами внутри таблицы, иконки, кнопки, текст) на php.
      Страница генерируется около 30 сек, идет обращение к бд и стороннему сайту через curl.
      В случайном месте бьется кодировка, притом она бьется не в местах где я вывожу текст, а бьется даже в тех местах, где я вывожу сам html код.
      К примеру пишу echo '<input type="text" name="zk" value="10">';
      Получаю на странице: echo '<input typ╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪;
      Т.е. бъется сам html код, а не вывод каких то строк, хотя и для строк я везде юзаю mb_convert_encoding, в шапке юзаю:

      header('Content-Type: text/html; charset=utf-8');
      mb_internal_encoding("UTF-8");

      В head юзаю <meta charset="UTF-8">
      php файл сохранял в UTF-8 без BOM

      Отключил ВООБЩЕ вывод текста, иконок и прочей дряни, оставил только циферки. Не помогло. Бьется сам код... То ли проблемы с памятью, то ли с библиотекой curl, то ли таблица слишком большая...
      Если запросы curl отключаю - все работает норм.
      Я не знаю что делать, мб кто с таким сталкивался и поможет...

      user posted image
        Здесь все неправильно, так что неудивительно, что сервер грязно ругается.

        Цитата
        10 колонок, 1000+ строк

        Зачем генерировать такую гигантскую таблицу? Кто будет читать эти 1000+ строк? Если нужно просто сохранить данные для дальнейшей обработки, то лучше выбрать более простой формат, например, CSV. Если данные читаются человеком, то лучше разбить таблицу на страницы вменяемого размера. Если все же нужно (зачем?) представить результаты именно в HTML и именно одним куском, то можно использовать AJAX, на каждом вызове подгружать только часть строк и вставлять результат в итоговую таблицу на стороне клиента.

        Цитата
        Страница генерируется около 30 сек

        30 секунд - это стандартное ограничение времени работы PHP. В качестве экстренной помощи можно увеличить этот лимит (max_execution_time в php.ini), но это тупо и ненадежно (у браузеров и прокси-серверов тоже есть лимиты на время ответа). Вообще же такие длительные операции нужно выполнять в фоновых задачах, а на PHP только генерировать задания, мониторить процесс выполнения и забирать результаты из БД. Если хостинг ничего такого не позволяет, то нужно сменить тип хостинга.

        Цитата
        идет обращение к бд и стороннему сайту через curl

        Дергать curl из обработчика HTTP-запроса, да еще неоднократно, категорически нельзя! Невозможно заранее предсказать, сколько времени потратится на эти запросы, а время ответа ограничено. Если нужен curl, то использовать его надо в фоновых задачах.

        Цитата
        Получаю на странице: echo '<input typ╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪╪;

        Что??? Каждый раз генерируется PHP-скрипт, который генерирует HTML??? Или как это понимать?
          Цитата
          Зачем генерировать такую гигантскую таблицу? Кто будет читать эти 1000+ строк? Если нужно просто сохранить данные для дальнейшей обработки, то лучше выбрать более простой формат, например, CSV. Если данные читаются человеком, то лучше разбить таблицу на страницы вменяемого размера. Если все же нужно (зачем?) представить результаты именно в HTML и именно одним куском, то можно использовать AJAX, на каждом вызове подгружать только часть строк и вставлять результат в итоговую таблицу на стороне клиента.


          Поверьте это нужно и ее читают живые люди, притом в этой таблице есть кнопочки по которым идут ajax запросы к бд. Таблица по сути инструмент для работы с бд. На счет поэтапного вывода. Пробовал все имеющиеся в сети кластеризаторы. результат их работы мне не понравился, был один, не помню названия, более менее приемлемый. После его работы действительно поднялся ФПС при рендеренге страницы, но начались проблемы с прокруткой, по этому избавился от него. А постраничный вывод совсем не подходит для моей задачи.
          А вообще, это все конечно интересно, но проблема то не в методах отрисовки я уверен.


          Цитата
          Дергать curl из обработчика HTTP-запроса, да еще неоднократно, категорически нельзя! Невозможно заранее предсказать, сколько времени потратится на эти запросы, а время ответа ограничено. Если нужен curl, то использовать его надо в фоновых задачах.


          Думаю проблема именно в этом, curl юзаю для обращения api стороннего сайта, а у этого сайта ограничение на количество запросов в секунду. Именно этот этап отнимает львиную долю времени генерирования html страницы.

          Как можно сделать эти обращения в фоновых задачах на php? Я не профи...
          Сообщение отредактировано: Rzonex -
            Цитата
            Поверьте это нужно и ее читают живые люди, притом в этой таблице есть кнопочки по которым идут ajax запросы к бд.

            Что это за задача такая, для которой непременно нужна таблица на тыщу с лишним строк с картинками и кнопками и непременно одним куском, без разбиения и фильтрации? Насколько я понимаю, таких задач не существует.

            Цитата
            После его работы действительно поднялся ФПС при рендеренге страницы

            Ага, то есть уже и браузер кряхтит и давится, но нужно продолжать жрать кактус!
            Кстати, что подразумевается под "ФПС при рендеренге страницы" и как он меряется?

            Цитата
            Как можно сделать эти обращения в фоновых задачах на php?

            Не понял вопроса. Тут либо падежи не вяжутся, либо ответ тривиальный и очевидный, либо, как обычно, отсутствует формулировка проблемы.
              Цитата AVA12 @
              Кстати, что подразумевается под "ФПС при рендеренге страницы" и как он меряется?

              Любая картинка, текст, кнопка отрисовывается видеокартой, браузеры думаю так же работают с directx или opengl.
              Мои собственные наблюдения: браузеры совершенно не оптимизируют рендеринг страницы - рендерят даже то, что не видно.
              Например без кластеризатора у меня таблица отрисовывалась с 14 фпс, с кластеризатором 100 фпс, или около того.
              На экране одно и то же, а фпс разный. А работать при 14 фпс очень неудобно. Но кластеризатор убрал, ибо прокрутка таблицы с ним тормозная.
              Для измерения фпс юзал скрипт, какой точно не помню, вот к примеру похожий https://www.growingwiththeweb.com/2017/12/f...ps-counter.html
              А вот статья про фпс в браузерах https://habr.com/ru/post/319302/

              Цитата
              Ага, то есть уже и браузер кряхтит и давится, но нужно продолжать жрать кактус!

              Позабавило :D

              Проблему я решил, вы меня натолкнули на мысль сказав про ограничения при загрузке страницы. Я раньше выдавал код кусками в цикле примерно так:
              ExpandedWrap disabled
                for (.... {
                  echo '<input...
                }


              Сделал так:
              ExpandedWrap disabled
                for (.... {
                  $html.= '<input...
                }
                echo $html;

              Т.е. отдаю браузеру код одним куском и все заработало.
              Видимо если отдавать браузеру код кусками, много кода, то при длительной прогрузке он спотыкается и сбивается кодировка.
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0687 ]   [ 14 queries used ]   [ Generated: 16.07.19, 02:57 GMT ]