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 :: Выполнение долгого скрипта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Способы реализации выполнения долгих скриптов
lexxpavlov
Отправлено: 20 Октября, 2010 - 21:41:43
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010  
Откуда: Россия, Саратов


Помог: 0 раз(а)




Есть задача сделать некоторую длинную операцию (многократное соединение с удаленным сервером через CURL), длительность которой может превышать несколько минут. Задача запускается и через cron, и через браузер. Использовать set_time_limit(0) возможности нет (заблокировано у хостера).
Думаю разбить выполнение задачи на несколько вызовов скрипта. Добавлять в cron несколько вызовов нерационально (нет масштабируемости).
Думаю использовать многократный вызов скрипта через системный вызов, каждый вызов будет обрабатывать отдельную часть работы.
Посоветуйте, можно ли и как сделать из одного скрипта несколько параллельных вызовов другого скрипта.
Или лучше последовательный вызов - поработал чуть-чуть, вызвал сам себя, закрылся?
 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Октября, 2010 - 22:02:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Если действительно есть возможность разбить взаимодействие с удаленным сервером на мелкие задачи, то просто оформить все как самостоятельные курло-скриптики, и устроить что-то вроде эстафеты: отработал - передай другому, а данные меж ними: гетом, постом, через базу/файл, STDOUT... ну чем удобней или выгоднее в том или ином случае, выбирать вам...
 
 Top
OrmaJever Модератор
Отправлено: 20 Октября, 2010 - 22:12:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Зачем нужно отключать sel_time_limit() ? Если это бесплатный хостинг то лутше найти другой! А если платный то попросить у хостера разрешить даную функцию.
Проще найти другой хостинг а не изобретать велосипед Подмигивание


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Октября, 2010 - 22:15:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




OrmaJever ну как самый легкий и незамороченый вариант - да )))
Переложить свою проблему на чужие плечи - это по европейски, а топикастер спросил как эту проблему по русски решить ))))))
 
 Top
SAD
Отправлено: 20 Октября, 2010 - 22:19:37
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)





OrmaJever, получите штраф за недельные ответы.

(Отредактировано автором: 20 Октября, 2010 - 22:19:48)

 
 Top
OrmaJever Модератор
Отправлено: 20 Октября, 2010 - 22:49:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




DeepVarvar пишет:
OrmaJever ну как самый легкий и незамороченый вариант - да )))
Переложить свою проблему на чужие плечи - это по европейски, а топикастер спросил как эту проблему по русски решить ))))))


Я видел очень много бесплатных хостов с подержкой функции set_time_limit(), а на платных дак вобще на всех наверно.

Я предложил наилутший вариант. Завтро хостер запретит библиотеку cURL и будем снова переписывать все скрипты? А затем ещё будут ограничения и будем под них подстраиватся?

ЗЫ. если хостер запретил set_time_limit() то есть на то причина. Возможно не хочет большой нагрузкина сервер, и тогда если вы раобьёте скрипт хостер всёравно увидит иещё забанит.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Октября, 2010 - 23:03:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




OrmaJever все правильно, конечно сначала нужно у хостера узнать что оно там у них так или не так...
 
 Top
JustUserR
Отправлено: 21 Октября, 2010 - 07:57:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




lexxpavlov пишет:
Думаю разбить выполнение задачи на несколько вызовов скрипта
Для реализации выполнения ресурсоемких задач в PHP-скрипте которые не соответствуют оригинальным ограничениям по времени выполнения и используемой памяти в одном процессе - целесообразно применить схему множественного ветвления в рамках которой производится создания отдельных процессов которые выполняют некоторые задачи и сохраняют информации о результате выполнения в некотором файле с запретом буферазиции для непосредственной передачи состояний между инстанциями
Кроме того возможно распределение работы для единого процесса который проводит последовательный перезапуск с некоторым временным интервалом - а в случае наличия постоянного клиентского соединения администратора системы возможно универсализировать систему путем хранерия информации на стороне HTML-страницы и выполнения динамических запросов


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
lexxpavlov
Отправлено: 21 Октября, 2010 - 08:35:11
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010  
Откуда: Россия, Саратов


Помог: 0 раз(а)




DeepVarvar пишет:
Если действительно есть возможность разбить взаимодействие с удаленным сервером на мелкие задачи

Да. Задача суть обработка записей из БД на удалённом сервере. Сколько записей, столько и отдельных независимых запросов. Один запрос обрабатывается на том сервере примерно 0,2-0,5 сек. За один раз может потребоваться обработка до нескольких тысяч запросов (!). Нагрузка на сервер большой не будет, скрипт будет (относительно) долго простаивать, ждать ответа от сервера.

JustUserR пишет:
целесообразно применить схему множественного ветвления в рамках которой производится создания отдельных процессов

Можно про это подробнее? А то первый пробный загугл дал мало инфы по теме...
Можно ссылку на хорошую статью.

JustUserR пишет:
универсализировать систему путем хранерия информации на стороне HTML-страницы и выполнения динамических запросов

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

