Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sleep, принцип блокирования 
:(
    Опции темы
Apelsin
Дата 8.9.2011, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 20.4.2009

Репутация: нет
Всего: 1



Добрый день.

Необходимо раз в N секунд проверять были ли произведены какие-либо обновления в базе данных.
Каким образом правильно это сделать?

Пример:
Код

// вычислим текущее количество пользователей
$query = "SELECT count(id) AS cnt FROM users";
$res = mysql_query($query);
$arr = mysql_fetch_assoc($res);
$cnt = $arr['cnt'];

// количество опросов на одну сессию
$count_query = 10;

$i = 0;
while($i < $count_query)
{
    $res = mysql_query($query);
    $arr = mysql_fetch_assoc($res);
    $cntNEW = $arr['cnt'];
    if($cnt != $cntNEW) {echo "Количество записей изменено"; break;}    
    sleep(1);    
    $i++;
}


Верна ли логика? Мне кажется, что тут какие-то проблемы с функцией sleep - очень долго происходит реакция на обновление записей.

Много ли это - 1 запрос в секунду?

PM MAIL   Вверх
CruorVult
Дата 8.9.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 9
Всего: 28



Цитата(Apelsin @  8.9.2011,  11:35 Найти цитируемый пост)
Необходимо раз в N секунд проверять были ли произведены какие-либо обновления в базе данных.

Зачем такая логика? Если не было запросов от клиентов на получения количества юзеров - то зачем зря напрягать сервер, темболее каждую секунду.
Обычно в том месте, где нужно показать к-во пользователей делать обычный 
Код

$query = "SELECT count(id) AS cnt FROM users";


Если же требуется оптимизация, то можно кроном выполнять переодически подсчет юзеров(не менее раз в минуту) и писать в кеш.

Добавлено через 4 минуты и 31 секунду
ааа, стоп! Я думал юзеров онлайн!

Тогда просто писать в кеш количество юзеров и при добавлении новых переписывать кеш
PM MAIL Skype   Вверх
Apelsin
Дата 8.9.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 20.4.2009

Репутация: нет
Всего: 1



Цитата(CruorVult @  8.9.2011,  11:54 Найти цитируемый пост)
Зачем такая логика? Если не было запросов от клиентов на получения количества юзеров - то зачем зря напрягать сервер, темболее каждую секунду.
Обычно в том месте, где нужно показать к-во пользователей делать обычный 


Код был представлен в качестве примера. На самом деле пишу игрушку логическую (для саморазвития).
И с помощью принципа показанного в примере динамически обновляю список текущих игр.

Т.е. пользователь зашел на страницу, тут же создалось с сервером соединение ($.ajax... Вроде как такой принцип называют long polling - создается соединение с помощью js и пока на сервере не произошло изменений, он ничего не выводит и не останавливает выполнение скрипта. Как только обновление произошло - скрипт выводит нужные данные (такой способ инициации обновления со стороны сервера), и в веб браузере происходит их обработка).

Наглядно можно посмотреть тут: http://gifsearch.ru/strah/ - если открыть две страницы, в одной из них "создать игру",то в другой должен тут же обновиться список текущих игр (справа)

Вот проблема в том, что больше 3 коннектов как-то не получается серверу поддерживать... Пробовал и задержку проверки обновлений по-больше ставить... Мне кажется тут функция sleep виновата...
PM MAIL   Вверх
Apelsin
Дата 8.9.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 20.4.2009

Репутация: нет
Всего: 1



Вот подтверждение моей догадки.
Дан простой скрипт:
Код

<?
     echo date("H:i:s")."<br>";
     $sleep = $_GET['sleep'];
     sleep($sleep);
     echo date("H:i:s")."<br>";
?>

Открываем 4 вкладки с адресом sleep.php?sleep=10
Код

Первая спустя 10 секунд выводит:
14:47:25
14:47:35
Вторая спустя 20:
14:47:35
14:47:45
Треться спустя 30:
14:47:45
14:47:55
и четвертая спустя 40 секунд:
14:47:55
14:48:05

Запускаю скрипт примерно одновременно. Получается, что запросы совершенно разных пользователей при использовании sleep будут перекрывать друг друга?
А если мне надо просто по-медленнее выполнять скрипт. Чтобы, например, разгрузить БД???
PM MAIL   Вверх
CruorVult
Дата 8.9.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 9
Всего: 28



Цитата(CruorVult @  8.9.2011,  11:54 Найти цитируемый пост)
Тогда просто писать в кеш количество юзеров и при добавлении новых переписывать кеш

так же делать и с новыми играми. Использовать кеш, и при добавлении новой/удаления игры изменять его, чтобы не напрягать мускл. Ну а аяксом прийдется переодически отправлять запросы и смотреть состояние списка игр в кеше.
PM MAIL Skype   Вверх
solenko
Дата 8.9.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(Apelsin @  8.9.2011,  12:55 Найти цитируемый пост)
Запускаю скрипт примерно одновременно. Получается, что запросы совершенно разных пользователей при использовании sleep будут перекрывать друг друга?

на php.net инога очень полезно читать не только мануал, но и комментарии пользователей
http://ua2.php.net/sleep
Цитата

jimmy at powerzone dot dk 06-Mar-2010 04:26
Notice that sleep() delays execution for the current session, not just the script. Consider the following sample, where two computers invoke the same script from a browser, which doesn't do anything but sleep.

PC 1 [started 14:00:00]: script.php?sleep=10 // Will stop after 10 secs
PC 1 [started 14:00:03]: script.php?sleep=0 // Will stop after 7 secs

PC 2 [started 14:00:05]: script.php?sleep=0 // Will stop immediately

http://php.net/session_write_close may be used to address this problem.




--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Absinthe
Дата 8.9.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

А если мне надо просто по-медленнее выполнять скрипт. Чтобы, например, разгрузить БД???
 Каким образом она разгрузится?
PM MAIL   Вверх
Apelsin
Дата 8.9.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 20.4.2009

Репутация: нет
Всего: 1



Цитата(solenko @  8.9.2011,  14:23 Найти цитируемый пост)
на php.net инога очень полезно читать не только мануал, но и комментарии пользователей

Я читал этот комментарий - но легкого результата он мне не принес, и я как дурак побежал на винград smile. Сейчас попробую внимательнее разобраться с этим.


Цитата(Absinthe @  8.9.2011,  14:25 Найти цитируемый пост)
Каким образом она разгрузится? 

У меня Пользователь может создать игру, а у другого пользователя тут же необходимо на страничке показать, что кто-то создал игру. Для этого я постоянно в цикле проверяю БД на новые игры... Чтобы разгрузить БД можно проверять не раз в такт (или как сказать правильнее), а раз, например, в 1-2 секунды...

Добавлено через 8 минут и 44 секунды
Цитата(CruorVult @  8.9.2011,  14:12 Найти цитируемый пост)
так же делать и с новыми играми. Использовать кеш, и при добавлении новой/удаления игры изменять его, чтобы не напрягать мускл. Ну а аяксом прийдется переодически отправлять запросы и смотреть состояние списка игр в кеше. 


У меня чуть-чуть другая логика... Прочел пор этот long polling и пошел на его основе делать... Если брать за основу ваш метод, то придется переписывать все...
На ошибках поучусь smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1134 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.