Как сделать циклический запуск функции php из аякса?
Все сделано довольно просто: селект из базы данных, обработка скриптом пхп, запись обратно в базу.
Вся беда в том, что на полумиллионе заканчивается память сервера и скрипт вываливается в ошибку.
Пробовал сделать цикл на php, обрабатывать пачками по 10000 строк и очищать память между итерациями — не тут то было! Никакие unset не помогают, пхп упорно держит всё в оперативке до окончания цикла.
Отсюда возникла идея, стартовать скрипт пхп из цикла на аяксе, можно даже с промежуточным отображением результатов.
Вся беда в том, что мои познания в яваскрипте не просто никакие, а даже слегка минусовые.
Кто может подсказать, возможно ли сделать такое?
То есть запуск яваскрипта по клику, из яваскрипта отправляется значение начала выборки для скрипта пхп, тот выбирает строки из базы с ограничением LIMIT $n, 10000, обрабатывает эти строки, отправляет значение $n яваскрипту и прекращает свою работу, тот увеличивает значение на 10000, отображает промежуточный результат (можно и не отображать) и снова запускает скрипт пхп с новым значением $n
а вообще скрипт вижу примерно так
var count = 10000;
var page = 1;
function getRows(){
$.ajax({
type: "POST",
url: "getrows.php",
dataType: "json",
data: "count="+count+"&page="+page,
success: function(data){
if (!data) return false;
else{
//что-то делаем с данными
page++;
getRows();
}
}
});
}
getRows();
на сервере берем переменные и исходя из них делаем выборку. если есть записи, возвращаем строку в формате json, если нет, то возвращаем false.
скажу честно, скрипт не тестировал
Скрпит на аяксе должен возвращать скрипту пхп только одну величину — значение $nскрипт то написать возможно, вот только не уверен потянет ли это браузер, 10000 строк, это же какой ответ будет возвращать сервер,
Дальше с этим значением заново запускается функция php на сервере, обрабатывает строки, отправляет значение $n скрипту аякс и завершает работу.
Скрипт на аяксе увеличивает значение на 10000 (или на 1, тогда в пхп скрипте просто изменить лимит на ( LIMIT $n*10000, 10000) и запускает скрипт пхп с новым значением $n.
Вот только не очень хорошо расписано, что означают все эти [settings] и не очень понятно, как запустить не файл script.php, а определенную функцию в этом файле.Вот тут очень хорошо расписано как работать с аякс
Прекращение работы скрипта пхп очистит оперативную память сервера. Когда он будет запущен с новым значением начала выборки из базы — все переменные из предыдущего цикла будут удалены.Но не понимаю, как это поможет в вашей проблеме?
Что можете предложить?Я к тому что подход изначально не правильный, и вы пытаетесь решить проблему "костыльным методом".
В зоне одной сессии?Вся беда в том, что на полумиллионе заканчивается память сервера и скрипт вываливается в ошибку.
Пробовал сделать цикл на php, обрабатывать пачками по 10000 строк и очищать память между итерациями -
В страницу со скриптом ставлю мета рефреш 1 секунду. И открываю в 1-10 вкладках.
Мне как то нужно было обновить содержимое 30000 строк в БД, я просто не смог составить запрос Notepad лагал и приходилось все делать заново. Таким способом обновил за пару часов. Может как то так…
Да.В зоне одной сессии ?
Если вручную прописать LIMIT 0, 10000, отработать скрипт, потом вручную изменить на LIMIT 10000, 10000, LIMIT 20000, 10000 — всё работает как надо.
Я просто хочу автоматизировать процесс.
У меня чуть больше миллиона строк. В два приема по 600 тысяч на опенсервере с 1.5 гигами оперативки операция длится 40 минут.Мне как то нужно было обновить содержимое 30000 строк в БД, я просто не смог составить запрос Notepad лагал и приходилось все делать заново. Таким способом за пару часов. Может как то так...
Так продолжайте свои мысли: — А если использовать новую сессию для каждого лимита памяти? Или для каждой пачки по 10000 запросовиспользовать свою сессию?Геннадий Иванович:
В зоне одной сессии ?
Да.
Да!для каждой пачки по 10000 запросов использовать свою сессию?
Как это сделать?
Что вы хотели сделать я понял))Прекращение работы скрипта пхп очистит оперативную память сервера. Когда он будет запущен с новым значением начала выборки из базы — все переменные из предыдущего цикла будут удалены.
Я к тому что подход изначально не правильный
Прислушайтесь к Геннадий Иванович!
Геннадий Иванович говорит намеками.Прислушайтесь к Геннадий Иванович!
Можно ли расписать поподробнее, как разбить обработку большой таблицы на части, чтобы разгрузить память?
Теоретически?Как это сделать?
Нужно между сессиями сохранить временные данные начало ID-0-строк: завершено ID=10000
Создать табличку и сохранять в ней результат.
Значит сохранить результат обработанных строк не проблема !Пробовал сделать цикл на php, обрабатывать пачками по 10000 строк и очищать память между итерациями
Инициализировать новую сессию, считать где закончили обработку, продолжить, и дт.
Просто Ваша подача вопроса,
не раскрывает методов к возможному решению. Все это так в принципе.Есть надобность обработки больших таблиц базы данных (более миллиона строк).
Поэтому и ожидаемые Вами ответы, базируются на предположениях.
Ну так и мы не знаем вашего кода и целей.Геннадий Иванович говорит намеками.
HiAndy, курим сначала маны
Не нужно. Нужно просто сохранить значение переменной $n, остановить скрипт и после начать его заново увеличив значение переменной.Нужно между сессиями сохранить временные данные начало ID-0-строк: завершено ID=10000
Я надеялся, что запуск одного скрипта из цикла в другом скрипте решит вопрос, но не тут то было!
Пока цикл полностью не отработает — память не очищается.
Просто Ваша подача вопроса ,
Есть надобность обработки больших таблиц базы данных (более миллиона строк).
не раскрывает методов к возможному решению. Все это так в принципе.
Поэтому и ожидаемые Вами ответы, базируются на предположениях.
Вас понял. Сейчас немножко облагорожу внешний вид и выложу почти готовое изделие.
Может тогда будет понятнее, что я имел в виду…
1- Если это процесс систематический то: лучше cоздать задание для cron ( обработка и счетчик обработанных строк таблицы) и выполнять по заданию определенный промежуток времени — определенное количество строк.Может тогда будет понятнее, что я имел в виду...
2- Если это единовременный но периодический процесс разработчика, то решений много.
Обычно такая обработка больших данных, это вынужденная мера к обработке "спарсенных" данных (результатов выдачи с доноров). и как следствие пост обработка и определенная "уникализация" контента.