За последние 24 часа нас посетили 55170 программистов и 1732 робота. Сейчас ищут 799 программистов ...

Как поставить флаг на условие, чтобы она выполнилась 1 раз

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 14 ноя 2018.

  1. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день. Есть функция которая опрашивается ajax раз в 10 секунд, как ее выполнить 1 раз если условие истинно.
    Делал так, не получается:
    PHP:
    1. var $check = 1;
    2. public function hour(){
    3.        if($this->check == 1){
    4.             $this->check  = 2;
    5.             echo  'условие выполнено';
    6.         }
    7. }
    Вот эта функция постоянно выполняется. Как сделать это на подобии с javascript?:

    Код (Javascript):
    1. var check = true;
    2. function hour(){
    3.    if(check){
    4.          check = false;
    5.          alert('условие выполнено');
    6.     }
    7. }
    Может кто знает альтернативу такой проверке, функция сравнивает время, выглядит она так:
    PHP:
    1. var $check = 1;
    2. public function hour(){
    3.       $lastTime = date('Y-m-d H:i', strtotime($this->lastTime()));
    4.       $dateTime = date('Y-m-d H:i', strtotime('-60 minutes'));
    5.        if( strtotime($lastTime) == strtotime($dateTime) && $this->check == 1){
    6.             $this->check  = 2;
    7.             echo  'условие выполнено';
    8.         }else if(strtotime($lastTime) != strtotime($dateTime)){
    9.             $this->check  = 1;
    10.         }
    11. }
     
    #1 Artur_hopf, 14 ноя 2018
    Последнее редактирование: 14 ноя 2018
  2. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Куки не подходят?
     
  3. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @AlexandrS страница перезагружается пару раз в неделю, думаешь стоит здесь использовать куки?
     
  4. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добавил создание и удаление куки, один фиг функция срабатывает:
    PHP:
    1. public function hour(){
    2.       $lastTime = date('Y-m-d H:i', strtotime($this->lastTime()));
    3.       $dateTime = date('Y-m-d H:i', strtotime('-60 minutes'));
    4.       if( strtotime($lastTime) == strtotime($dateTime) && is_null(get_cookie('cooke_hour'))){  //проверка на наличие куки с таким именем
    5.             delete_cookie('cooke_hour'); // удаляем куки
    6.             echo  'условие выполнено';
    7.        }else if(strtotime($lastTime) != strtotime($dateTime)){
    8.             set_cookie('cooke_hour'); //создаем куки
    9.        }
    10. }
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Если нет привязки к профилю на сервере, то кука либо локалсторадж. Помоему без вариантов.
    Если не работает, значит начни с поиска куки. Её нет или ты её не находишь - это два разных кейса )
     
  6. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @artoodetoo решил проблему извращенно.
    1. Передаю в эту функцию секунды текущего времени (функция опрашивается раз в 10 секунд);
    2. В самой функции пишу if (second > 49) то срабатывает условие.

    Минус такого говно кода, если кто то решит изменить время опроса функции, то все полетит. Думаю дальше, как еще можно)
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    я думал речь о больших паузах, о разных сеансах работы, а тут 49 секунд... как это связано вообще?

    с кукой косяки бывают либо со временем её жизни, либо с путем: не все помнят, что кука имеет "папку" в которой она актуальна. надо ставить её в корне, елсли нет особых условий. кроме того, кука не заменяет обычную переменную, её читают при следующем запуске скрипта, а не в этом же сеансе! если есть потребность читать сразу, значит с логикой что-то не так.
     
  8. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @artoodetoo В общем смотрите. Сервер работает на iis7. Он не поддерживает websocket. Чтобы опрашивать сервер на клиенте стоит простенький ajax запрос вида:
    Код (Javascript):
    1. function get(){
    2.    $.get( "test.php" );
    3.    setTimeout(function() {
    4.      get();
    5.    }, 10000);
    6. }
    На php идет сравнение двух дат. Если даты равны условие выполнено.
    PHP:
    1. $lastTime = date('Y-m-d H:i', strtotime($this->lastTime()));
    2. $dateTime = date('Y-m-d H:i', strtotime('-60 minutes'));
    3. if(strtotime($lastTime)==strtotime($dateTime){
    4.     // условие выполнено
    5. }
    Так вот, так как опрос идет раз в 10 секунд, когда даты совпадут по минутам (2018-11-14 12:20). Так каждые 10 секунд условие будет выполнятся, пока минуты текущего времени не изменится ($dateTime). А нужно чтобы условие выполнилось только 1 раз.

    Придумал такой способ. Добавляем условие секунды:
    PHP:
    1. $second = date('s');
    2. if($second > 49){
    3.    $lastTime = date('Y-m-d H:i', strtotime($this->lastTime()));
    4.    $dateTime = date('Y-m-d H:i', strtotime('-60 minutes'));
    5.    if(strtotime($lastTime)==strtotime($dateTime){
    6.      // условие выполнено
    7.     }
    8. }
    В таком случае условие выполнится 1 раз. Но вот если кто то изменить в ajax запросе время опроса. Вместо 10 секунды сделает любое другое число, то задница.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    кажется я не въезжаю почему нужно ТАК считать разницу во времени, а не сразу завести таймер на нужное время.

    что до образца на пхп, то то плохой пример. с большой долей вероятности условие не сработает никогда. а требуется наверное чтобы сработало один раз но не раньше чем через 1 час.
    как мы гарантируем, что ровно через 60 минут этот код быдет вызван? а что если получится только через 61 минуту?

    я бы заменил == на >, заодно пропала бы нужда в двойном преобразовании типов.
    а отметку о выполненности доверил постоянному хранилищу на сервере: база или файл. всё что приходит от клиента может быть подделано.
     
  10. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @artoodetoo да, пожалуй надо подключать в это дело sql. Спасибо за советы :)