[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"expertises:{\"sort\":\"order\",\"perPage\":100,\"is_main\":1}":3,"blog-post-online_games":44,"blog:{\"perPage\":4}":61},{"currentPage":4,"lastPage":4,"perPage":5,"from":4,"to":6,"total":6,"nextPageUrl":7,"previousPageUrl":7,"items":8},1,20,5,null,[9,16,23,30,37],{"id":10,"title":11,"shortDescription":12,"imageUrl":13,"url":14,"slug":15},43,"Заказная разработка","\u003Cdiv class=\"service-content\">\r\n\u003Cul>\r\n\u003Cli style=\"font-size: 12pt;\">\u003Cspan style=\"font-size: 12pt;\">• Разработка веб-приложений\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli style=\"font-size: 12pt;\">\u003Cspan style=\"font-size: 12pt;\">• Разработка мобильных приложений\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli style=\"font-size: 12pt;\">\u003Cspan style=\"font-size: 12pt;\">• Разработка продуктов и стартапов (MVP)\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003C\u002Fdiv>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fexpertises\u002F43\u002Fmain\u002F9b536e910e22b0c053432f4058d5594ca6f79874.jpg","\u002Fservices\u002Fcustom-development\u002F","custom-development",{"id":17,"title":18,"shortDescription":19,"imageUrl":20,"url":21,"slug":22},52,"ИИ-разработка","\u003Cp dir=\"ltr\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">Внедрение ИИ в работу компаний и предприятий\u003C\u002Fspan>\u003C\u002Fp>\r\n\u003Cul>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Автоматизация рутинных процессов\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• LLM и RAG-системы (корпоративный GPT, чат-боты)\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• ML (обучаемые модели)\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Компьютерное зрение\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Генеративные интерфейсы\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003Cp>&nbsp;\u003C\u002Fp>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fexpertises\u002F52\u002Fmain\u002Fb245231d8506ae3ea4c77015c36c3b25499952f1.png","\u002Fservices\u002Fai\u002F","ai",{"id":24,"title":25,"shortDescription":26,"imageUrl":27,"url":28,"slug":29},41,"Интеграция и автоматизация","\u003Cdiv class=\"service-content\">\r\n\u003Cp>\u003Cspan style=\"font-size: 12pt;\">Кастомная разработка\u003C\u002Fspan>\u003C\u002Fp>\r\n\u003Cul>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Автоматизированных систем управления\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Личных кабинетов\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Учетных систем\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• CRM\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• ERP\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003Cp>&nbsp;\u003C\u002Fp>\r\n\u003Cp>\u003Cspan style=\"font-size: 12pt;\">Внедрение PIM-систем\u003C\u002Fspan>\u003C\u002Fp>\r\n\u003Cul>\r\n\u003Cli>\u003Cspan style=\"font-size: 12pt;\">• На базе PIMcore\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003Cp dir=\"ltr\" role=\"presentation\">&nbsp;\u003C\u002Fp>\r\n\u003Cp dir=\"ltr\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">Автоматизация бизнеса\u003C\u002Fspan>\u003C\u002Fp>\r\n\u003Cul>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• На базе заказной разработки\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Заказная разработка + точечное внедрение ИИ\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003Cp>&nbsp;\u003C\u002Fp>\r\n\u003C\u002Fdiv>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fexpertises\u002F41\u002Fmain\u002F7f0f8a036ec2c365f2099d796f774c2a0053a63d.png","\u002Fservices\u002Fintegration-automation\u002F","integration-automation",{"id":31,"title":32,"shortDescription":33,"imageUrl":34,"url":35,"slug":36},53,"Аренда выделенных команд","\u003Cul>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Поддержка и развитие веб-сервисов\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Создание веб-сервисов “с нуля”\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003Cp>&nbsp;\u003C\u002Fp>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fexpertises\u002F53\u002Fmain\u002F3c00e6bbc3263141bc54ea51b816e383fcc49506.png","\u002Fservices\u002Fit-outsourcing\u002F","it-outsourcing",{"id":38,"title":39,"shortDescription":40,"imageUrl":41,"url":42,"slug":43},44,"ИТ-консалтинг","\u003Cul>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Аудит и оптимизация инхаус-команд\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• Продуктовый консалтинг\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003Cli dir=\"ltr\" style=\"font-size: 12pt;\" role=\"presentation\">\u003Cspan style=\"font-size: 12pt;\">• HR в сфере диджитал\u003C\u002Fspan>\u003C\u002Fli>\r\n\u003C\u002Ful>\r\n\u003Cp>&nbsp;\u003C\u002Fp>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fexpertises\u002F44\u002Fmain\u002F53c7eb07fb9f9d3b8f2184b6026cd9fcae15a875.png","\u002Fservices\u002Fit-consulting\u002F","it-consulting",{"id":45,"order":46,"title":47,"slug":48,"publishedAt":49,"shortDescription":50,"previewImageUrl":51,"tags":52,"fullDescription":57,"ogImageUrl":51,"metaTitle":58,"metaDescription":59,"createdAt":60,"updatedAt":60},214,500,"Асинхронное приложение для онлайн-игр... на PHP. Серьёзно? Да!","online_games","2021-06-21","\u003Cp>\n\tНаш заказчик из&nbsp;отрасли онлайн-игр (игр для вечеринок). Festa&nbsp;— игровая платформа в&nbsp;формате онлайн-конференции.\n\u003C\u002Fp>\n\u003Cp>\n\tВ&nbsp;этом проекте нам потребовалось работать с&nbsp;действиями от&nbsp;нескольких человек на&nbsp;одной странице браузера в&nbsp;реальном времени. Пользователи должны иметь возможность объединяться в&nbsp;комнаты, чтобы общаться в&nbsp;чате, взаимодействовать друг с&nbsp;другом в&nbsp;различных играх, да&nbsp;и&nbsp;просто веселиться (это ведь игры для вечеринок).\n\u003C\u002Fp>\n\u003Cp>\n\tРазработчики поймут вопрос «... на&nbsp;PHP. Серьёзно?», заданный в&nbsp;заголовке.\n\u003C\u002Fp>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fnews\u002F214\u002Fpreview\u002F08778796796f52967f27e005d83b51b65aeecba8.png",[53],{"id":54,"name":55,"slug":56},26,"Процесс","process","\u003Cp>Наш заказчик из отрасли онлайн-игр (игр для вечеринок). Festa — игровая платформа в формате онлайн-конференции: \u003Ca href=\"https:\u002F\u002Ffesta.games\u002F\" target=_blank rel=\"nofollow\">https:\u002F\u002Ffesta.games\u002F\u003C\u002Fa>. \n\n\u003Cp>В этом проекте нам потребовалось работать с действиями от нескольких человек на одной странице браузера в реальном времени. Пользователи должны иметь возможность объединяться в комнаты, чтобы общаться в чате, взаимодействовать друг с другом в различных играх, да и просто веселиться (это ведь игры для вечеринок). \n\n\u003Cfigure class=\"img-shadow\">\u003Cimg src=\"https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Ffiles\u002Fe979b3d4202f00a89be74f34f43435c5dfdc9472.png\" alt=\"\"> \u003Cfigcaption>Интерфейс платформы festa.games\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\n\u003Cp>Разработчики поймут вопрос «... на PHP. Серьёзно?», заданный в заголовке. \n\n\u003Cp>Самое разумное решение такой задачи — использование \u003Ca href=\"https:\u002F\u002Fru.wikipedia.org\u002Fwiki\u002FWebSocket\" target=_blank rel=\"nofollow\">WebSocket\u003C\u002Fa>, протокола обмена сообщениями между браузером и веб-сервером в режиме реального времени. Для работы с вебсокет-сообщениями все обычно обращаются к Node.js. Использовать PHP в таком ключе боятся, т.к.у него нет встроенных механизмов для асинхронной работы.\n\n\u003Cp>Но задача нашего заказчика была срочной, и у нас не было времени на изучение «ноды» и всего, что с ней связано. Поэтому мы разрабатывали с помощью библиотеки ReactPHP, с которой уже «собаку съели». \n\n\u003Cp>Было принято решение писать бэкенд на асинхронном PHP. В качестве реализации мы выбрали \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fratchetphp\u002FRatchet\" target=_blank rel=\"nofollow\">Ratchet\u003C\u002Fa>, библиотеку для асинхронной обработки вебсокет-сообщений. «Под капотом» здесь как раз \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Freactphp\u002Freactphp\" target=_blank rel=\"nofollow\">ReactPHP\u003C\u002Fa>.\n\n\u003Cp>И... всё работает. Опыт получился интересным и даже уникальным, решили поделиться им с проф.сообществом. Расскажем про сложности, хитрости и плюсы технологии. \n\n\u003Ch3>Как вели разработку и в чём её особенности\u003C\u002Fh3>\n\n\u003Cp>В «классическом» PHP каждый запрос обрабатывается отдельным процессом. Но Ratchet для сервера запускает только \u003Cstrong>\u003Ci>один\u003C\u002Fi>\u003C\u002Fstrong> процесс, который слушает все вебсокет-сообщения с порта, который мы указываем в настройках. Из-за этого при программировании сервера нужно учитывать ряд особенностей. \n\n\u003Cp>Вот основные из них.\n\n\u003Ch4>1 — Память ограничена\u003C\u002Fh4>\n\n\u003Cp>Работая с одним постоянно запущенным процессом, нужно постоянно следить за большим объемом данных. \n\n\u003Cp>Для примера расскажем про список подключений. \n\n\u003Cp>Если их просто добавлять, не контролировать активность и другие важные параметры, то в какой-то момент можно упереться в нехватку памяти.\n\n\u003Cp>Из-за этого приложение будет работать медленно или вообще перестанет работать. \n\n\u003Cp>В «классическом» случае при разработке на PHP об этом даже не задумываешься. Создаётся процесс для PHP, обрабатывает запрос (например, сервер «отдаёт» страницу сайта), после чего процесс удаляется, очищая память.\n\n\u003Cp>В нашем случае для асинхронной работы процесс создаётся, обрабатывает запросы, но и после этого продолжает работать, ожидая новые сообщения. Из-за этого память может накапливаться с каждым новым запросом\n\n\u003Cp>Поэтому тут нужен более внимательный подход.\n\n\u003Ch4>2 — Блокировки — это плохо\u003C\u002Fh4>\n\n\u003Cp>При работе асинхронного приложения нельзя использовать блокирующие функции. \n\n\u003Cp>Классический пример — запрос информации из базы данных. Если использовать стандартные функции для работы с БД, наш сервер сформирует запрос в БД, отправит его, и пока ответ не вернётся, все наши вебсокет-сообщения будут висеть. А тем временем пользователи не будут понимать, почему их сообщения никто не получил. \n\n\u003Cp>Из этого пункта вытекает следующая особенность программирования сервера.\n\n\u003Ch4>3 — Нестандартная работа с базой данных\u003C\u002Fh4>\n\n\u003Cp>Как мы писали выше: блокировать ничего нельзя, а запросы к БД делать нужно.\n\n\u003Cp>Для решения данной проблемы мы используем асинхронного клиента для работы с БД \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fvoryx\u002FPgAsync\" target=_blank rel=\"nofollow\">PgAsync\u003C\u002Fa>.\n\n\u003Cp>Основное отличие асинхронных приложений — сделав запрос, не стоит ожидать, что в следующей строчке кода (как это работает обычно) все данные у вас уже будут. Не будут. Тут на помощь приходят callback-функции, в которые «заворачиваем» всё, что хотим сделать при загрузке необходимых данных:\n\n\u003Cdiv class=\"spoiler js-spoiler\">\n\u003Ch4>\u003Cspan class=\"js-spoiler-toggle\">Сравнение способов получения данных\u003C\u002Fspan>\u003C\u002Fh4>\n\u003Cdiv class=\"content\">\u003Cpre>\u003Ccode class=\"language-js\">\n  \u002F**\n   * Получение данных \"классическим\" способом\n   *\u002F\n  private function getData(): void\n  {\n      $data = $this->getDataFromDB();\n      var_dump($data); \u002F\u002F Сформированные данные из БД\n  }\n  \n  \u002F**\n   * Получение данных асинхронно\n   *\u002F\n  private function getDataAsync(): void\n  {\n      $onDataLoaded = function ($data) {\n          var_dump($data); \u002F\u002F Сформированные данные из БД\n      };\n  \n      $data = $this->getDataFromDBAsync($onDataLoaded);\n      var_dump($data); \u002F\u002F null\n  }\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\n\u003Ch4>4 — Фатальные ошибки фатальны\u003C\u002Fh4>\n\n\u003Cp>В целом, данное утверждение актуально для разработки на любом языке программирования и на любой технологии. \n\n\u003Cp>Проблема в Ratchet заключается в том, что любое исключение или ошибка сопровождаются падением «\u003Ca href=\"https:\u002F\u002Fru.wikipedia.org\u002Fwiki\u002F%D0%94%D0%B5%D0%BC%D0%BE%D0%BD_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0)\" target=_blank rel=\"nofollow\">демона\u003C\u002Fa>» с нашим сервером. Из-за чего все наши подключения к серверу будут разорваны, пользователям придётся каким-то образом переподключаться к серверу, а нам восстанавливать все данные.\n\n\u003Cp>В таких приложениях очень важно поддерживать качество кода: \n\n\u003Cul>\u003Cli>соблюдать Code Style (у всех разработчиков должен быть настроен IDE с code style по PSR-12)\n\u003Cli>придерживаться Type Hinting (правильное описание и использование типов позволяет существенно уменьшить количество ошибок) \n\u003Cli>регламентировать PHPDoc (правильное документирование кода также позволяет уменьшить количество ошибок)\u003C\u002Ful> \n\n\u003Cp>Всем понятно, написать на 100% чистый код очень сложно, поэтому периодически ошибки всё равно могут всплывать. Их нужно ловить.\n\n\u003Cp>Для отлова и минимизации ущерба от ошибок, которые всё-таки проскочили, мы используем:\n\u003Cul>\u003Cli>\u003Ca href=\"http:\u002F\u002Fsupervisord.org\u002F\" target=_blank rel=\"nofollow\">Supervisor\u003C\u002Fa> как инструмент управления процессами нашего сервера. Он запускает сервер отдельным процессом, и при его падении автоматически перезапускает. Все логи из потока вывода он складывает в файлы, в соответствии с конфигурацией. \n\u003Cli>\u003Ca href=\"https:\u002F\u002Fsentry.io\u002Fwelcome\u002F\" target=_blank rel=\"nofollow\">Sentry\u003C\u002Fa> как сервис мониторинга ошибок различных языков программирования, в том числе JavaScript и PHP. С его помощью можно отлавливать ошибки, возникающие как в браузере пользователя, так и на самом сервере.\u003C\u002Ful>\n\n\u003Ch3>У асинхронного сервера есть и плюсы!\u003C\u002Fh3>\n\n\u003Ch4>1 — Быстрый ответ сервера\u003C\u002Fh4>\n\n\u003Cp>Наше приложение работает всё время в фоне, поэтому при обработке запроса не нужно тратить время на запуск процесса, инициализацию, чтение конфигураций и т.д.\n\n\u003Ch4>2 — Уменьшение нагрузки на базу данных\u003C\u002Fh4>\n\n\u003Cp>Получив данные из БД, можно хранить их в самом сервере, не делая повторных запросов. Однако тут проходит тонкая грань с пунктом про ограничение памяти, описанным выше. Поэтому нужно осознанно решать, что именно хранить на сервере, а за какими данными лучше лишний раз «сходить» в базу.\n\n\u003Ch4>3 — Оптимизация цикла событий\u003C\u002Fh4>\n\n\u003Cp>В Ratchet можно выполнять код по определенным событиям или времени. Это позволяет оптимизировать EventLoop — вовремя очищать сервер от неиспользуемых данных и поддерживать стабильную работу приложения. Также у нас появляется возможность дополнительно использовать различные механики игр, такие как таймеры и секундомеры. \n\n\u003Ch3>Вывод\u003C\u002Fh3>\n\n\u003Cp>Не бойтесь пробовать новые технологии или применять для новых задач хорошо вам известные инструменты. На нашем примере оказалось, что писать асинхронные приложения даже на PHP вполне реально. И в этом есть даже преимущества. «Серьёзно?» — Серьёзно :)\n\n\u003Cp>Радует, что и сам язык развивается в этом направлении. Надеемся, \u003Ca href=\"https:\u002F\u002Fwiki.php.net\u002Frfc\u002Ffibers\" target=_blank rel=\"nofollow\">Fibers\u003C\u002Fa> в версии 8.1 дадут новый виток развития асинхронных приложений на PHP. \n\n\u003Cp>В нашем случае библиотека Ratchet позволила нам в короткие сроки собрать прототип работающего приложения для совместных игр пользователей.","Асинхронное приложение для онлайн-игр... на PHP. Серьёзно? Да! — SVK.Digital","Расскажем про сложности, хитрости и плюсы PHP","2026-05-15 07:37:58",{"currentPage":4,"lastPage":62,"perPage":63,"from":4,"to":63,"total":64,"nextPageUrl":65,"previousPageUrl":7,"items":66},31,4,124,"https:\u002F\u002Fapi.internet-design.ru\u002Fapi\u002Fblog?perPage=4&page=2",[67,75,83,91],{"id":68,"order":4,"title":69,"slug":70,"publishedAt":71,"shortDescription":72,"previewImageUrl":73,"tags":74},250,"ИИ в рекрутинге: почему HR'ы остаются риском для системы","hr-ai-recruiter-risks","2026-06-11","\u003Cp>Где HR-команды чаще всего ошибаются при работее с корпоративным ИИ, почему из-за этого даже сильное решение начинает работать против компании и как выстроить процесс так, чтобы ИИ усиливал рекрутера\u003C\u002Fp>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fblogs\u002F250\u002Fpreview\u002F6d0df821c17246e568682f625a2bf0bec711e543.jpg",[],{"id":76,"order":4,"title":77,"slug":78,"publishedAt":79,"shortDescription":80,"previewImageUrl":81,"tags":82},247,"Штрафы за авторизацию через Google и Apple ID: кому грозят и что делать","google-apple-auth-fines","2026-06-10","\u003Ch2>&nbsp;\u003C\u002Fh2>","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fblogs\u002F247\u002Fpreview\u002Feb4d7ec37a740ed468a633cbdcd24c4cc27e2ad7.png",[],{"id":84,"order":4,"title":85,"slug":86,"publishedAt":87,"shortDescription":88,"previewImageUrl":89,"tags":90},249,"Как вернуть под контроль теневой ИИ в клинике","shadow-ai-medicine","2026-06-04","","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fblogs\u002F249\u002Fpreview\u002F2e43161fed61bca56c185e893c694c63987808b1.jpg",[],{"id":92,"order":4,"title":93,"slug":94,"publishedAt":95,"shortDescription":88,"previewImageUrl":96,"tags":97},244,"Избегаем дорогих архитектурных ошибок в разработке сложных веб-приложений","expensive-architectural-mistakes","2026-04-30","https:\u002F\u002Fa2a7be71-be8a-4951-a3b2-e244e2e9ee45.selstorage.ru\u002Fnews\u002F244\u002Fpreview\u002Ffda0d684985e23ed3c225c3a0a1446356fd52473.jpg",[98],{"id":99,"name":100,"slug":101},30,"Школа заказчика","customers"]