Я думал, сделать примерно так.
Есть общий скрипт-контроллер. Он определяет общее количество заданий, делит на число, которое может обработать один скрипт, и запускает нужное количество дочерних процессов, каждый из которых обрабатывает свою часть. Но теперь сам понял, что тоже нет универсальности - при большом числе заданий получится огромное число дочерних процессов - может превысить лимит.
Сейчас думаю модифицировать алгоритм, добавив это:
DeepVarvar пишет:
устроить что-то вроде эстафеты: отработал - передай другому, а данные меж ними: гетом, постом, через базу/файл, STDOUT...


То есть скрипт-контроллер создает N скриптов, каждый работает сколько-то времени и запускает сам себя. И так до победы. Таким образом можно добиться и параллельности, и масштабируемости. Задавая N, мы регулируем нагрузку на сервер.
Каждый скрипт при запуске блокирует часть записей таблицы БД, говоря - "это моё!", чтобы не допустить двукратной обработки записей.

Осталось решить, каким методом создавать дочерние процессы, чтобы они продолжали работать при завершении родительского скрипта-контроллера.
Вот здесь нужны советы Улыбка
 
 Top
JustUserR
Отправлено: 21 Октября, 2010 - 09:05:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




lexxpavlov пишет:
Можно про это подробнее?
Существует различные способы которые позволяет реализовывать разделение выполнение сложных алгоритмов на набор отдельных процессов - что позволяет в сущности проводить игнорирование системных ограничений на время работы конкретного PHP-процесса Важным моментом является фактор проведения такого ограничения - в частности создание лимитирования для PHP-скриптов возможно явным способом с помощью соответствующей конфигурации интерпретатора - в то время как независимые CGI-скрипты могут быть лимитированы только средствами системного квотирования которая применяется не всегда
Таким образом вы можете использовать систему fork-инга для создания отдельных дочерних процессов - тем не менее в случае наличия квотирования соответствующие ограничения могут действовать на дерево процессов и такая схема становится мало полезной Тем не менее для игнорирования такого ограничения возможно применять suexec-программы если это разрешено - в таком случае вызываемый процесс не будет входить в дерево вашего исполнение и явный лимит не будет предоставляться
Даже в случае невозможности осуществления указанных действий - возможно использовать последовательное выполнение действий с сохранеием состояния в текстовом файле с непосредственным доступом - в такос члучае exec функция будет замещать текущее дерево исполнения


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
lexxpavlov
Отправлено: 21 Октября, 2010 - 09:43:31
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010  
Откуда: Россия, Саратов


Помог: 0 раз(а)




JustUserR, Спасибо за подробный пост с многими умными словами. Я тоже люблю такое читать и писать Улыбка
Но вот вопрос остается - как сделать вызов скрипта из другого скрипта, так, чтобы он продолжал работу после завершения вызвавшего.

Добавлю, что в будущем планируется переход на выделенный сервер, там я уже смогу настроить всё как мне захочется. Но, думаю, скрипт, который будет работать час - это не вариант. Хочется реализовать именно такой вот шедулер с параллельной обработкой хотя бы в 5-10 потоков.
(Добавление)
Нашел предложение записать в cron запуск скрипта каждую минуту. Улыбнуло!

Интересно, как работают системы с миллионом подобных запросов в час - например, автоответчики, рассыльщики писем и SMS и т.п.
 
 Top
EuGen Администратор
Отправлено: 21 Октября, 2010 - 10:56:37
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Работал с такой вот системой. Это
C++ форки - процесс порождает несколько дочерних, соответственно есть еще контролирующий демон, следящий за тем, чтобы с рассылщиком все было нормально. php там никто и не думал использовать - с многопоточностью в нем, скажем, не очень.
Как вариант решения - дочерними процессами регулярно проверять, есть ли родительский. А если нет - форкаться (при этом еще по-видимому, нужно учитывать их количество, чтобы не форкнуться несколько раз - например, писать арбитражный файл "я начинаю форкаться").


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
lexxpavlov
Отправлено: 21 Октября, 2010 - 11:31:45
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010  
Откуда: Россия, Саратов


Помог: 0 раз(а)




EuGen пишет:
дочерними процессами регулярно проверять, есть ли родительский. А если нет - форкаться

Я так понял, предложенная схема реализует постоянное присутствие процесса в памяти. И если родительского скрипта (контроллера) нет, то один из дочерних становится контроллером. Очень интересно, надо отметить себе идею. Может, и пригодится когда-нибудь.

Но сейчас нет задачи постоянного присутствия процесса в памяти. Контроллер запускается по расписанию (раз в сутки), запускает 10 "дочек", каждая из которых отрабатывает часть заданий, если мало, запускает сама себя. Задания закончились - все процессы завершаются.
 
 Top
lexxpavlov
Отправлено: 21 Октября, 2010 - 13:35:02
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2010  
Откуда: Россия, Саратов


Помог: 0 раз(а)




Сейчас смотрю:
Разработка многозадачных приложений на PHP V5
http://www[dot]ibm[dot]com/developerwork[dot][dot][dot]itask/index[dot]html

Есть кое-что интересное по теме асинхронных (параллельных) запросов/вычислений
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB