Думаю мой вопрос не сложен)
Как сделать чтобы пока формируется страница пользователю показывалась страница - заставка несущая информацию о том что запрошенная страница грузится?
дело в том что на моем сайте есть мониторинг игровых серверов и время формирования страницы мониторинга чуть больше суммы пингов серверов ( а если некоторые сервера не доступны то их пинг 2секунды) - хотелось бы сделать чтобы во время пингования PHP сценарием серверов отображался баннер и как только страница полностью готова она отправлялась пользователю
загрузочный баннер
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
>>ping.php<<
timestamp = DATE + TIME
showBannerHTML(timestamp); // see clientHTML
exec("ping.bin timestamp&")
-------------------------
>>ping.bin<<
ping all servers
createfile("file" + timestamp)
-------------------------
>>test.php<<
if (fileexists("file" + timestamp)) {
showHTML( data from file );
remove_file ("file"+timestamp);
} else {
showEmpty();
}
-------------------------
clientHTML:
showHTMLBanner
innerHTML = "";
while(innerHTML is empty) {
innerHTML = AJAX : test.php?timestamp=$timestamp
wait( 100 miliseconds)
}
removeHTMLBanner
document.setInnerHTML(innerHTML);
-------------------------
я бы делал примерно так ;-)
если что-то непонятно - пиши :-D
P.S. Единственная проблема, если пользователь не дождётся конца и уйдёт со страницы, перестанет вызываться "test.php" и файлик не удалится ...
можно какой-нибудь крон по ночам запускать, чтобы удалять все такие файлики старше одного часа
timestamp = DATE + TIME
showBannerHTML(timestamp); // see clientHTML
exec("ping.bin timestamp&")
-------------------------
>>ping.bin<<
ping all servers
createfile("file" + timestamp)
-------------------------
>>test.php<<
if (fileexists("file" + timestamp)) {
showHTML( data from file );
remove_file ("file"+timestamp);
} else {
showEmpty();
}
-------------------------
clientHTML:
showHTMLBanner
innerHTML = "";
while(innerHTML is empty) {
innerHTML = AJAX : test.php?timestamp=$timestamp
wait( 100 miliseconds)
}
removeHTMLBanner
document.setInnerHTML(innerHTML);
-------------------------
я бы делал примерно так ;-)
если что-то непонятно - пиши :-D
P.S. Единственная проблема, если пользователь не дождётся конца и уйдёт со страницы, перестанет вызываться "test.php" и файлик не удалится ...
можно какой-нибудь крон по ночам запускать, чтобы удалять все такие файлики старше одного часа
на скока я понял - это не на php))))) 
а как бы ты это сделал именно на php
потому что именно сейчас я на практическом применении изучаю php (я вообще все тока на практике изучаю) поэтому хотелось бы не отклоняться от курса
и мне почемуто казалось что все гораздо проще

