[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Есть ли такая возможность у php?
123123
Есть некий исполняемый файл.php который собирает кучу информации из БД, делает некие вычисления и на этом прекращает работу. Выполняется скрипт с переодичностью 1на минута (n>10)раз, из-за частой переодичности невыгодно каждый раз забираеть данные из БД. Хотелось бы сделать чтобы 1 раз в начале скрипт все загрузил, и далее работал с этими данными, и изменять только те что изменились. С теми что измениилсь проблем нет(каким-то образом в БД отмечаем даные которые надо запросить), но как сделать чтобы скрипт не прекращал работу и мог отдавать данные на аякс запросы?

Пока есть только такое решение в Main.php сделать функцию start() которая и будет всей программой, а в конце, если n>N{sleep(); start();} так по идеи все данные не будут постонно загружаться а данные вычисленные для пользователей складировать в БД. ПОльзователь послает запрос на helper.php, тот дастает обновившуюся инфу из БД, и вроде бы все должно работать... но решение очень не красивое получается... файл Main.php у разных пользователей может быть запущен с разнными входными данными(различных комбинаций входных данных ~80), и складировать в кеш опасно, т.к. может почиститься кеш из-за большого обьема данных... Может кто-нибудь уже сталкивался с подобной проблемой и может подсказать более изящное решение?

Впринпципе то результат работы можно уже в кеш пихать, и пользователю из кеша отдавать

структура main.php

array0=array0 from sql
.....
arrayN=arrayN from sql
n=N
start( ссылки на массивы)
{....n-=k
....вставка результатта в мемкеш}

start(массивы)
for(;n;){sleep( 60сек ) start(массивы)}

exit

Гуру пхп, скажите пжл, какие подводные камни могут вылезти из такой реализации? Может оперативка закончится? Или со Sleep что-нибудь случится?



Спустя 7 часов, 36 минут, 55 секунд (12.09.2011 - 00:25) 123123 написал(а):
Up

Спустя 8 минут, 18 секунд (12.09.2011 - 00:33) Игорь_Vasinsky написал(а):
всё зависит от объема данных и оптимизации как запросов в БД так и всего кода.

Спустя 7 минут, 7 секунд (12.09.2011 - 00:40) 123123 написал(а):
данных не больше 2мб, но из-за возможности разных запусков таких программ не очень хочеться забивать мемкеш, т.к. он с большой вероятностью почистится, + используется в других скриптах... А у данного файла может закончится память под данные? Там же вроде ограничено колличество выделяемой памяти... И нормально ведет себя слип при нагрузках?
С ним ничего по идеи не должно случится? Запросы к бд, глоабльные только в начале файла, потом уже только вставки в бд достаточно небольшого обьема 5-10кб

Спустя 13 минут, 30 секунд (12.09.2011 - 00:54) kirik написал(а):
Цитата (123123 @ 11.09.2011 - 09:48)
как сделать чтобы скрипт не прекращал работу и мог отдавать данные на аякс запросы?

Использование кэша - не плохой ведь вариант? Да и прост в релаизации..

Как вариант - можно использовать phpdaemon (или node.js). Пишем на нём http-сервер, который будет при старте подргужать данные из БД, а при запросе клиента отдавать ему свежие данные.
Если я всё верно понял, то вполне себе подходящее решение smile.gif

Спустя 3 минуты, 47 секунд (12.09.2011 - 00:58) Игорь_Vasinsky написал(а):
Вот мне мой хостер написал

Цитата
нормально отлаженные скрипты среднего сайта не должны
отнимать более 3% процессорного времени более 3-5 секунд.

Спустя 3 минуты, 8 секунд (12.09.2011 - 01:01) 123123 написал(а):
kirik-Щас почитаю про phpdaemon, спасибо за направление)
Игорь_Vasinsky выполнение скрипта будет занимать меньше времени, дело в том чтобы много информации повторно не загружать, хранить её в оперативке и подружать только измененые данные...

Спустя 2 минуты, 2 секунды (12.09.2011 - 01:03) Игорь_Vasinsky написал(а):
Цитата
дело в том чтобы много информации повторно не загружать, хранить её в оперативке и подружать только измененые данные...


а с этим я и не спорил wink.gif

постоянно про node.js слышу... учить чтоли пора....

