Internal Server Error при обработке графики

12 3
KS
На сайте с 11.06.2012
Offline
17
2101

Здравствуйте.

На днях взяли VPS с 2ГБ выделенной оперативки, Ubuntu 10.04.4 LTS, apache2 2.2.14-5ubuntu8.11 amd64, PHP Version 5.3.2-1ubuntu4.19.

Требуется обрабатывать графику. Точнее, на детятки картинок PNG по ~2МБ каждая, накладывать ватермарк. Пробовал делать это и с помощью imagick, и с помощью GD. В обоих случаях, после нескольких картинок скрипт падает, и выдаётся Internal Server Error. В error_log PHP ничего не записывается. В error.log Apache записывается следующее:

[Fri Jun 21 22:58:30 2013] [warn] mod_fcgid: process 7817 graceful kill fail, sending SIGKILL

Релевантные установки в php.ini:

memory_limit = 1024M

max_execution_time = 3600

ignore_user_abort = On

safe_mode = Off

Посоветуйте, пожалуйста, что-нибудь. С чего начать? О чём искать? Куда смотреть?

Заранее благодарю за любую помощь.

П.С. Я PHP-программист, но это моя первая в жизни попытка сис-админства.

FileSafe (http://filesafe.anek.ws/) - мониторинг неизменности файлов сайта для защиты от взлома. Для форумчан - первый год бесплатно.
W2
На сайте с 18.06.2013
Offline
3
#1

Вы с помощью php обрабатываете? Попробуйте скриптами imagick через систему. Т.е. shell-командами конкретно в системе, в обход php.

KS
На сайте с 11.06.2012
Offline
17
#2

Это вариант, спасибо. Сейчас поковыряюсь.

Всё же, интересно, из-за чего может падать PHP-скрипт?

П.С. Второстепенный вопрос, не важный, но если кто знает... В php.ini стоит output_buffering = Off, но вывод всё равно буферизуется - пока скрипт не закончит работу, ничего не показывается в браузере. Можно ли от этого избавиться?

W2
На сайте с 18.06.2013
Offline
3
#3

KostaShah,

Так правильно, ничего и не будет показываться до тех пор, пока скрипт не отработает. Это специфика такая.

И кстати, у вас php стоит как CGI-приложение. Может быть если перекомпилировать его в качестве модуля к apache, ситуация бы изменилась, возможно в лучшую сторону.

KS
На сайте с 11.06.2012
Offline
17
#4
webguru2013:
KostaShah,
ничего и не будет показываться до тех пор, пока скрипт не отработает

Но на другом сервере, на шаред хостинге, это не так. Я в скрипте выдаю эхо поле каждой картинки, и оно сразу выводится в браузер, и я сразу вижу, сколько картинок уже обработалось, как быстро они обрабатываются. Это очень удобно. Интересно, как сделать, чтобы и тут так?

M
На сайте с 30.07.2009
Offline
52
#5
KostaShah:
Но на другом сервере, на шаред хостинге, это не так. Я в скрипте выдаю эхо поле каждой картинки, и оно сразу выводится в браузер, и я сразу вижу, сколько картинок уже обработалось, как быстро они обрабатываются. Это очень удобно. Интересно, как сделать, чтобы и тут так?

так:

http://php.net/manual/en/function.ob-flush.php

пробовали?

KS
На сайте с 11.06.2012
Offline
17
#6
mirrustam:
так:
http://php.net/manual/en/function.ob-flush.php
пробовали?

Пробовал flush() - не помогает. А ob_flush() можно (имеет смысл) делать, если не было ob_start() ?

pupseg
На сайте с 14.05.2010
Offline
347
#7
KostaShah:
Это вариант, спасибо. Сейчас поковыряюсь.
Всё же, интересно, из-за чего может падать PHP-скрипт?

П.С. Второстепенный вопрос, не важный, но если кто знает... В php.ini стоит output_buffering = Off, но вывод всё равно буферизуется - пока скрипт не закончит работу, ничего не показывается в браузере. Можно ли от этого избавиться?

у вас это стоит в общесистемном php.ini ? php-cgi\fastcgi запускается отдельным процессом в системе и у него свой php.ini.

LogLevel debug поставьте в /etc/httpd/conf/httpd.conf - если ценос , если недолинукс типа дебиана, то в /etc/apache2/apache2.conf, передерните апач:

service httpd restart - если центос или RHEL

или

/etc/init.d/apache2 restart - если недолинукс типа дебиана.

так же, необходимо увидеть, что у вас в /etc/httpd/conf.d/mod_fcgid.conf или чтото в этом роде, если у вас всетаки похапе в режиме cgi работает.

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

---------- Добавлено 22.06.2013 в 10:28 ----------

в догонку:

mod_fcgid: process 7817 graceful kill fail, sending SIGKILL - это, возможно, уже не ваш код виноват.

вам серверное ПО говорит - что заслало принудительный килл процессу.

как минимум наверное нужно в /etc/htttpd/conf.d/mod_fcgid.conf или как там этот конфиг называется поставить число:

IPCConnectTimeout

и

IPCCommTimeout

поболее....

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

если у вас впс - то нужно смотреть впс + если впс не хватает ресурсов - увеличивать.

если у вас сервер - то нужно смотреть сервер.

Качественная помощь в обслуживании серверов. (/ru/forum/661100) Бесплатных консультаций не даю, не помогаю, не обучаю. Минималка от 100$. Как пропатчить KDE-просьба не спрашивать. Есть форумы (http://linux.org.ru) и полезные сайты (http://www.opennet.ru/).
Andreyka
На сайте с 19.02.2005
Offline
822
#8

Делайте это по крону

Не стоит плодить сущности без необходимости
Den73
На сайте с 26.06.2010
Offline
523
#9

pupseg

почему debian недолинукс?

в debian есть sysvinit-utils,

service apache2 restart

тс,

не смотрите php.ini, смотрите то что возвращает phpinfo()

KS
На сайте с 11.06.2012
Offline
17
#10

pupseg, огромное спасибо! Поставил оба параметра (IPCConnectTimeout и IPCCommTimeout) в 3600, прогнал пару раз, полёт нормальный! Не падает! Обработал 60 файлов (все что надо было) за 103 секунды :)

Это был Ubuntu

Andreyka:
Делайте это по крону

По крону неудобно. Там админ должен просмотреть картинки, определить к чему они относятся, распределить их, утвердить, и тогда уже обрабатывать.

П.С. php.ini находится в /etc/php5/cgi/php.ini , и я убедился, что задействован именно он - изменения в нём отражаются в phpinfo().

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий