Здравствуйте! На jQuery есть такой плагин. Вопрос заключается в следующем, как при Ajax запросе вывести полосу загрузки страницы? Просто так получается что ответ может приходить от 10 секунд до 3-х минут и вот чтобы пользователь не сидел просто так и не смотрел в пустой экран было бы не плохо показывать ему сколько осталось процентов до конца загрузки. Как это можно реализовать? Может можно как то узнать сколько весит вся страница байт и сколько осталось получить, если да, то как это узнать? вариант с gif анимацией загрузки не подходит. Заранее большое спасибо!
А через прослоечку? Показывай типа "работаю", раз в две секи дёргай свой скрипт, а он откуда-нибибудь добывает промежуточный результат.
Люди уже давно от прогрессбаров отказываются. Даже в той же венде прогрессбары на спиннеры позаменяли почти везде. Спиннер наше все. Он не раздражает и не показывает реальный прогресс, но он крутится и дает надежду, что вот вот все разрулится. З.Ы. 3 минуты - это ппц долго. Может имеет смысл получать данные только один раз и кэшировать их, а отдавать потом оттуда?
Нет, такого смысла нет( Добавлено спустя 36 секунд: Получается никак нельзя посмотреть на сколько страница загружена??? Добавлено спустя 54 минуты 51 секунду: А можно ли как то отдать пользователю данные до завершения работы скрипта?
Вот какая идея ко мне пришла... На первой странице есть форма которую пользователь заполяет На второй странице есть цикл, который делает запросы по апи, (по этому так долго) Я заведома знаю сколько будет всего запросов, то есть знаю сколько раз цикл будет исполняться. При каждом цикле будет высчитываться процент выполнения по формуле (n/count)*100 =% В конце выполнения каждого круга цикла считается процент и записывается в сессию. Пока другая страница не будет загружена, первая продолжает работать и все Java скрипты на ней. При отправке формы активируется setInterval который аяксом отпрашивает 3 скрипт в котором просто написано 2 строчки кода: Код (PHP): <?php session_start(); echo $_SESSION['status']; //обновляется каждый раз при прохождении цикла во второй странице ?> Думал все заработает, но у меня выдает ошибку что нет такого элемента массива сессии $_SESSION['status'] Пока больше идей нет, может чего делаю не так? Добавлено спустя 6 минут 55 секунд: Проще говоря у меня есть скрипт типа: Код (PHP): for($i=1; $i<=100; $i++) { // какой то код } как мне узнать на сколько процентов выполнился данный скрипт?
Да вы представляете сколько у меня будет лишней нагрузки на сервер из за одной полосы загрузки? У меня сайте большая посещаемость, так что данный вариант не подходит
а сессия ты думаешь где хранится на сервере? теже файлы Добавлено спустя 1 минуту 39 секунд: ну тогда memchache
Здравствуйте, у меня есть строка: Код (Text): 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): $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";'; print_r(unserialize($str)); Но у меня выдает ошибку: Код (Text): Notice: unserialize(): Error at offset 0 of 183 bytes
Может ну ее, полосу загрузки, раз так? И да, до 3 минут - это именно время загрузки, или время ответа сервиса, а загрузка происходит быстро? Это очень важно. От чего зависит разброс 10сек-3мин? Объем данных всегда один и тот же? Просто, если дело именно во времени ответа, то тут, для написания прогресс-бара надо писать скрипт-Вангу.
Re: Строку в массив Вроде все пробовал, не подходит! Мне нужно чтобы в результате получился массив в виде $array['status'] = 95 $array['country'] = 2 и т.д. Вообще строка похожа на строку которую можно превратить в массим, я думал мне поможет функция unserialize(), но там видимо формат не совсем подходит. Может кто знает что тут можно сделать? Добавлено спустя 1 минуту 40 секунд: Долгая история) В общем пишу модуль под diafanCMS, там движок хранит сессии в бд вот в таком виде, с модулей можно легко достать значения, средствами самой CMS так сказать, но мне нужно получить доступ не из модуля, вот не знаю как мне быть
Да вот не могу ее найти, думал что может какие то стандартные средства используются... нашел только файл где описываются функции работы с сессией якобы, вот он: Код (PHP): <?php /** * Diafan.CMS */ if (! defined('DIAFAN')) { include dirname(dirname(__FILE__)).'/includes/404.php'; } /** * Session * * Работа с сессиями в пользовательской части */ class Session { /** * Стартует сессию * * @return boolean true */ public static function init() { session_cache_limiter('private_no_expire'); session_name('SESS'. md5($_SERVER['HTTP_HOST'])); session_set_save_handler(array('Session', 'open'), array('Session', 'close'), array('Session', 'read'), array('Session', 'write'), array('Session', 'destroy'), array('Session', 'gc')); session_start(); return true; } /** * Открывает сессию * * @param string $save_path * @param string $session_name * @return boolean true */ public static function open($save_path, $session_name) { return true; } /** * Закрывает сессию освобождает ресурсы * * @return boolean true */ public static function close() { return true; } /** * Читает сессию * * @param string $key идентификатор сессии * @return string серилизованные данные сессии */ public static function read($key) { global $diafan; register_shutdown_function('session_write_close'); if (! isset($_COOKIE[session_name()])) { return ''; } $user = DB::fetch_object(DB::query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.id = s.user_id" ." WHERE s.session_id = '%s' AND s.hostname='%s' AND s.user_agent='%s'", $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT'])); if ($user && $user->id > 0) { $diafan->_user->set($user); return $user->session; } else { $session = DB::query_result("SELECT session FROM {sessions} WHERE session_id = '%s' AND hostname='%s' AND user_agent='%s'", $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']); $diafan->_user->anonymous($session); return $session; } } /** * Записывает данные в сессию * * @param string $key идентификатор сессии * @param string $value серилизованные данные сессии * @return boolean true */ public static function write($key, $value) { global $diafan; $result = DB::query("SELECT session_id FROM {sessions} WHERE session_id = '%s' AND hostname='%s' AND user_agent='%s'", $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']); if (! DB::num_rows($result)) { if ($diafan->_user->id || $value || count($_COOKIE)) { if (DB::query_result("SELECT COUNT(*) FROM {sessions} WHERE session_id='%h'", $key)) { DB::query("DELETE FROM {sessions} WHERE session_id='%h'", $key); } DB::query("INSERT INTO {sessions} (session_id, user_id, hostname, user_agent, session, timestamp)" ." VALUES ('%s', %d, '%s', '%s', '%s', %d)", $key, $diafan->_user->id, $_SERVER["REMOTE_ADDR"], $_SERVER['HTTP_USER_AGENT'], $value, time()); } } else { DB::query("UPDATE {sessions} SET user_id = %d, session = '%s', timestamp = %d WHERE session_id = '%s'", $diafan->_user->id, $value, time(), $key); } return true; } /** * Чистит мусор - удаляет сессии старше $lifetime * @param integer $lifetime время хранения сессии в секундах * @return boolean true */ public static function gc($lifetime = 1209600) // 2 weeks { DB::query("DELETE FROM {sessions} WHERE timestamp < %d", time() - $lifetime); return true; } /** * Удаляет ссессию * @param string $key идентификатор сессии * @return boolean true */ public static function destroy($key) { DB::query("DELETE FROM {sessions} WHERE session_id = '%s' AND hostname='%s' AND user_agent='%s'", $key, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']); return true; } /** * Определяет продолжительность сессии * * @return boolean true */ public static function duration() { if(! empty($_POST['remember_me'])) { $duration = 1209600; // 2 weeks } else { $duration = 0; } $params = session_get_cookie_params(); if($params['lifetime'] != $duration) { session_set_cookie_params($duration); session_regenerate_id(false); } return true; } public static function prepare($config) { if(isset($config)) { self::$config; } } } Но тут я ничего не нашел(
Код (PHP): $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";'; $arr = explode(';', $str); foreach ($arr as $str) { preg_match('~(.*?)\|.*\:\"?(.*?)\"?$~', $str, $matches); $out[$matches[1]]= $matches[2]; }
Не могу не вспомнить. Приходит разработчик виндового диалога копирования файлов домой и спрашивает: - Дорогая, а обед скоро? - До обеда осталось: 15 секунд... 14 часов... 9 минут... 8.5 минут...