Как я могу разбить PHP-скрипт, который занимает много времени для разбивки на более мелкие куски? - PullRequest
3 голосов
/ 13 октября 2008

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

Моя учетная запись общего хостинга позволяет мне выполнять сценарий только 30 секунд, как указано в настройках php.ini. Я не могу это изменить.

Что я могу сделать, чтобы обойти это? В настоящее время я обновляю страницу после каждых 5 изображений, это предотвращает тайм-аут сценария, но браузер распознает, что сценарий не завершится, и выдает ошибку. Это нормально, но не очень удобно для пользователя.

Есть предложения?

Ответы [ 8 ]

4 голосов
/ 13 октября 2008

Возможно, вам следует избегать пакетирования и создать сценарий генерации прокси, который выполняет процесс для каждого изображения по требованию .

Перепишите код конвертации в прокси-скрипт PHP, который проверяет, есть ли на изображении уже пиктограмма, и если нет, делает то, что нужно сделать. Затем файл с водяными знаками или водяными знаками можно загрузить и отправить клиенту с помощью fpassthru().

Ваша веб-страница должна ссылаться только на прокси-скрипт, например

<img src="/image.php?DSC001.JPG">

Если ваш провайдер поддерживает Apache / переписывание, вы можете сделать еще больше волшебства, обходя сценарий прокси / генерации, если миниатюра уже была создана.

3 голосов
/ 13 октября 2008

получить список изображений и затем просмотреть их например, вы получаете 500 imgs, которые вы можете взять по 5 за раз, и после того, как вы закончите с ними, выведите мета-тег обновления, который перезагрузит скрипт через 2 секунды, например, с номером изображения, на котором вы сейчас находитесь параметр.

<meta http-equiv="refresh" content="2;url=script.php?start=5">

и в вашем скрипте также проверьте, что такое $ _GET ['start'], и продолжайте оттуда со следующими 5 изображениями, затем выводите start = 10 и так одно ... пока вы не пройдете все их циклы.

3 голосов
/ 13 октября 2008

три идеи:

  1. вы можете разгрузить это на скрипт, работающий на сервере (возможно, на PHP CLI?), И ваш текущий скрипт будет проверять ход выполнения (все еще работает! Проверьте позже!).

  2. если в вашей среде нормально работает javascript, возможно, вы могли бы также сделать вызовы ajax, чтобы справиться с этим. первое решение позволяет пользователю постоянно бродить по сайту, хотя и не уверен, является ли это важным фактором в вашем случае.

  3. вы можете заставить PHP-скрипт просто выполнить определенный пакет (скажем, 10 изображений за один раз), затем обновить страницу с отчетом о ходе выполнения и пойти еще на 10, вместо произвольного обновления на основе времени.

1 голос
/ 13 октября 2008

Вы также можете попробовать оптимизировать ваш скрипт. Ты слишком много делаешь в своей петле? Не могли бы вы переместить что-то из цикла? Что вы используете, чтобы получить список файлов? Есть ли более легкий способ сделать это? Такого рода вопросы вы можете задать себе относительно своего сценария, чтобы вместо его разделения вы могли вовремя запустить весь шебанг.

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

1 голос
/ 13 октября 2008

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

0 голосов
/ 13 октября 2008

В env с общим хостингом я бы не рекомендовал запускать скрипт, обработка которого могла бы занять более 30 секунд, и даже не думал о set_time_limit . Что я бы порекомендовал, так это то, что вы либо делаете свои эскизы и ставите водяные знаки при загрузке изображений? или запрос изображения и пометьте изображение как выполненное, чтобы вам не пришлось делать это снова. Другой вариант - запустить пакет, который будет обрабатывать, например, 10 изображений каждую минуту или 10 минут, но запускать скрипт через cli в crontab ....

Полезно всегда знать, сколько ресурсов может использовать ваш скрипт при запуске пакетного скрипта .... особенно в среде общего хостинга .... это может легко повлиять на других пользователей.

0 голосов
/ 13 октября 2008

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

Если вы уверены, что то, как вы это делаете, является единственным способом, то посмотрите на функцию set_time_limit, чтобы увеличить время выполнения скрипта.

0 голосов
/ 13 октября 2008

Как насчет списка задач, например:

  1. Первый скрипт создает список изображений, для которых нужны миниатюры или водяные знаки
  2. Второй скрипт проверяет этот список и делает первые 5 или около того (сколько бы их ни было сделано в срок) и удаляет их из списка
  3. Пусть сценарий на шаге 2 вернет значение, которое сообщит вам, если список пуст, если нет, то повторите шаг 2 (возможно, проще всего с ajax)

При использовании этого метода единственное, что «работает» на протяжении всего времени - это страница в вашем браузере, каждый сценарий выполняется только в течение 30 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...