За последние 24 часа нас посетили 55569 программистов и 1617 роботов. Сейчас ищут 1258 программистов ...

Возникла одна проблемка связанная с AJAX и PHP

Тема в разделе "PHP для новичков", создана пользователем Great_DUKE, 29 окт 2016.

  1. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    Есть PHP скрипт, в котором в течение 100 секунд, в цикле, проверяется наличие новых данных. Также есть JS скрипт, в котором отправляется AJAX запрос, на PHP скрипт, о котором я сказал чуть выше.

    Так вот, как мне сделать так, чтобы PHP скрипт завершал работу, если клиент перезапускает, выходит, или же переходит на другую страницу?
    Вот js скрипт с ajax запросом
    Код (Javascript):
    1. var ajax, active = false;
    2.  
    3. function waitForMsg(){
    4.  
    5.       if(!active){
    6.       active = true;
    7.       ajax = $.ajax({
    8.             type: 'GET',
    9.             data: data,
    10.             dataType: 'json',
    11.             url: 'domain',
    12.             success: function(data){
    13.                 active = false;
    14.                  //code
    15.            
    16.               }
    17.  
    18.              waitForMsg();
    19.             },
    20.             error: function(a,b,c){ active = false; waitForMsg();}
    21.         });
    22.         }
    23.     };
    24.  
    25. $(document).ready(function(){ waitForMsg(); });
    26.  
    27.  
    28. $(window).unload(function(){
    29.    ajax.abort();
    30. });
    Просто, если человек переходит, выходит, или же перезагружает страницу, то действие выполнится только тогда, когда этот PHP скрипт, который с циклом, завершит работу. Так как у меня все страницы на PHP.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    вот это всмысле?
    он всегда по запросу пользователя делает операцию и завершается. Не.. этот бредо ТС где - то видел. И еще, где где... совершается действие раз в 100 секунд, я это в коде не вижу.
     
  3. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  4. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    Вот PHP скрипт
    PHP:
    1. <?
    2. if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']))
    3. exit();
    4.  
    5.  
    6. //code
    7.  
    8. $false = 0;
    9.  
    10. while($false < 100){
    11. $id = intval($_SESSION['id']);
    12.  
    13.  
    14. if($id == 0){
    15.    exit();
    16. }
    17.  
    18. //code
    19.  
    20. if(...){
    21.     echo json_encode(...);
    22.     exit();
    23. }
    24. $false++;
    25.  
    26. sleep(1);
    27.  
    28. }
     
  5. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  6. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    Дабы нагрузка на MySQL была не такой огромной. Просто, вместо строчки "//code", в цикле, присутствует большое кол-во манипуляций, связанных с MySQL.
     
  7. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    так это не спасёт, просто люди будут дольше ждать, а если ресурсов не хватает, то секунда не поможет + PHP будет простаивать и занимать оперативную память
     
  8. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    И каким образом все это лучше реализовать?
     
  9. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    опиши задачу которую решаешь, я могу только догадываться, что ты хочешь чтобы когда приходит запрос на данные, то нужно проверять поступление новых данных из базы и отвечать на запрос, если соединение прервали (закрыли страницу, перешли на другую) то надо не запрашивать новые данные.

    по идее, можно делать ajax запрос, получать данные и в самом javascript (setTimeout) через секунду делать ещё один запрос, чтобы узнать, есть ли новы данные.
    самый правильный вариант это использовать websocket, он меньше ресурсов потребляет в плане отправки и получения данных.
     
  10. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    Я бы использовал Websocket, но такая морока их устанавливать, особенно когда у тебя сервер на PHP, и особенно когда ты пользуешься хостингом.

    Мне нужно сделать Long Polling запрос по средствам AJAX запроса и PHP. Мне не хотелось бы делать так, что со стороны клиента каждую секунду посылается запрос. Мне бы хотелось сделать так, чтобы со стороны пользователя отправился один запрос, и чтобы сервер отвечал не сразу, а только тогда, когда пришли бы новые данные (новые данные в БД). И после того, как сервер ответил на этот длинный AJAX запрос, отправился бы новый, такой же длинный AJAX запрос.
    --- Добавлено ---
    Было бы хорошо сделать с помощью Server Side Event, но я не имею понятия как отсылать, в данном случае, данные серверу.
     
  11. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    так если нет websocket так и будет раз в 1 секунду запрос. или хостинг разрешает выполнять скрипт бесконечно?
    ну для этого websocket сделали

    у тебя ограничения хостинга, так что переходи на vps или 1 секунда или время которое ограничил хостинг

    скачай готовую библиотеку для работы SSE сервера на PHP, возможно это тебе поможет