За последние 24 часа нас посетили 17439 программистов и 1720 роботов. Сейчас ищут 1506 программистов ...

Загрузка страницы

Тема в разделе "JavaScript и AJAX", создана пользователем VaneS, 30 сен 2014.

  1. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Здравствуйте! На jQuery есть такой плагин. Вопрос заключается в следующем, как при Ajax запросе вывести полосу загрузки страницы?
    Просто так получается что ответ может приходить от 10 секунд до 3-х минут и вот чтобы пользователь не сидел просто так и не смотрел в пустой экран было бы не плохо показывать ему сколько осталось процентов до конца загрузки. Как это можно реализовать?
    Может можно как то узнать сколько весит вся страница байт и сколько осталось получить, если да, то как это узнать?
    вариант с gif анимацией загрузки не подходит.
    Заранее большое спасибо!
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Почему так долго?
     
  3. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Потому что мой скрипт делает запрос по API к другому сервису,а тот ооочень долго отвечает...
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А через прослоечку? Показывай типа "работаю", раз в две секи дёргай свой скрипт, а он откуда-нибибудь добывает промежуточный результат.
     
  5. dcc0

    dcc0 Активный пользователь

    С нами с:
    27 июн 2014
    Сообщения:
    214
    Симпатии:
    4
    Картинку поставь с анимацией с каким-нибудь стандартным значком обновления.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Люди уже давно от прогрессбаров отказываются. Даже в той же венде прогрессбары на спиннеры позаменяли почти везде. Спиннер наше все. Он не раздражает и не показывает реальный прогресс, но он крутится и дает надежду, что вот вот все разрулится.

    З.Ы. 3 минуты - это ппц долго. Может имеет смысл получать данные только один раз и кэшировать их, а отдавать потом оттуда?
     
  7. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Нет, такого смысла нет(

    Добавлено спустя 36 секунд:
    Получается никак нельзя посмотреть на сколько страница загружена???

    Добавлено спустя 54 минуты 51 секунду:
    А можно ли как то отдать пользователю данные до завершения работы скрипта?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А ты думаешь что она частично там грузится?
     
  9. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Та неее, я хотел узнать процент на сколько она загружена.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А ты думаешь она не вся сразу падает?
     
  11. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Вот какая идея ко мне пришла...
    На первой странице есть форма которую пользователь заполяет
    На второй странице есть цикл, который делает запросы по апи, (по этому так долго) Я заведома знаю сколько будет всего запросов, то есть знаю сколько раз цикл будет исполняться. При каждом цикле будет высчитываться процент выполнения по формуле (n/count)*100 =% В конце выполнения каждого круга цикла считается процент и записывается в сессию.

    Пока другая страница не будет загружена, первая продолжает работать и все Java скрипты на ней. При отправке формы активируется setInterval который аяксом отпрашивает 3 скрипт в котором просто написано 2 строчки кода:
    Код (PHP):
    1. <?php 
    2. echo $_SESSION['status']; //обновляется каждый раз при прохождении цикла во второй странице
    3. ?>
    Думал все заработает, но у меня выдает ошибку что нет такого элемента массива сессии $_SESSION['status']
    Пока больше идей нет, может чего делаю не так?

    Добавлено спустя 6 минут 55 секунд:
    Проще говоря у меня есть скрипт типа:
    Код (PHP):
    1. for($i=1; $i<=100; $i++)
    2. {
    3.       // какой то код
    4. }
    5.  
    как мне узнать на сколько процентов выполнился данный скрипт?
     
  12. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    пиши в файл. читай из файла

    Добавлено спустя 16 секунд:
    или БД
     
  13. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Да вы представляете сколько у меня будет лишней нагрузки на сервер из за одной полосы загрузки?
    У меня сайте большая посещаемость, так что данный вариант не подходит
     
  14. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а сессия ты думаешь где хранится на сервере? теже файлы

    Добавлено спустя 1 минуту 39 секунд:
    ну тогда memchache
     
  15. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Здравствуйте, у меня есть строка:
    Код (Text):
    1. status|d:95;country|s:2:"RU";city|s:3:"MOW";zone|s:3:"ALL";date_in|s:10:"30.09.2014";date_out|s:10:"01.10.2014";rooms|s:1:"1";adults1|s:1:"1";d_in|s:8:"20140930";d_out|s:8:"20141001";
    Как мне эту строку превратить в массив?
    Заранее большое спасибо!

    Добавлено спустя 3 минуты 15 секунд:
    Попытался сделать вот так:
    Код (PHP):
    1. $str = 'status|d:95;country|s:2:"RU";city|s:3:"MOW";zone|s:3:"ALL";date_in|s:10:"30.09.2014";date_out|s:10:"01.10.2014";rooms|s:1:"1";adults1|s:1:"1";d_in|s:8:"20140930";d_out|s:8:"20141001";';
    Но у меня выдает ошибку:
    Код (Text):
    1. Notice: unserialize(): Error at offset 0 of 183 bytes
     
  16. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Строку в массив

    Где взял строку
     
  18. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Re: Строку в массив

    А, блин, на саму строку не обратил внимание)
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Может ну ее, полосу загрузки, раз так?

    И да, до 3 минут - это именно время загрузки, или время ответа сервиса, а загрузка происходит быстро? Это очень важно. От чего зависит разброс 10сек-3мин? Объем данных всегда один и тот же? Просто, если дело именно во времени ответа, то тут, для написания прогресс-бара надо писать скрипт-Вангу.
     
  20. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Re: Строку в массив

    Вроде все пробовал, не подходит!
    Мне нужно чтобы в результате получился массив в виде
    $array['status'] = 95
    $array['country'] = 2
    и т.д.
    Вообще строка похожа на строку которую можно превратить в массим, я думал мне поможет функция unserialize(), но там видимо формат не совсем подходит.
    Может кто знает что тут можно сделать?

    Добавлено спустя 1 минуту 40 секунд:
    Долгая история)
    В общем пишу модуль под diafanCMS, там движок хранит сессии в бд вот в таком виде, с модулей можно легко достать значения, средствами самой CMS так сказать, но мне нужно получить доступ не из модуля, вот не знаю как мне быть
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Строку в массив

    Спизди функу
     
  22. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Да вот не могу ее найти, думал что может какие то стандартные средства используются... нашел только файл где описываются функции работы с сессией якобы, вот он:
    Код (PHP):
    1. <?php
    2. /**
    3.  * Diafan.CMS
    4.  */
    5.  
    6. if (! defined('DIAFAN'))
    7. {
    8.     include dirname(dirname(__FILE__)).'/includes/404.php';
    9. }
    10.  
    11. /**
    12.  * Session
    13.  * 
    14.  * Работа с сессиями в пользовательской части
    15.  */
    16. class Session
    17. {
    18.     /**
    19.      * Стартует сессию
    20.      * 
    21.      * @return boolean true
    22.      */
    23.     public static function init()
    24.     {
    25.         session_cache_limiter('private_no_expire');
    26.         session_name('SESS'. md5($_SERVER['HTTP_HOST']));
    27.         session_set_save_handler(array('Session', 'open'), array('Session', 'close'), array('Session', 'read'),
    28.                                  array('Session', 'write'), array('Session', 'destroy'), array('Session', 'gc'));
    29.         session_start();
    30.         return true;
    31.     }
    32.  
    33.     /**
    34.      * Открывает сессию
    35.      * 
    36.      * @param string $save_path
    37.      * @param string $session_name
    38.      * @return boolean true
    39.      */
    40.     public static function open($save_path, $session_name)
    41.     {
    42.         return true;
    43.     }
    44.  
    45.     /**
    46.      * Закрывает сессию освобождает ресурсы
    47.      * 
    48.      * @return boolean true
    49.      */
    50.     public static function close()
    51.     {
    52.         return true;
    53.     }
    54.  
    55.     /**
    56.      * Читает сессию
    57.      * 
    58.      * @param string $key идентификатор сессии
    59.      * @return string серилизованные данные сессии
    60.      */
    61.     public static function read($key)
    62.     {
    63.         global $diafan;
    64.         register_shutdown_function('session_write_close');
    65.     
    66.         if (! isset($_COOKIE[session_name()]))
    67.         {
    68.             return '';
    69.         }
    70.         $user = DB::fetch_object(DB::query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.id = s.user_id"
    71.                                            ." WHERE s.session_id = '%s' AND s.hostname='%s' AND s.user_agent='%s'",
    72.                                            $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']));
    73.  
    74.  
    75.         if ($user && $user->id > 0)
    76.         {
    77.             $diafan->_user->set($user);
    78.             return $user->session;
    79.         }
    80.         else
    81.         {
    82.             $session = DB::query_result("SELECT session FROM {sessions} WHERE session_id = '%s' AND hostname='%s' AND user_agent='%s'",
    83.                                         $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']);
    84.             $diafan->_user->anonymous($session);
    85.             return $session;
    86.         }
    87.     }
    88.  
    89.     /**
    90.      * Записывает данные в сессию
    91.      * 
    92.      * @param string $key идентификатор сессии
    93.      * @param string $value серилизованные данные сессии
    94.      * @return boolean true
    95.      */
    96.     public static function write($key, $value)
    97.     {
    98.         global $diafan;
    99.         $result = DB::query("SELECT session_id FROM {sessions} WHERE session_id = '%s' AND hostname='%s' AND user_agent='%s'",
    100.                             $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']);
    101.  
    102.         if (! DB::num_rows($result))
    103.         {
    104.             if ($diafan->_user->id || $value || count($_COOKIE))
    105.             {
    106.                 if (DB::query_result("SELECT COUNT(*) FROM {sessions} WHERE session_id='%h'", $key))
    107.                 {
    108.                     DB::query("DELETE FROM {sessions} WHERE session_id='%h'", $key);
    109.                 }
    110.                 DB::query("INSERT INTO {sessions} (session_id, user_id, hostname, user_agent, session, timestamp)"
    111.                           ." VALUES ('%s', %d, '%s', '%s', '%s', %d)",
    112.                           $key, $diafan->_user->id, $_SERVER["REMOTE_ADDR"], $_SERVER['HTTP_USER_AGENT'], $value, time());
    113.             }
    114.         }
    115.         else
    116.         {
    117.             DB::query("UPDATE {sessions} SET user_id = %d, session = '%s', timestamp = %d WHERE session_id = '%s'",
    118.                       $diafan->_user->id, $value, time(), $key);
    119.         }
    120.         return true;
    121.     }
    122.  
    123.     /**
    124.      * Чистит мусор - удаляет сессии старше $lifetime
    125.      * @param integer $lifetime время хранения сессии в секундах
    126.      * @return boolean true
    127.      */
    128.     public static function gc($lifetime = 1209600) // 2 weeks
    129.     {
    130.         DB::query("DELETE FROM {sessions} WHERE timestamp < %d", time() - $lifetime);
    131.         return true;
    132.     }
    133.  
    134.     /**
    135.      * Удаляет ссессию
    136.      * @param string $key идентификатор сессии
    137.      * @return boolean true
    138.      */
    139.     public static function destroy($key)
    140.     {
    141.         DB::query("DELETE FROM {sessions} WHERE session_id = '%s' AND hostname='%s' AND user_agent='%s'",
    142.                   $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']);
    143.         return true;
    144.     }
    145.  
    146.     /**
    147.      * Определяет продолжительность сессии
    148.      * 
    149.      * @return boolean true
    150.      */
    151.     public static function duration()
    152.     {
    153.         if(! empty($_POST['remember_me']))
    154.         {
    155.             $duration = 1209600; // 2 weeks
    156.         }
    157.         else
    158.         {
    159.             $duration = 0;
    160.         }
    161.         $params = session_get_cookie_params();
    162.         if($params['lifetime'] != $duration)
    163.         {
    164.             session_set_cookie_params($duration);
    165.             session_regenerate_id(false);
    166.         }
    167.         return true;
    168.     }
    169.  
    170.     public static function prepare($config)
    171.     {
    172.         if(isset($config))
    173.         {
    174.             self::$config;
    175.         }
    176.     }
    177. }
    Но тут я ничего не нашел(
     
  23. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Код (PHP):
    1. $str = 'status|d:95;country|s:2:"RU";city|s:3:"MOW";zone|s:3:"ALL";date_in|s:10:"30.09.2014";date_out|s:10:"01.10.2014";rooms|s:1:"1";adults1|s:1:"1";d_in|s:8:"20140930";d_out|s:8:"20141001";';
    2. $arr = explode(';', $str);
    3. foreach ($arr as $str)  {
    4.    preg_match('~(.*?)\|.*\:\"?(.*?)\"?$~', $str, $matches);
    5.    $out[$matches[1]]= $matches[2];
    6. }
     
  24. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Notice: Undefined offset: 1 in
    Notice: Undefined offset: 2 in
     
  25. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Не могу не вспомнить.
    Приходит разработчик виндового диалога копирования файлов домой и спрашивает:
    - Дорогая, а обед скоро?
    - До обеда осталось: 15 секунд... 14 часов... 9 минут... 8.5 минут...