За последние 24 часа нас посетили 31985 программистов и 1380 роботов. Сейчас ищут 902 программиста ...

Передача значений переменных из php скрипта на вызвавшую его страницу

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

  1. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Доброго времени суток!
    У меня есть страница, которая отправляет ajax'ом POST-запрос на другую php страницу. А там при обработке запроса вызывается функция с третьей php-страницы.
    Вот такая, на первый взгляд, сложная схема. Но зато понятно где что лежит :).
    В функции "третьей" страницы есть цикл, достаточно длительный, работает до 5 минут. Хотелось бы иметь на основной странице какой-нибудь индикатор деятельности этого скрипта. Ну например, чтобы выводилось какая сейчас идет итерация.
    Подскажите пожалуйста, можно ли это реализовать и если да, то хотя бы в общих чертах технологию.
    Или придется переносить эту функцию на основную страницу (чего пока делать не хочется).
    Спасибо.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    1. Веб-сокеты
    2. Хранение индикатора процесса в каком-нибудь memcache и периодическое считывание.
     
    Alex870 нравится это.
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    У "технологии" под нумером два даже погоняло есть - scoreboard. Каждую итерацию (или даже каждый определенный блок каждой итерации) сводные данные прогресса процесса записываются в некоторое хранилище - озу, файл, прочие скуэли и ноускуэли. И соответственно есть клиентская "морда", которая эти данные читает и показывает человекокрасивыми графиками.
     
    Alex870 нравится это.
  4. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Спасибо большое всем, буду изучать!
    Может ссылочки какие есть?
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да хоть в сессию пиши и аяксом перерисовывай раз в две секунды.
     
  6. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Извиняюсь, не понял, это реклама? :)
    Да, тоже хороший вариант. Главное быстрый по реализации. Вот только не знаю, как таймеры делают на клиентской стороне.
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    http://javascript.ru/setInterval
     
  8. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Спасибо, я так понимаю это нужно заснуть в $(document).ready
    А setInterval и clearInterval до и после ajax запроса.
    Извиняюсь за офф-топ, всё-таки форум по PHP.
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Куда засунуть - это твои проблемы, ты пишешь алгоритм :) Можно по-разному. clearInterval - когда решишь, что больше запрашивать ничего не нужно.
     
    Alex870 нравится это.
  10. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Помогите пожалуйста. Не выходит у меня каменный цветок :).
    Сделал вот такой файл sessvars.php
    PHP:
    1. <?php
    2. session_name('suLogin');
    3.  
    4. if(isset($_POST['var']))
    5. {
    6.     echo $_SESSION[$_POST['var']];
    7. }
    8. ?>
    Он на пост запрос возвращает переменную сессии.
    На основной странице воткнул скрипт:
    Код (Javascript):
    1. function LoadDirect()
    2. {
    3. Iter_interval= setInterval(function()
    4. {
    5.     var IterCount = '';
    6.     $.ajax({
    7.       type: "POST",
    8.       url: "../php/sessvars.php",
    9.       data: {'var':'iter'},
    10.       response: 'text',
    11.       async:false,
    12.       success:function(result)
    13.       {
    14.         cnt = cnt+1;
    15.       }
    16.      });
    17.     $('#debug').text(parseInt(cnt));
    18. }, 2000);
    19.  
    20.      $.ajax({
    21.       type: "POST",
    22.       url: "../php/loadbase.php",
    23.       data: {'SCO':'1'},
    24.       response: 'text',
    25.       async:true,
    26.       success: function(result)
    27.       {
    28.           clearInterval(Iter_interval);
    29.       }
    30.       });  
    31. }
    Он в div выводит значение переменной.
    Ну и функция, которая обновляет переменную:
    PHP:
    1. function ImportSCO($filename)
    2. {
    3. require '../php_script/connect.php';
    4. $c = 0;
    5. if (is_readable($filename))
    6. {
    7.  
    8.    $wf = '../Import_tmp/result.txt';
    9.    $content = 'X,Y,CamType,Direct,Speed,CamName,OriginalCamType,text'."\n";
    10.  
    11.  
    12.    $fh = fopen($filename, "r") or die("File ($filename) does not exist!");
    13.    while (! feof($fh))
    14.         {
    15.        $line=fgets($fh);
    16.        $line = mb_convert_encoding($line, 'utf-8', 'cp1251');
    17.        if (($line != '') and (substr($line,0,3) != 'IDX') and (substr($line,0,1) != '#'))
    18.         {
    19.             $strArr = ConvertSCO2Arr($line);
    20.             if ($strArr['Dolgota'])
    21.             {
    22.             //=========================================
    23.             $content .= $strArr['Dolgota'].','.$strArr['Shirota'].','.$strArr['CamType'].','.$strArr['Direct'].','.$strArr['Speed'].','.$strArr['CamName'].','.$strArr['orct'].','.$strArr['text'];
    24.             //=========================================  
    25.             }
    26.             $c++;
    27.             $_SESSION['iter'] = $c;
    28.         }
    29.      }
    30.      file_put_contents($wf,$content);
    31. }      
    32. }
    В ней много неинтересного, но сама по себе функция работает, в файл корректно результаты пишет, но получить значение $_SESSION['iter'] у меня не получается. Может потому, что оно постоянно перезаписывается? За 46 секунд оно меняется порядка 14000 раз.
    Если в ajax запрос я ставлю (для проверки) не iter, а например id (это у меня id сессии), то всё работает, id отображается на странице. Т.е. могу сделать вывод, что в первых двух скриптах ошибок нет.
     
  11. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Извиняюсь, js-скрипт приложил, который был для теста.
    Вот правильный:
    Код (Javascript):
    1. function LoadDirect()
    2. {
    3. Iter_interval= setInterval(function()
    4. {
    5.     var IterCount = '';
    6.     $.ajax({
    7.       type: "POST",
    8.       url: "../php/sessvars.php",
    9.       data: {'var':'iter'},
    10.       response: 'text',
    11.       async:false,
    12.       success:function(result)
    13.       {
    14.         iter = result;
    15.       }
    16.      });
    17.     $('#debug').text(parseInt(iter));
    18. }, 2000);
    19.  
    20.      $.ajax({
    21.       type: "POST",
    22.       url: "../php/loadbase.php",
    23.       data: {'SCO':'1'},
    24.       response: 'text',
    25.       async:true,
    26.       success: function(result)
    27.       {
    28.           clearInterval(Iter_interval);
    29.       }
    30.       });
    31. }
    Переменные iter и Iter_interval объявлены как глобальные
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А как долгий скрипт запускается? По http?
     
  13. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Ага, кажется понимаю.
    Долгий скрипт запускается так (код из файла loadbase.php), который вызывает ajax:
    PHP:
    1. <?php
    2. include $_SERVER['DOCUMENT_ROOT'].'/php/convert.php';
    3. require $_SERVER['DOCUMENT_ROOT'].'/php_script/connect.php';
    4. $result = 'error';
    5.  
    6. if (isset($_POST['SCO']))
    7. {
    8. $uploadfile = '../Import_tmp/SCO.txt';
    9.  $query = "SELECT `url` FROM sc_sourceURL";
    10.  $STH = $DBH->query($query);
    11.  $STH->setFetchMode(PDO::FETCH_ASSOC);  
    12.  while ($row = $STH->fetch())
    13.  {
    14.  $url=$row['url'];
    15.  file_put_contents($uploadfile, file_get_contents($url));
    16.  ImportSCO($uploadfile);
    17.  }
    18. $result = 'Ok';
    19. }
    А вот функция ImportSCO находится в третьем файле convert.php.
    В нем в начале стоит session_start(), но наверное из него берется только функция, надо наверное в неё вставить эту директиву?
    --- Добавлено ---
    Нет, не помогло. Поясните пожалуйста. В смысле продолжите свою мысль.
    --- Добавлено ---
    Поставил в этот код, который вызывает ajax запрос строку $_SESSION['iter'] = '1', вот так
    PHP:
    1. <?php
    2. include $_SERVER['DOCUMENT_ROOT'].'/php/convert.php';
    3. require $_SERVER['DOCUMENT_ROOT'].'/php_script/connect.php';
    4. $result = 'error';
    5.  
    6. if (isset($_POST['SCO']))
    7. {
    8. $_SESSION['iter'] = '1';
    9. $uploadfile = '../Import_tmp/SCO.txt';
    10. $query = "SELECT `url` FROM sc_sourceURL";
    11. $STH = $DBH->query($query);
    12. $STH->setFetchMode(PDO::FETCH_ASSOC);
    13. while ($row = $STH->fetch())
    14. {
    15. $url=$row['url'];
    16. ImportSCO($uploadfile);
    17. }
    18. $result = 'Ok';
    19. }
    Всё равно этот скрипт возвращает пустую строку
    Код (Javascript):
    1. $.ajax({
    2.       type: "POST",
    3.       url: "../php/sessvars.php",
    4.       data: {'var':'iter'},
    5.       response: 'text',
    6.       async:false,
    7.       success:function(result)
    8.       {
    9.         iter = result;
    10.       }
    11.      });
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А я искал это сообщение. Нет, не реклама, ошибся вкладкой.
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Если долгий скрипт запускается по http, то файл сессии блокируется, и никакие другие вызовы сайта не пройдут, пока он не отработает. Видимо, @igordata что-то ещё в виду имел. Так что лучше поставьте memcache или храните счётчик в базе. Ну или давайте подождём Игоря, может вы его неверно поняли
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вместо setInterval рекомендую использовать setTimeout и выставлять его каждый раз, когда нужно повторить запрос. Не придется таскать идентификатор интервала. Но функции придется дать имя.
    --- Добавлено ---
    Еще это лучше тем, что запросы будут фигачиться не каждые Н сек, а через каждые Н сек после ответа.
     
    Alex870 нравится это.
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я в таких случаях люблю все оборачивать в модуль, в котором сразу хранится все, что нужно, а заодно есть методы старт/стоп.
     
  18. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Спасибо, хорошее замечание, учту. Если с сессиями разберусь. А вообще на будущее полезно.
    Это наверное сильно замедлит работу скриптов? Я не утверждаю, я спрашиваю.
    Спасибо, пока не дорос до модулей. Да и задачка тривиальная, если честно. Я про js-скрипт.
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вот ты изобретательный шо пипец. не делай так. ты знаешь какой урл? нафига ты пишешь такой урл в js, который если и будет работать, то только на той странице, и чтобы понять этот урл нужно ещё и знать текущий урл. ПРопиши плс прямой от корня сайта.

    потом дочитаю, бежать надо.
     
  20. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Это и есть от корня. Каталог php лежит в корне. Страница, которая вызывает это скрипт тоже в корне. Дело в том, что скрипты все работают нормально. Проблема в том, что переменная сессии у меня обновляется в скрипте php, в функции, которая вызывается из другого файла php, которому как раз основная страница и передает post- запрос. В этом и проблема (и название темы).
    Я пробовал обновлять переменную сессии в том файле, которому post-запрос передается - тоже ни к чему не привело. С основной страницы не видно этого обновления, а может оно (обновление) и не происходит вовсе при такой архитектуре вызовов.
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это относительный путь по определению, что бы ты себе ни думал
    путь от корня начинается от корня, т.е. от слеша. Слеш это корень.
    --- Добавлено ---
    ты уверен, что сессия стартует и данные в массиве есть?
     
  22. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Ну хорошо, согласен. Разницы правда не понял между тем, как я сделал и как ты советуешь.
    Такая запись $_SERVER['DOCUMENT_ROOT'].'/php/script.php'; кошерна? Или надо писать реальные каталоги?
    Абсолютно уверен. Я постоянно пользуюсь переменными сессии, в них я храню привилегии конкретного пользователя и отображаю/не отображаю какую-то информации в зависимости от этого.
    Провел такой эксперимент:
    Инициализировал переменную на основной странице
    PHP:
    1. $_SESSION['iter'] = 0;
    При запуске скрипт проверки значений переменных сессий возвращает 0. А при её первом изменении другим скриптом (не на основной страницы) уже NaN.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    разница в том, начинается ли путь со слеша.
    /это/путь/от/рута и он всегда одинаковый для всех мест
    а без слеша
    путь/от/текущей/папки и он всегда разный

    ты просто рано или поздно с этим столкнёшься, и заимеешь привычку писать от корня всегда.

    нан используется в яваскрипте. в пхп с таким ты столкнуться не можешь, соотв, ты что-то мутишь и недоговариваешь, и я не могу тебе помочь, т.к. не понимаю, что там у тебя происходит.
     
  24. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Да, NAN возвращает js (ajax). Когда пытается отобразить значение переменной. Оно становится пустым, а я его в число пытаюсь преобразовать. Поэтому и NaN. Не придирайся к словам. JS вообще не смотри, там всё работает.
    Ещё раз конкретней обрисую проблему:
    При изменении переменной сессии в скрипте php, вызванном через ajax, код на вызывающей php странице не может получить её значение.
    session_start() есть и в вызываемом скрипте. Однако значение блокируется и не может быть получено, даже при его наличии в массиве $_SESSION.
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если ты считаешь, что я придираюсь, то ты ошибаешься. Искать ошибку нужно там, где она возникает. Если мы роем пхп, то там должно быть пхп. Используй var_dump().