Jump to content
  • entries
    14
  • comments
    59
  • views
    2,551

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

Sign in to follow this  
Yoda

950 views

Господа, все мы сталкиваемся с ситуацией, когда необходимо сформировать большой набор данных, сайтмап, 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
Sign in to follow this  


3 Comments


Recommended Comments

Я не думаю, что вмешиваться в настройки 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

Share this comment


Link to comment
Guest
You are posting as a guest. If you have an account, please sign in.
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.