Спустя 2 минуты, 59 секунд (12.09.2011 - 01:06) 123123 написал(а):
Следоватльно, то что скрипт не заканчивает работу через 3-5 сек это плохо.. Надо будет тогда подумать над другим подходом

Спустя 6 минут, 12 секунд (12.09.2011 - 01:12) kirik написал(а):
123123
Всё затевается только для того чтобы не дёргать БД? Или там какие-то сложные вычисления?

Спустя 1 минута, 54 секунды (12.09.2011 - 01:14) 123123 написал(а):
Да только для того чтобы не дергать БД, вычисления не сложные, но данных для вычислений очень много

Спустя 1 минута, 6 секунд (12.09.2011 - 01:15) Игорь_Vasinsky написал(а):
Он имеет ввиду что запросы нужно повторять постоянно, а это не понраится хостеру, он и хочит сократить их количесто используя кэш dry.gif

Спустя 45 секунд (12.09.2011 - 01:16) 123123 написал(а):
Чем плох кеш, тем что даже если его использовать каждую минуту в базу надо складировать уже рассчитанные данные, даже если мы их забирать не будем через 60, они должны быть помещены в БД, на случай потери кеша

Спустя 13 секунд (12.09.2011 - 01:16) Игорь_Vasinsky написал(а):
у мускула же свой есть кэшь? где он хранит запросы или нет?

Спустя 1 минута, 55 секунд (12.09.2011 - 01:18) 123123 написал(а):
Игорь_Vasinsky, нет, все данные хотелсь бы сразу загрузить, а те что изменились за 1ну минуту догрузить, тоесть неизменившиеся данные оставить в памяти, тоесть каждые 60сек догружать малого колличества данные

Спустя 1 минута, 3 секунды (12.09.2011 - 01:19) 123123 написал(а):
да есть кеш, но как он там кеширует, что закеширует а что нет, я не знаю

Спустя 18 секунд (12.09.2011 - 01:19) Игорь_Vasinsky написал(а):
так трудно ссудить, данные в бд будут только добавляться или и удалятся из бд тоже?

Спустя 9 минут, 58 секунд (12.09.2011 - 01:29) 123123 написал(а):
Часть данных после 60сек надо выкинуть из памяти а часть догрузить, но эти догрузки минимальны, самые большие загрузки данных происходят при первом запуске файла

пример, есть 100 массивов уже загруженных, через 60 сек запускается старт, получаю данные догрузить из БД 101,102 массив, 48 выкинуть...

Спустя 6 минут, 47 секунд (12.09.2011 - 01:36) 123123 написал(а):
Собственно наверно сильно пригрузил задачкой, хотел бы узнать как бы вы сделали? 1)Запихнули все что можно в мемкеш и бд, и при следующем запросе обратились в кеш, если там нет то взяли из бд, выполнили скрипт и все.. плюсы, мемкеш все таки лучше чем без него, облегчение нагрузки на бд. минусы полюбому будут идти постоянные заносы в базу, и возможно вытаскивание данных из базы при очистке кеша
2)Пойти на какое-то ухищрение типа слипа, хранить все в оперативке, догружать только необходимое каждые 60сек. плюсы ничего не вставляется в базу, запросов к базе по минимуму. минусы я так понимаю что плохо что скрипт будет очень долго работать в конечном итоге и топорным решение выглядит

Спустя 6 часов, 32 минуты, 3 секунды (12.09.2011 - 08:08) kirik написал(а):
Цитата (123123 @ 11.09.2011 - 18:36)
минусы я так понимаю что плохо что скрипт будет очень долго работать

Да нормальный, обычный, такой демон smile.gif

Вообще всё зависит от конкретной задачи. Если данные изменяются редко, а запрашиваются часто - используйте кэш. Для вставки есть INSERT DELAYED, что уменьшит возможность блокировки таблицы/ячейки.
Ваш второй вариант больше похож на костыль, который в случае чего довольно просто случайно "сломать".

Цитата (123123 @ 11.09.2011 - 18:19)
да есть кеш, но как он там кеширует, что закеширует а что нет, я не знаю

Об этом можно почитать в доках. Логика там есть.

Цитата (123123 @ 11.09.2011 - 18:16)
они должны быть помещены в БД, на случай потери кеша

У вас в любом случае должен всегда быть актуальный дамп данных. Иначе при потере питания все данные из памяти пропадут, и у вас ничего не останется.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.