[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как обойти max_execution_time = 30 sec?
oneoff
У меня вопрос, если можете, проконсультируйте пожалуйста.

Делаю личный сайт.
Есть недорогой виртуальный shared хостинг со следующими ограничениями:
память под php скрипт 256 мб.
макс. время выполнения PHP скрипта 30 сек.

Конечная задача стоит такая: нужно загружать на сервер изображения .jpg высокого разрешения, порядка от 48 до 150 мегапикселей, и распиливать их на тайлы (+некоторая обработка).
В идеале изображения должны загружаться в диалоговом режиме на сервер (синхронно), после чего там распиливаться (асинхронно), после чего оригинал удаляется.
Время выполнения скрипта не укладывается в 30 секунд, нужно как то организовывать очередь задач. Я представляю, каким образом скрипт можно партицировать на отдельные задачи, но не знаю, как организовать несколько запусков скрипта, как передавать следующему запуску скрипта, на каком месте остановился предыдущий. По идее весь скрипт для одного изображения должен отрабатывать не больше 15 минут в самом сложном случае, а обычно минуты 3-5. Изображений будет загружаться немного, максимум, думаю, до сотни в день, в среднем - единицы.

Как обойти 30 секундный лимит?

От рекомендуемых в инете решений глаза разбегаются, и непонятно что целесообразно делать в моем случае.
1) PHP + использовать gearman. тяжелая артиллерия, не знаю как проверить, можно ли запустить на хостинге, и не будет ли стрельбой из пушки по воробьям?
2) cron + PHP worker + queue stored in mysql or in a JSON file. Есть например вот это, но пример кода увы отсутствует: https://habrahabr.ru/post/147844/
3) PHP + ajax + js, синхронная обработка с прогресс баром. Непонятны моменты как передавать текущий статус, ну и хотелось все таки чтобы пользователь после загрузки изображения мог спокойно закрывать браузер, а не ждать постобработки.
4) js - processing photo at client then loading. Этот вариант рассматривать не хотелось бы.
5) не PHP. может быть переписать скрипт на python, может быть там не будет такого ограничения по времени выполнения? как это можно узнать?
SSH доступ к серверу есть.
T1grOK
Цитата (oneoff @ 23.04.2017 - 23:40)
Есть недорогой виртуальный shared хостинг со следующими ограничениями

Берем меняем на недорогой VPS, который примерно столько же стоит и забываем о многих проблемах.
Цитата (oneoff @ 23.04.2017 - 23:40)
1) PHP + использовать gearman. тяжелая артиллерия, не знаю как проверить, можно ли запустить на хостинге, и не будет ли стрельбой из пушки по воробьям?

gearman нынче особо не развивается, так что лучше взять RabbitMQ или ZeroMQ.
Решение с сервером очередей нормальное, не нужно свои велики писать.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
AllesKlar
Цитата (oneoff @ 24.04.2017 - 01:40)
2) cron + PHP worker + queue stored in mysql or in a JSON file. Есть например вот это, но пример кода увы отсутствует

Это хорошее решение.
Все тяжелые процессы должны выполняться в CLI, там нет ограничения по времени исполнения.

Болле того, если ты владеешь другими языками (упомянул питона), то отдай worker этому языку + linux (imagemagick, например) это будет в разы быстрее. PHP не предназначен (может, но не предназначен) для этого.
Отдай php веб-морду / api, остальное реализуй другими средствами.

Как это устроено у нас (в очень сокращенном варианте):
1. frontend / api (php, java)- заливка source + регистрация в базе задачи. Залилось, клиенту сказали "Ок, задача зарегистрирована, контент в обработке".
2. у каждой задачи есть свой список необходимых процессов
3. каждый процесс, после завершения, регистрирует следующий процесс, в зависимости от
контента, клиентских настроек и т.д. либо завершает задачу.
4. по таймеру выбираются из базы задачи / процессы.

пункты 2-4 реализованы на java, python, lua, imagemagick, ffmpeg

Увеличивать же время исполнения скрипта - это костыль, который сломается, как только наткнешься на контент большого размера, или захочешь далее развивать проект.
Скажем так - есть такое понятие: стабильность приложения. Так вот,зависимость скрипта от разрешенного времени исполнения - это 100% нестабильность приложения.

_____________
[продано копирайтерам]
oneoff
большое спасибо за ответы.

да, для обработки непосредственно изображений использую функции imagemagick.
если реализовывать вариант (2) , то очень хотелось бы иметь перед глазами код, примерработающего воркера и очереди. Опыта разработки у меня мало, боюсь накосячить, например, наплодив мертвых процессов или заняв всю память.

скрипт у меня не сложный, плюс испоьзует имаджик, поэтому предполагаю что мог бы при необходимости переписать его на python, на котором раньше не писал, изучив синтаксис по ходу.
AllesKlar
Цитата (oneoff @ 24.04.2017 - 11:01)
Опыта разработки у меня мало

упс...
Ну, тогда форкни просто скрипт, пусть работает в бекграунде. Как закончит, ставит в базе флаг.
Все, кто заинтересован в результате процесса, мониторят этот флаг.

How to fork with PHP

_____________
[продано копирайтерам]
Быстрый ответ:

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