Перейти к содержанию
  • записей
    6
  • комментариев
    18
  • просмотров
    1 519

Как сделать нагруженный скрипт, не отъедая память у клиентов и не покупая сервер как в Пентагоне.

Yoda

329 просмотров

Господа, все мы сталкиваемся с ситуацией, когда необходимо сформировать большой набор данных, сайтмап, yandex-market фид, и любая подобная задача, требует всегда очень много ресурсов. 
Большинство авторов таких дополнений слыхом не слыхивали ни про CLI-PHP, ни про возможность органично выделять ресурсы исключительно под собственные скрипты, не затрагивая общие настройки сервера.

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

 

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

Обратились ко мне старые друзья с просьбой посмотреть, почему падает магазин.

Да они добавили 30 региональных поддоменов, увеличилась нагрузка, но это не повод, чтобы 4гб памяти и 4гб SWAP забивались за 10 минут.


Смотрим в настройки php_memory_limit 1gb. Система работает в связке nginx+php-fmp, и менеджер fpm резирвирует под каждый поток гиг памяти. Но нам то надо максимум 256МБ, для генерации любой страницы. Ок меняем настройки, немножко вносим тюнинг в конфиг php-fpm, все заработало, ресурсов хватает запас есть. Но из-за нехватки памяти отвалилась генерация YML, от одного известного автора.  И Яндекс-маркет блочит магазин. Новый год, продажи стоят.


Что делать?

 

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

 

Но послушайте. Ну есть же возможность задавать настройки "на лету" прямо из выполняемого скрипта.

И просто достаточно было добавить в код генерации яндекс-фида одну строку:

 

ini_set("memory_limit",-1);

 

И все.. Для всех скриптов, которые приходят на web-сервер у нас 256мб лимит, и наших 4 гигабайт хватает с головой обслужить весь входящий трафик и ботов. 
И без вопросов у нас генерится YML, которому мы разрешили использовать память безлимитно.

 

Простейшая же задача как 2+2. Но продав более 1000 копий своего дополнения, автор даже не задумывался о подобных проблемах. 
Не будьте как автор!

 

И еще. Не стесняйтесь вместо формирования каких то супермассивов, сразу писать все в файл.

Вместо какого нить  $thisoutYML->addItem($item), ведь очень просто делать $thisYmlSaveItemTofile($item).
 

Ну и практически все фиды можно отдавать в .gz экономя место и время.

  • +1 2


3 Комментария


Рекомендуемые комментарии

Я не думаю, что вмешиваться в настройки PHP средствами скрипта корректно. Да и безграничное потребление памяти может закончиться плохо. Тем более, что это у ВАС памяти много, а у кого-то с памятью не очень, и размер свопа на Linux не бесконечный.

 

Вместо этого я поступил иначе.

Вот такие строки есть в catalog/controller/extension/feed/yandex_yml.php

    //Сколько товаров брать из базы за один запрос
    //(чем больше товаров, тем больше потребление памяти, чем товаров меньше - тем больше нагрузка на SQL)
    protected $CHUNK_SIZE = 8000;

Т.е. в модуле, который @Yoda имеет в виду, из базы выбирается 8000 товаров, для них формируется фрагмент YML и сбрасывается на диск. Далее следующий фрагмент в 8000 товаров, пока товары не кончатся.

 

Что касается PHP-CLI, то это в модуле тоже используется. Вот только кто-то зафигачил в SeoPro в некоторые сборки зависимость ссылок от $_SERVER['SERVER_PROTOCOL'] или другие переменные окружения $_SERVER. Есть даже такие, которые делают "универсальные" конфиги, которые также зависят от $_SERVER. $SERVER, как известно, в PHP-CLI не определен, вот и получается ошибка:

<b>Notice</b>: Undefined index: SERVER_PROTOCOL in <b>/home/pogost/public_html/***.ru/system/storage/modification/catalog/controller/common/seo_pro.php</b> on line <b>377</b>

 

Универсальный модуль написать все-таки сложнее, чем кому-то на заказ что-то там кодить.

  • +1 2

Поделиться этим комментарием


Ссылка на комментарий

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.