Доброго времени суток! У меня есть страница, которая отправляет ajax'ом POST-запрос на другую php страницу. А там при обработке запроса вызывается функция с третьей php-страницы. Вот такая, на первый взгляд, сложная схема. Но зато понятно где что лежит . В функции "третьей" страницы есть цикл, достаточно длительный, работает до 5 минут. Хотелось бы иметь на основной странице какой-нибудь индикатор деятельности этого скрипта. Ну например, чтобы выводилось какая сейчас идет итерация. Подскажите пожалуйста, можно ли это реализовать и если да, то хотя бы в общих чертах технологию. Или придется переносить эту функцию на основную страницу (чего пока делать не хочется). Спасибо.
У "технологии" под нумером два даже погоняло есть - scoreboard. Каждую итерацию (или даже каждый определенный блок каждой итерации) сводные данные прогресса процесса записываются в некоторое хранилище - озу, файл, прочие скуэли и ноускуэли. И соответственно есть клиентская "морда", которая эти данные читает и показывает человекокрасивыми графиками.
Извиняюсь, не понял, это реклама? Да, тоже хороший вариант. Главное быстрый по реализации. Вот только не знаю, как таймеры делают на клиентской стороне.
Спасибо, я так понимаю это нужно заснуть в $(document).ready А setInterval и clearInterval до и после ajax запроса. Извиняюсь за офф-топ, всё-таки форум по PHP.
Куда засунуть - это твои проблемы, ты пишешь алгоритм Можно по-разному. clearInterval - когда решишь, что больше запрашивать ничего не нужно.
Помогите пожалуйста. Не выходит у меня каменный цветок . Сделал вот такой файл sessvars.php PHP: <?php session_name('suLogin'); session_set_cookie_params(2*7*24*60*60); session_start(); if(isset($_POST['var'])) { echo $_SESSION[$_POST['var']]; } ?> Он на пост запрос возвращает переменную сессии. На основной странице воткнул скрипт: Код (Javascript): function LoadDirect() { Iter_interval= setInterval(function() { var IterCount = ''; $.ajax({ type: "POST", url: "../php/sessvars.php", data: {'var':'iter'}, response: 'text', async:false, success:function(result) { cnt = cnt+1; } }); $('#debug').text(parseInt(cnt)); }, 2000); $.ajax({ type: "POST", url: "../php/loadbase.php", data: {'SCO':'1'}, response: 'text', async:true, success: function(result) { clearInterval(Iter_interval); } }); } Он в div выводит значение переменной. Ну и функция, которая обновляет переменную: PHP: function ImportSCO($filename) { require '../php_script/connect.php'; $c = 0; if (is_readable($filename)) { $wf = '../Import_tmp/result.txt'; $content = 'X,Y,CamType,Direct,Speed,CamName,OriginalCamType,text'."\n"; $fh = fopen($filename, "r") or die("File ($filename) does not exist!"); while (! feof($fh)) { $line=fgets($fh); $line = mb_convert_encoding($line, 'utf-8', 'cp1251'); if (($line != '') and (substr($line,0,3) != 'IDX') and (substr($line,0,1) != '#')) { $strArr = ConvertSCO2Arr($line); if ($strArr['Dolgota']) { //========================================= $content .= $strArr['Dolgota'].','.$strArr['Shirota'].','.$strArr['CamType'].','.$strArr['Direct'].','.$strArr['Speed'].','.$strArr['CamName'].','.$strArr['orct'].','.$strArr['text']; //========================================= } $c++; $_SESSION['iter'] = $c; } } file_put_contents($wf,$content); } } В ней много неинтересного, но сама по себе функция работает, в файл корректно результаты пишет, но получить значение $_SESSION['iter'] у меня не получается. Может потому, что оно постоянно перезаписывается? За 46 секунд оно меняется порядка 14000 раз. Если в ajax запрос я ставлю (для проверки) не iter, а например id (это у меня id сессии), то всё работает, id отображается на странице. Т.е. могу сделать вывод, что в первых двух скриптах ошибок нет.
Извиняюсь, js-скрипт приложил, который был для теста. Вот правильный: Код (Javascript): function LoadDirect() { Iter_interval= setInterval(function() { var IterCount = ''; $.ajax({ type: "POST", url: "../php/sessvars.php", data: {'var':'iter'}, response: 'text', async:false, success:function(result) { iter = result; } }); $('#debug').text(parseInt(iter)); }, 2000); $.ajax({ type: "POST", url: "../php/loadbase.php", data: {'SCO':'1'}, response: 'text', async:true, success: function(result) { clearInterval(Iter_interval); } }); } Переменные iter и Iter_interval объявлены как глобальные
Ага, кажется понимаю. Долгий скрипт запускается так (код из файла loadbase.php), который вызывает ajax: PHP: <?php session_start(); include $_SERVER['DOCUMENT_ROOT'].'/php/convert.php'; require $_SERVER['DOCUMENT_ROOT'].'/php_script/connect.php'; $result = 'error'; if (isset($_POST['SCO'])) { $uploadfile = '../Import_tmp/SCO.txt'; $query = "SELECT `url` FROM sc_sourceURL"; $STH = $DBH->query($query); $STH->setFetchMode(PDO::FETCH_ASSOC); while ($row = $STH->fetch()) { $url=$row['url']; file_put_contents($uploadfile, file_get_contents($url)); ImportSCO($uploadfile); } $result = 'Ok'; } А вот функция ImportSCO находится в третьем файле convert.php. В нем в начале стоит session_start(), но наверное из него берется только функция, надо наверное в неё вставить эту директиву? --- Добавлено --- Нет, не помогло. Поясните пожалуйста. В смысле продолжите свою мысль. --- Добавлено --- Поставил в этот код, который вызывает ajax запрос строку $_SESSION['iter'] = '1', вот так PHP: <?php session_start(); include $_SERVER['DOCUMENT_ROOT'].'/php/convert.php'; require $_SERVER['DOCUMENT_ROOT'].'/php_script/connect.php'; $result = 'error'; if (isset($_POST['SCO'])) { $_SESSION['iter'] = '1'; $uploadfile = '../Import_tmp/SCO.txt'; $query = "SELECT `url` FROM sc_sourceURL"; $STH = $DBH->query($query); $STH->setFetchMode(PDO::FETCH_ASSOC); while ($row = $STH->fetch()) { $url=$row['url']; file_put_contents($uploadfile, file_get_contents($url)); ImportSCO($uploadfile); } $result = 'Ok'; } Всё равно этот скрипт возвращает пустую строку Код (Javascript): $.ajax({ type: "POST", url: "../php/sessvars.php", data: {'var':'iter'}, response: 'text', async:false, success:function(result) { iter = result; } });
Если долгий скрипт запускается по http, то файл сессии блокируется, и никакие другие вызовы сайта не пройдут, пока он не отработает. Видимо, @igordata что-то ещё в виду имел. Так что лучше поставьте memcache или храните счётчик в базе. Ну или давайте подождём Игоря, может вы его неверно поняли
Вместо setInterval рекомендую использовать setTimeout и выставлять его каждый раз, когда нужно повторить запрос. Не придется таскать идентификатор интервала. Но функции придется дать имя. --- Добавлено --- Еще это лучше тем, что запросы будут фигачиться не каждые Н сек, а через каждые Н сек после ответа.
Я в таких случаях люблю все оборачивать в модуль, в котором сразу хранится все, что нужно, а заодно есть методы старт/стоп.
Спасибо, хорошее замечание, учту. Если с сессиями разберусь. А вообще на будущее полезно. Это наверное сильно замедлит работу скриптов? Я не утверждаю, я спрашиваю. Спасибо, пока не дорос до модулей. Да и задачка тривиальная, если честно. Я про js-скрипт.
вот ты изобретательный шо пипец. не делай так. ты знаешь какой урл? нафига ты пишешь такой урл в js, который если и будет работать, то только на той странице, и чтобы понять этот урл нужно ещё и знать текущий урл. ПРопиши плс прямой от корня сайта. потом дочитаю, бежать надо.
Это и есть от корня. Каталог php лежит в корне. Страница, которая вызывает это скрипт тоже в корне. Дело в том, что скрипты все работают нормально. Проблема в том, что переменная сессии у меня обновляется в скрипте php, в функции, которая вызывается из другого файла php, которому как раз основная страница и передает post- запрос. В этом и проблема (и название темы). Я пробовал обновлять переменную сессии в том файле, которому post-запрос передается - тоже ни к чему не привело. С основной страницы не видно этого обновления, а может оно (обновление) и не происходит вовсе при такой архитектуре вызовов.
это относительный путь по определению, что бы ты себе ни думал путь от корня начинается от корня, т.е. от слеша. Слеш это корень. --- Добавлено --- ты уверен, что сессия стартует и данные в массиве есть?
Ну хорошо, согласен. Разницы правда не понял между тем, как я сделал и как ты советуешь. Такая запись $_SERVER['DOCUMENT_ROOT'].'/php/script.php'; кошерна? Или надо писать реальные каталоги? Абсолютно уверен. Я постоянно пользуюсь переменными сессии, в них я храню привилегии конкретного пользователя и отображаю/не отображаю какую-то информации в зависимости от этого. Провел такой эксперимент: Инициализировал переменную на основной странице PHP: $_SESSION['iter'] = 0; При запуске скрипт проверки значений переменных сессий возвращает 0. А при её первом изменении другим скриптом (не на основной страницы) уже NaN.
разница в том, начинается ли путь со слеша. /это/путь/от/рута и он всегда одинаковый для всех мест а без слеша путь/от/текущей/папки и он всегда разный ты просто рано или поздно с этим столкнёшься, и заимеешь привычку писать от корня всегда. нан используется в яваскрипте. в пхп с таким ты столкнуться не можешь, соотв, ты что-то мутишь и недоговариваешь, и я не могу тебе помочь, т.к. не понимаю, что там у тебя происходит.
Да, NAN возвращает js (ajax). Когда пытается отобразить значение переменной. Оно становится пустым, а я его в число пытаюсь преобразовать. Поэтому и NaN. Не придирайся к словам. JS вообще не смотри, там всё работает. Ещё раз конкретней обрисую проблему: При изменении переменной сессии в скрипте php, вызванном через ajax, код на вызывающей php странице не может получить её значение. session_start() есть и в вызываемом скрипте. Однако значение блокируется и не может быть получено, даже при его наличии в массиве $_SESSION.
если ты считаешь, что я придираюсь, то ты ошибаешься. Искать ошибку нужно там, где она возникает. Если мы роем пхп, то там должно быть пхп. Используй var_dump().