Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Выполнение долгого скрипта
Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010 Откуда: Россия, Саратов
Помог: 0 раз(а)
Есть задача сделать некоторую длинную операцию (многократное соединение с удаленным сервером через CURL), длительность которой может превышать несколько минут. Задача запускается и через cron, и через браузер. Использовать set_time_limit(0) возможности нет (заблокировано у хостера).
Думаю разбить выполнение задачи на несколько вызовов скрипта. Добавлять в cron несколько вызовов нерационально (нет масштабируемости).
Думаю использовать многократный вызов скрипта через системный вызов, каждый вызов будет обрабатывать отдельную часть работы.
Посоветуйте, можно ли и как сделать из одного скрипта несколько параллельных вызовов другого скрипта.
Или лучше последовательный вызов - поработал чуть-чуть, вызвал сам себя, закрылся?
DeepVarvar
Отправлено: 20 Октября, 2010 - 22:02:39
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Если действительно есть возможность разбить взаимодействие с удаленным сервером на мелкие задачи, то просто оформить все как самостоятельные курло-скриптики, и устроить что-то вроде эстафеты: отработал - передай другому, а данные меж ними: гетом, постом, через базу/файл, STDOUT... ну чем удобней или выгоднее в том или ином случае, выбирать вам...
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Зачем нужно отключать sel_time_limit() ? Если это бесплатный хостинг то лутше найти другой! А если платный то попросить у хостера разрешить даную функцию.
Проще найти другой хостинг а не изобретать велосипед
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DeepVarvar
Отправлено: 20 Октября, 2010 - 22:15:35
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
OrmaJever ну как самый легкий и незамороченый вариант - да )))
Переложить свою проблему на чужие плечи - это по европейски, а топикастер спросил как эту проблему по русски решить ))))))
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
DeepVarvar пишет:
OrmaJever ну как самый легкий и незамороченый вариант - да )))
Переложить свою проблему на чужие плечи - это по европейски, а топикастер спросил как эту проблему по русски решить ))))))
Я видел очень много бесплатных хостов с подержкой функции set_time_limit(), а на платных дак вобще на всех наверно.
Я предложил наилутший вариант. Завтро хостер запретит библиотеку cURL и будем снова переписывать все скрипты? А затем ещё будут ограничения и будем под них подстраиватся?
ЗЫ. если хостер запретил set_time_limit() то есть на то причина. Возможно не хочет большой нагрузкина сервер, и тогда если вы раобьёте скрипт хостер всёравно увидит иещё забанит.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DeepVarvar
Отправлено: 20 Октября, 2010 - 23:03:50
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
OrmaJever все правильно, конечно сначала нужно у хостера узнать что оно там у них так или не так...
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
lexxpavlov пишет:
Думаю разбить выполнение задачи на несколько вызовов скрипта
Для реализации выполнения ресурсоемких задач в PHP-скрипте которые не соответствуют оригинальным ограничениям по времени выполнения и используемой памяти в одном процессе - целесообразно применить схему множественного ветвления в рамках которой производится создания отдельных процессов которые выполняют некоторые задачи и сохраняют информации о результате выполнения в некотором файле с запретом буферазиции для непосредственной передачи состояний между инстанциями
Кроме того возможно распределение работы для единого процесса который проводит последовательный перезапуск с некоторым временным интервалом - а в случае наличия постоянного клиентского соединения администратора системы возможно универсализировать систему путем хранерия информации на стороне HTML-страницы и выполнения динамических запросов
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
lexxpavlov
Отправлено: 21 Октября, 2010 - 08:35:11
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010 Откуда: Россия, Саратов
Помог: 0 раз(а)
DeepVarvar пишет:
Если действительно есть возможность разбить взаимодействие с удаленным сервером на мелкие задачи
Да. Задача суть обработка записей из БД на удалённом сервере. Сколько записей, столько и отдельных независимых запросов. Один запрос обрабатывается на том сервере примерно 0,2-0,5 сек. За один раз может потребоваться обработка до нескольких тысяч запросов (!). Нагрузка на сервер большой не будет, скрипт будет (относительно) долго простаивать, ждать ответа от сервера.
JustUserR пишет:
целесообразно применить схему множественного ветвления в рамках которой производится создания отдельных процессов
Можно про это подробнее? А то первый пробный загугл дал мало инфы по теме...
Можно ссылку на хорошую статью.
JustUserR пишет:
универсализировать систему путем хранерия информации на стороне HTML-страницы и выполнения динамических запросов
Так не получится, система должна выполняться по заданию из cron, там никакого браузера нет. А так было бы хорошо, да. Так работает bigdump.php - суперскрипт.
Я думал, сделать примерно так.
Есть общий скрипт-контроллер. Он определяет общее количество заданий, делит на число, которое может обработать один скрипт, и запускает нужное количество дочерних процессов, каждый из которых обрабатывает свою часть. Но теперь сам понял, что тоже нет универсальности - при большом числе заданий получится огромное число дочерних процессов - может превысить лимит.
Сейчас думаю модифицировать алгоритм, добавив это:
DeepVarvar пишет:
устроить что-то вроде эстафеты: отработал - передай другому, а данные меж ними: гетом, постом, через базу/файл, STDOUT...
То есть скрипт-контроллер создает N скриптов, каждый работает сколько-то времени и запускает сам себя. И так до победы. Таким образом можно добиться и параллельности, и масштабируемости. Задавая N, мы регулируем нагрузку на сервер.
Каждый скрипт при запуске блокирует часть записей таблицы БД, говоря - "это моё!", чтобы не допустить двукратной обработки записей.
Осталось решить, каким методом создавать дочерние процессы, чтобы они продолжали работать при завершении родительского скрипта-контроллера.
Вот здесь нужны советы
JustUserR
Отправлено: 21 Октября, 2010 - 09:05:03
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
lexxpavlov пишет:
Можно про это подробнее?
Существует различные способы которые позволяет реализовывать разделение выполнение сложных алгоритмов на набор отдельных процессов - что позволяет в сущности проводить игнорирование системных ограничений на время работы конкретного PHP-процесса Важным моментом является фактор проведения такого ограничения - в частности создание лимитирования для PHP-скриптов возможно явным способом с помощью соответствующей конфигурации интерпретатора - в то время как независимые CGI-скрипты могут быть лимитированы только средствами системного квотирования которая применяется не всегда
Таким образом вы можете использовать систему fork-инга для создания отдельных дочерних процессов - тем не менее в случае наличия квотирования соответствующие ограничения могут действовать на дерево процессов и такая схема становится мало полезной Тем не менее для игнорирования такого ограничения возможно применять suexec-программы если это разрешено - в таком случае вызываемый процесс не будет входить в дерево вашего исполнение и явный лимит не будет предоставляться
Даже в случае невозможности осуществления указанных действий - возможно использовать последовательное выполнение действий с сохранеием состояния в текстовом файле с непосредственным доступом - в такос члучае exec функция будет замещать текущее дерево исполнения
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
lexxpavlov
Отправлено: 21 Октября, 2010 - 09:43:31
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010 Откуда: Россия, Саратов
Помог: 0 раз(а)
JustUserR, Спасибо за подробный пост с многими умными словами. Я тоже люблю такое читать и писать
Но вот вопрос остается - как сделать вызов скрипта из другого скрипта, так, чтобы он продолжал работу после завершения вызвавшего.
Добавлю, что в будущем планируется переход на выделенный сервер, там я уже смогу настроить всё как мне захочется. Но, думаю, скрипт, который будет работать час - это не вариант. Хочется реализовать именно такой вот шедулер с параллельной обработкой хотя бы в 5-10 потоков. (Добавление)
Нашел предложение записать в cron запуск скрипта каждую минуту. Улыбнуло!
Интересно, как работают системы с миллионом подобных запросов в час - например, автоответчики, рассыльщики писем и SMS и т.п.
EuGen
Отправлено: 21 Октября, 2010 - 10:56:37
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Работал с такой вот системой. Это
C++ форки - процесс порождает несколько дочерних, соответственно есть еще контролирующий демон, следящий за тем, чтобы с рассылщиком все было нормально. php там никто и не думал использовать - с многопоточностью в нем, скажем, не очень.
Как вариант решения - дочерними процессами регулярно проверять, есть ли родительский. А если нет - форкаться (при этом еще по-видимому, нужно учитывать их количество, чтобы не форкнуться несколько раз - например, писать арбитражный файл "я начинаю форкаться").
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
lexxpavlov
Отправлено: 21 Октября, 2010 - 11:31:45
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010 Откуда: Россия, Саратов
Помог: 0 раз(а)
EuGen пишет:
дочерними процессами регулярно проверять, есть ли родительский. А если нет - форкаться
Я так понял, предложенная схема реализует постоянное присутствие процесса в памяти. И если родительского скрипта (контроллера) нет, то один из дочерних становится контроллером. Очень интересно, надо отметить себе идею. Может, и пригодится когда-нибудь.
Но сейчас нет задачи постоянного присутствия процесса в памяти. Контроллер запускается по расписанию (раз в сутки), запускает 10 "дочек", каждая из которых отрабатывает часть заданий, если мало, запускает сама себя. Задания закончились - все процессы завершаются.
lexxpavlov
Отправлено: 21 Октября, 2010 - 13:35:02
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010 Откуда: Россия, Саратов
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.