а как бы ты это сделал именно на php
потому что именно сейчас я на практическом применении изучаю php (я вообще все тока на практике изучаю) поэтому хотелось бы не отклоняться от курса
и мне почемуто казалось что все гораздо проще
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
это алгоритм, так сказать.
тебе казалось, что всё гораздо проще,- напиши, как ты себе это представлял,
возможно я действительно усложняю что-то без надобности.
1. "ping.php" - Файл, который запрашивает пользователь
http://www.server.com/ping.php
создаёт метку текущего времени // timestamp = DATE + TIME
(она уникальна для разных пользователей, заходящих на страницу)
затем "возвращает в браузер" твой баннер // showBannerHTML(timestamp);
после чего запускает процесс в бэкграунде системы, // exec("ping.bin $timestamp&");
который будет делать те самые пинги.
я исходил из того, что большинство серверов бегут на *nix подобных системах,
потому и написал: exec("ping.bin $timestamp&");
что значит: запусти программу "ping.bin" с параметром "$timestamp" и доллар - в бэкграунде,
то есть вернись сразу в место вызова, а программа пусть себе бежит
2. "ping.bin" опять же, *nix бинарный файл, может быть bash, но может быть написан и как PHP
он принимает параметр "timestamp" (важно для создания имени файла)
и бежит себе где-то, не важно где и пингует сервера,
как только он закончил своё задание, он создаёт файл с определённым именем: "file"+timestamp,
таким образом мы гарантируем, что имена файлов будут уникальными
3. "test.php" служебный, так сказать, PHP скрипт,
который проверяет, создал ли "ping.bin" файл или нет.
[для синхронизации "ping.bin" и "test.php", оба скрипта получают одинаковые "timestamp" (метку времени)]
если создал - парсит его (возможно) и создаёт из него красивый HTML, готовый быть показанным пользователю,
иначе возвращает пустой HTML документ
4. "clientHTML" (вот здесь-то и происходят чудеса)
это HTML + JS, созданный в пункте 1.
веб страничка, которую получил пользователь,
делает запрос каждые 100 милисекунд скрипту test.php
(который должен быть так же доступен через веб).
[Я бы предложил делать этот запрос через AJAX (Asynchronous JavaScript and XML)
то есть это НЕ PHP, это JavaScript
хотя есть и другие варианты]
и если test.php возвращает пустую страницу, - ждёт дальше,
если же нет, убирает баннер (при помощи JS) и выдаёт содержание полученного HTML документа
-----
вот общая идея, которая пришла мне в голову, когда я прочитал суть твоей проблемы.
если идея не понятна совсем, либо предложи свою, либо подожди, пока кто-то предложет другую.
если же не понятны какие-то пункты моей идеи - спрашивай, что смогу - обьясню.
тебе казалось, что всё гораздо проще,- напиши, как ты себе это представлял,
возможно я действительно усложняю что-то без надобности.
1. "ping.php" - Файл, который запрашивает пользователь
http://www.server.com/ping.php
создаёт метку текущего времени // timestamp = DATE + TIME
(она уникальна для разных пользователей, заходящих на страницу)
затем "возвращает в браузер" твой баннер // showBannerHTML(timestamp);
после чего запускает процесс в бэкграунде системы, // exec("ping.bin $timestamp&");
который будет делать те самые пинги.
я исходил из того, что большинство серверов бегут на *nix подобных системах,
потому и написал: exec("ping.bin $timestamp&");
что значит: запусти программу "ping.bin" с параметром "$timestamp" и доллар - в бэкграунде,
то есть вернись сразу в место вызова, а программа пусть себе бежит
2. "ping.bin" опять же, *nix бинарный файл, может быть bash, но может быть написан и как PHP
он принимает параметр "timestamp" (важно для создания имени файла)
и бежит себе где-то, не важно где и пингует сервера,
как только он закончил своё задание, он создаёт файл с определённым именем: "file"+timestamp,
таким образом мы гарантируем, что имена файлов будут уникальными
3. "test.php" служебный, так сказать, PHP скрипт,
который проверяет, создал ли "ping.bin" файл или нет.
[для синхронизации "ping.bin" и "test.php", оба скрипта получают одинаковые "timestamp" (метку времени)]
если создал - парсит его (возможно) и создаёт из него красивый HTML, готовый быть показанным пользователю,
иначе возвращает пустой HTML документ
4. "clientHTML" (вот здесь-то и происходят чудеса)
это HTML + JS, созданный в пункте 1.
веб страничка, которую получил пользователь,
делает запрос каждые 100 милисекунд скрипту test.php
(который должен быть так же доступен через веб).
[Я бы предложил делать этот запрос через AJAX (Asynchronous JavaScript and XML)
то есть это НЕ PHP, это JavaScript
хотя есть и другие варианты]
и если test.php возвращает пустую страницу, - ждёт дальше,
если же нет, убирает баннер (при помощи JS) и выдаёт содержание полученного HTML документа
-----
вот общая идея, которая пришла мне в голову, когда я прочитал суть твоей проблемы.
если идея не понятна совсем, либо предложи свою, либо подожди, пока кто-то предложет другую.
если же не понятны какие-то пункты моей идеи - спрашивай, что смогу - обьясню.