Pull to refresh

Оптимизация PHPShop

Reading time2 min
Views2.9K
Так уж случилось, что один из наших клиентов заказал нам добавить в его интернет магазин несколько десятков тысяч товаров. Магазин у него работал на небезызвестном PHPShop(версия 2.1.8). До этого момента, я с этим «чудом» не встречался. После добавления первых 5000 товаров магазин слег и мог показывать только белую страницу.  Тех поддержка отвечала что это все из-за хостера(MasterHost). Я им поверил и решил опробовать все на локальном веб-сервере. Магазин показывал ту же картину. Причем в списке задач отображалось, что Apache «съедает» 200 Мб оперативной памяти. Пришлось лезть во внутренности…

После недолгих поисков было обнаружено, что при выводе товаров скрипт не делал запрос к базе, чтобы получить конкретный товар. Оказалось что при запуске скрипта все товары из базы помещаются в глобальный массив, а затем, когда нужен определенный товар, он брался из этого массива. Причем занимался этим почему-то модуль, который по идее должен отвечать за кэширование(cache.inc.php). Мне это показалось очень странным. Переписывать весь скрипт, чтобы данные брались из БД только когда они нужны, было долго (этот глобальный массив использовался очень часто) и не было времени, так как заказчик торопил. Надо было искать другой выход и он был найден.

Необходимо было сделать так, чтобы, данные в массив попадали только при обращении к нему. После недолгих поисков был найден интерфейс ArrayAccess, который позволяет обращаться к объекту как к элементу массива. За пару часов все это было реализовано. Теперь данные в массив попадали только при обращении к нему. Так же дополнительно все полученные данные кешировались чтобы избежать нагрузку на MySQL сервер.

Решение проблемы не только восстановило работоспособность магазина, но и уменьшило время генерации страницы в ДВА раза.

Если кому-то интересно посмотреть на код решения проблемы, могу опубликовать его целиком в следующем посте.

Если разработчики PhpShop увидят этот пост, я бы хотел знать, чем они руководствовались, создавая глобальный массив со всеми товарами заранее.
Tags:
Hubs:
+53
Comments84

Articles