Verification: a143cc29221c9be0

Php app console cache clear

Php app console cache clear

Содержание

Архитектура

codeАрхитектура расположения каталогов программного комплекса подразумевает под собой чёткое разделение двух различных типов данных: изменяемых данных пользователя (настройки, временные файлы, логи т.д.) и неизменяемых данных (модули, программы, служебные файлы).

Если говорить простым языком, то в папке modules никакие файлы никогда не изменяются, не создаются и не удаляются, а в папках domains и userdata напротив, данные постоянно меняются. Такая архитектура создана специально для упрощения синхронизации данных между различными копиями комплекса и экономии места при резервном копировании.

Установка и запуск

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

Сборку можно разместить на внешнем жёстком диске, это позволит использовать Open Server Panel на любом компьютере, который отвечает системным требованиям. Однако не стоит размещать сборку на USB-флеш накопителе из-за крайне медленной работы флеш-памяти при параллельных запросах на чтение/запись и её быстрого износа.

Желательно установить Open Server Panel на SSD-накопитель, при его наличии. Это позволит значительно повысить скорость работы всех модулей и компонентов программного комплекса.

Внимание!

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

Системные требования

  • Поддерживаемые версии ОС: Windows 7 SP1 x64 / Windows Server 2008 R2 SP1 или новее (32-битные системы не поддерживаются);
  • Минимальные аппаратные требования: 500 МБ свободной RAM и 4 ГБ свободного места на HDD;
  • Требуется наличие Microsoft Visual C++ 2005-2008-2010-2012-2013-2015-2019 Redistributable Package;

Установка

В процессе установки Open Server Panel отметьте галочками пункт по установке Microsoft Visual C++ 2005-2008-2010-2012-2013-2015-2019 Redistributable Package, пункт по установке RuntimePack Lite, пункт по настройке Windows и пункт по оптимизации системы для работы с SSD (при его наличии). Без выполнения этих действий работа Open Server Panel на вашем компьютере не гарантируется.

Установку/переустановку библиотек от Microsoft и применение настроек Windows необходимо выполнять c каждой новой версией Open Server Panel даже в том случае, если вы уже делали это ранее.

Запуск

Для запуска Open Server Panel используйте файл Open Server.exe. После старта программы вы увидите красный флажок в области уведомлений Windows (область возле системных часов). Чтобы включить непосредственно сам веб-сервер и сопутствующие модули нажмите на флажок, далее выполните [Меню → Запустить].

Если сервер не запускается перейдите к разделу Решение проблем данного справочного руководства.

Настройка Windows 10

Перед установкой Open Server Panel в системах семейства Windows 10 необходимо обязательно предварительно снять галочку, показанную на картинке, и перезагрузить систему.

Без выполнения данного условия запуск Open Server Panel в системах семейства Windows 10 будет невозможен. В случае попытки запуска до выполнения данного условия произойдёт порча файлов конфигурации программы, что приведёт к невозможности её дальнейшего использования и запуска.

Установка обновлений

Open Server Panel это достаточно сложный программный комплекс с постоянно совершенствующейся архитектурой. Как таковой процедуры обновления не предусмотрено. При выходе новой версии Open Server Panel необходимо заново выполнить все настройки, скопировать папки ваших сайтов и выполнить перенос баз данных.

Не распаковывайте файлы дистрибутива поверх существующей версии, а так же не пытайтесь скопировать файлы конфигурации и профилей из старой версии программы в новую!

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

Подключение

По умолчанию все дополнительные модули выключены. Перед началом работы с Open Server Panel убедитесь в том, что вы включили нужные вам модули в настройках программы.

Ниже представлены установленные в Open Server Panel начальные настройки (значения по умолчанию) для подключения к различным модулям. Вы всегда можете самостоятельно изменить эти настройки по своему усмотрению.

Подключение к MySQL

  • Адрес: домен вашего сайта*
  • Порт: 3306
  • Пользователь: mysql
  • Пароль: (пусто)

ROOT подключение к MySQL

  • Пользователь: root
  • Пароль: (пусто)

Информация

Кодировка, установленная по умолчанию в настройках MySQL сервера, не действует на пользователя ROOT. Кодировку нужно будет явно указывать в скриптах подключения к БД, потому использовать пользователя ROOT не рекомендуется.

Предупреждение

В целях безопасности доступ с удалённых хостов (%) по умолчанию отключён и возможен только с локальной машины 127.0.0.1 (localhost). Выполните настройку удалённого доступа до того, как вы запустите Open Server на публичном IP (если планируете).

Подключение к PostgreSQL

  • Адрес: домен вашего сайта*
  • Порт: 5432
  • Пользователь: postgres
  • Пароль: postgres

Подключение к MongoDB

  • Адрес: домен вашего сайта*
  • Порт: 27017
  • Пользователь: (пусто)
  • Пароль: (пусто)

Подключение к Memcached

  • Адрес: домен вашего сайта*
  • Порт: 11211

Макс. размер памяти используемой сервером Memcache по умолчанию равен 64 Мб. Данный параметр можно изменить выполнив [Меню → Настройки → Разное].

Подключение к Redis

  • Адрес: домен вашего сайта*
  • Порт: 6379

Подключение к DNS

  • Адрес: домен вашего сайта*
  • Порт: 53

Подключение к FTP

  • Адрес: домен вашего сайта*
  • Порт: 21 (990 для FTPS)
  • Пользователь: ftp
  • Пароль: ftp

Внимание!

Модуль FTP-сервера экспериментальный. Он имеет известные уязвимости и проблемы с быстродействием. Используйте его только в целях локальной разработки. Не активируйте модуль в условиях, когда доступ к серверу открыт во внешнюю сеть!

Домен localhost

Если вы хотите использовать привычный адрес localhost для подключения к MySQL, PostgreSQL, FTP или Memcache серверу, то достаточно не удалять стандартный домен localhost или создать одноимённый алиас.

Автоматизация подключения

При работе с локальными копиями действующих веб-проектов часто возникают трудности с постоянным редактированием файлов конфигурации, в основном это касается настроек подключения к базе данных. Чтобы этого избежать рекомендуется:

  1. Локально создать пользователя базы данных с теми же именем, паролем и привилегиями, что используются на удалённом сервере.
  2. Создать алиас с тем же именем, что используется в качестве хоста базы данных на удалённом сервере.

---
* Например, если ваш скрипт размещен по адресу testserver.loc/mysql.php, то хостом (адресом) для подключения к MySQL, Redis и другим модулям будет домен: testserver.loc

Домены и алиасы

Режимы управления доменами

В Open Server Panel существует три режима управления списком доменов: автопоиск, ручное управление и ручное+автопоиск. По умолчанию используется первый режим автоматического подключения папок из корневой директории указанной в настройках.

Как работает автопоиск

Программа сканирует заданную веб-директорию на наличие папок с доменами, после чего в каждой найденной папке производится поиск подпапок (корневой папки домена) которые указаны в настройках для автосканирования. Если ни одна из предполагаемых корневых подпапок не найдена, то корнем домена становится сама папка с доменом.

Как работает совмещённое управление (ручное + автопоиск)

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

Создание домена в автоматическом режиме

Чтобы создать домен или поддомен откройте [Меню → Папка с сайтами] и создайте папку с именем будущего домена. После создания домена перезапустите сервер.

Создание домена в ручном режиме

Чтобы создать домен или поддомен перейдите в раздел [Меню → Настройки → Домены] и создайте запись вида: домен => папка. В качестве папки домена можно выбрать уже существующую папку на диске или создать её непосредственно в окне выбора каталога. После создания домена сохраните настройки.

Создание кириллического домена

Open Server Panel поддерживает кириллические домены, однако будьте внимательны, папку с доменом нужно называть его реальным именем, а не псевдо названием на кириллице. Для пиво.рф реальным названием (punycode формат) будет xn--b1altb.xn--p1ai и создав такой домен вы получите доступ к http://пиво.рф. Для конвертации доменных имён в punycode формат и обратно используйте [Меню → Дополнительно → IDN конвертер].

Создание поддомена

Процесс создания поддомена аналогичен процедуре создания обычного домена. При создании только поддомена доступность основного домена существующего в сети Интернет не теряется, т.е. вы сможете работать с локальным поддоменом имея при этом доступ к рабочему домену в сети Интернет.

Создание алиаса

Чтобы создать алиас перейдите в раздел [Меню → Настройки → Алиасы] и создайте запись вида: исходный домен => конечный домен. После создания алиаса сохраните настройки.

Обратите внимание - создание алиаса вида *.xxx.xx не имеет смысла в Windows и не означает то, что вам станут доступны любые поддомены вида test.xxx.xx, mail.xxx.xx и т.д. Необходимо создать конкретный алиас или домен чтобы он стал доступен, это особенность операционной системы Windows.

Иконка сайта в меню доменов

При наличии корректного файла favicon.ico в корневой папке домена иконка сайта будет отображаться в меню программы.

Ограниченный режим работы

В некоторых случаях управление доменами и алиасами недоступно (см. Ограниченный режим).

Работа с MySQL

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

Создание пользователя MySQL

  1. Откройте [Меню → Дополнительно → PHPMyAdmin]
  2. Введите имя пользователя root (без пароля)
  3. В PHPMyAdmin откройте раздел [Привилегии]
  4. Нажмите ссылку [Добавить нового пользователя]
  5. Заполните форму и нажмите кнопку [Создать пользователя]

Информация

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

Информация

Для входа в Adminer используйте логин и пароль пользователя БД. Если ваш пользователь БД не имеет пароля, то для авторизации в Adminer необходимо использовать пароль заданный в плагине авторизации самого Adminer, по умолчанию это admin.

Пароль указывается в файле index.php находящимся в modules\system\html\openserver\adminer

Рекомендуется сменить этот пароль перед началом использования программы.

Создание базы данных MySQL

  1. Откройте [Меню → Дополнительно → PHPMyAdmin]
  2. Введите имя пользователя root (без пароля)
  3. В PHPMyAdmin откройте раздел [Базы данных]
  4. Введите название новой базы данных и выберите её кодировку
  5. Нажмите кнопку [Создать]

Переключение модулей баз данных

Будьте внимательны при смене активного модуля базы данных. Каждый модуль имеет свое отдельное хранилище баз и настроек, они никак не связаны друг с другом, поэтому вы не увидите созданные вами базы данных при переключении на другой модуль.

Предупреждение

Во время установки Open Server Panel выполняется настройка Windows, во время которой IPv4 трафик получает приоритет над IPv6 при разрешении доменных имён. Если не выполнять данную процедуру, то процесс подключения в MySQL серверу может выполняться очень долго (более 1 сек).

Чтобы проверить корректность настройки приоритетов откройте консоль и введите ping localhost. Если в ответе вы получаете адрес ::1 вместо 127.0.0.1, значит приоритеты настроены неверно.

Переменная Path

Для добавления собственных путей в переменную окружения PATH можно использовать файл ./userdata/config/path.txt

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

C:\Windows
D:\My Programs
%realprogdir%\data\dll
C:\Windows\System32

Информация

По умолчанию файл path.txt не подключается. См. [Меню → Настройки → Сервер].

Использование переменных в качестве подстановок

Переменная Описание переменной
%realprogdir% Реальный путь до папки с Open Server Panel (обратный слеш "\")
%progdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (обратный слеш "\")
%sprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (слеш "/")
%dprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной обратный слеш "\\")
%dsprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной слеш "//")
%realsitedir% Реальный путь до корневой папки доменов (обратный слеш "\")
%sitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (обратный слеш "\")
%ssitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (слеш "/")
%httpport% Порт HTTP сервера
%httpsport% Порт HTTPS сервера
%postgresqlport% Порт PostgreSQL сервера
%mysqlport% Порт MySQL сервера
%mongodbport% Порт MongoDB сервера
%memcacheport% Порт Memcache сервера
%ftpport% Порт FTP сервера
%httpdriver% Название модуля HTTP
%phpdriver% Название модуля PHP
%mysql_driver% Название модуля MySQL/MariaDB
%pg_driver% Название модуля PostgreSQL
%mongo_driver% Название модуля MongoDB
%memcachedriver% Название модуля Memchached
%redisdriver% Название модуля Redis
%dnsdriver% Название модуля DNS
%ip% IP адрес сервера
%disk% Буква диска из генерируемого пути до папки с Open Server Panel с учетом виртуального диска (только буква)
%osdisk% Буква диска из реального пути до папки с Open Server Panel (только буква)
%sysdisk% Системный диск Windows (только буква)

Настройка DNS

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

Для использования встроенного DNS сервера необходимо выполнить настройку сетевого интерфейса на каждом компьютере ДО запуска самого сервера. Выполнить настройку необходимо как на локальной машине, так и на других компьютерах в локальной сети, которые хотят получить доступ к вашим доменам. Без указания локального DNS сервера в настройках сетевого подключения запуск сервера будет невозможен (если модуль DNS активирован в настройках Open Server Panel).

По умолчанию параметр TTL установлен в значение 60 (секунд), вы можете изменить это значение в файле ./userdata/init.ini однако следует иметь ввиду, что бездумное изменения TTL может спровоцировать кэширование неактуальных записей другими компьютерами в вашей сети. Изменяйте этот параметр только в том случае, если вы действительно понимаете его предназначение.

Предупреждение

Перед началом использования DNS-модуля убедитесь в том, что у вас отсутствуют домены без точки в своём названии. Если таковые имеются, то переименуйте их добавив .virtual или .loc к имени домена.

Внимание!

Если ваш браузер производит разрешение доменных имён через прокси-сервер или использует функцию DNS over HTTPS от стороннего DNS-провайдера (например Google или CloudFlare), то локальные домены, созданные вами в Open Server, не будут доступны в этом браузере.

Рекомендации по настройке

  1. В качестве IP адреса сервера выберите в настройках Open Server Panel IP адрес вашего компьютера в локальной сети или сети Интернет (не выбирайте параметр Все доступные IP).
  2. Откройте свойства нужного сетевого подключения:

    Центр управления сетями → Подключение xxx → Свойства → Протокол Интернета версии 4 → Свойства → Общие → Использовать следующие адреса DNS-серверов.

    Пропишите следующие адреса NS серверов:

    xxx.xxx.xxx.xxx
    8.8.8.8 (или любой другой реальный резервный DNS)

    Вместо xxx.xxx.xxx.xxx впишите IP адрес вашего компьютера в локальной сети или сети Интернет.
     

  3. Повторите процедуру настройки на других компьютерах в локальной сети.
  4. Не выполняйте настройку алиасов из инструкции раздела Внешний доступ данного руководства. Подобная настройка не требуется, поскольку удалённые компьютеры будут напрямую работать с вашим DNS сервером и получат доступ ко всем доменам.
  5. Сохраните настройки и выполните запуск сервера Open Server Panel.

После правильной настройки все компьютеры в вашей локальной сети смогут получить доступ к доменам Open Server Panel.

Совпадение имён локальных и реальных доменов

Если включён DNS-модуль, то при каждом запуске сервера и при каждой его остановке Open Server Panel выполняет очистку DNS-кэша Windows

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

Так же вы можете просто иметь второй браузер, который настроен на использование стороннего DNS-провайдера (например Google или CloudFlare) и потому он будет видеть только реальный домен независимо от того, запущен локальный сервер или нет.

Планировщик заданий

Использование планировщика заданий (Сron)

Значения времени вводятся в виде цифр, комбинации цифр или *.

Вы можете задать моменты времени, используя запятые как разделители:

Например: 1,2,3
Результат: задание выполняется 3 раза, в 1-ю,2-ю и 3-ю минуты часа.

Вы можете указать диапазон, используя дефис:

Например: 5-7
Результат: задание выполняется 3 раза, в 5-ю,6-ю и 7-ю минуты часа.

Вы можете задать периодичность выполнения используя звездочку (*) и слэш (/):

Например: */2
Результат: задание выполняется каждые 2 минуты.

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

Например: 1,5,11-15,30-59/2
Результат: задание выполняется в 1,5, с 11 по 15 и каждые 2 минуты с 30 по 59.

Вышеприведённая схема указания времени актуальная для всех временных периодов (минута, час, число, месяц, день недели). Для запроса URL в планировщике нужно использовать вспомогательную утилиту Wget (см. примеры). В строке команд можно использовать подстановки.

Использование переменных в качестве подстановок

Переменная Описание переменной
%realprogdir% Реальный путь до папки с Open Server Panel (обратный слеш "\")
%progdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (обратный слеш "\")
%sprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (слеш "/")
%dprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной обратный слеш "\\")
%dsprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной слеш "//")
%realsitedir% Реальный путь до корневой папки доменов (обратный слеш "\")
%sitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (обратный слеш "\")
%ssitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (слеш "/")
%httpport% Порт HTTP сервера
%httpsport% Порт HTTPS сервера
%postgresqlport% Порт PostgreSQL сервера
%mysqlport% Порт MySQL сервера
%mongodbport% Порт MongoDB сервера
%memcacheport% Порт Memcache сервера
%ftpport% Порт FTP сервера
%httpdriver% Название модуля HTTP
%phpdriver% Название модуля PHP
%mysql_driver% Название модуля MySQL / MariaDB
%pg_driver% Название модуля PostgreSQL
%mongo_driver% Название модуля MongoDB
%memcachedriver% Название модуля Memchache
%redisdriver% Название модуля Redis
%dnsdriver% Название модуля DNS
%ip% IP адрес сервера
%disk% Буква диска из генерируемого пути до папки с Open Server Panel с учетом виртуального диска (только буква)
%osdisk% Буква диска из реального пути до папки с Open Server Panel (только буква)
%sysdisk% Системный диск Windows (только буква)

Примеры заданий планировщика

Запрос по протоколу HTTP каждые 30 минут:

*/30 * * * *
"%progdir%\modules\wget\bin\wget.exe" -q --no-cache http://xxx.ru/cron.php -O nul

Запрос по протоколу HTTPS каждый час в 10 минут, в 20 минут и в 40 минут:

10,20,40 * * * *
"%progdir%\modules\wget\bin\wget.exe" --secure-protocol=TLSv1_2 --no-check-certificate -q --no-cache https://xxx.ru/cron.php -O nul

Выполнение файла cron.php интерпретатором PHP ежеминутно:

*/1 * * * *
"%progdir%\modules\php\%phpdriver%\php-win.exe" -c "%progdir%\modules\php\%phpdriver%\php.ini" -q -f "%sitedir%\xxx.ru\cron.php"

Информация

Конструкция -O nul в аналогична -O /dev/null в Linux и используется в примере для того, чтобы ответ, полученный wget от сервера, не сохранялся на диске.

Исполняемый файл php-win.exe используется вместо обычной CLI-версии PHP потому, что он ничего не выводит и, соответственно, не открывает консоль (окошко dos не появляется на экране).

Предупреждение

При составлении заданий для планировщика заключайте любые указания путей файловой системы в кавычки. В противном случае задание не сможет выполняться при наличии пробела(ов) в пути к исполняемому файлу или в его аргументах (при указании папок и файлов).

Предопределенные переменные планировщика

Переменная Описание переменной
%hh% Текущий час (00-23)
%mm% Текущая минута (00-59)
%ss% Текущая секунда (00-59)
%MM% Текущий месяц (01-12)
%MMM% Текущий месяц (Янв-Дек)
%DD% Текущий день (01-31)
%WW% Текущий день недели (Пн-Вс)
%WD% Текущий день недели (1-7, 1-понедельник, 7-воскресенье)
%YYYY% Текущий год (4 цифры)
%YY% Текущий год (последние 2 цифры)
%QUOTE% Знак кавычек
%PERCENT% Знак процента

В таблице показаны не все переменные. Полный список смотрите здесь.

При составлении заданий вы можете использовать как переменные для подстановки значений из Open Server Panel, так и предопределённые переменные самого планировщика. Кроме того, в качестве переменных планировщика можно использовать любые переменные среды окружения (environment variables), например %COMSPEC%.

Примеры заданий c использованием переменных

Очистка папки c:\temp\:

%COMSPEC% /c del /S /Q c:\temp\*

Задание будет развёрнуто планировщиком так:

C:\Windows\system32\cmd.exe /c del /S /Q c:\temp\*

А теперь пример создания резервной копии баз данных:

"%realprogdir%\modules\database\%mysql_driver%\bin\mysqldump.exe" -A --add-drop-database -E -i -Q -R --opt --user=root --password=root --result-file="%realprogdir%\%DD%_%MM%_%YYYY%_%hh%_%mm%_dump.sql"

Задание будет развёрнуто планировщиком так:

"C:\OSPanel\modules\database\MariaDB-10.3\bin\mysqldump.exe" -A --add-drop-database -E -i -Q -R --opt --user=root --password=root --result-file="C:\OSPanel\09_01_2020_14_25_dump.sql"

Информация

Следует принимать во внимание тот факт, что выполнение заданий происходит без переключения в рабочую папку той программы или скрипта, которые указаны в задании. Некоторые программы и PHP скрипты могут работать неправильно, если определение корневой папки реализовано в них некорректно.

Меню закладок

Для быстрого доступа к нужным страницам на сайтах и рабочим папкам, для запуска и выполнения любых программ и команд в Open Server Panel существует возможность создавать закладки.

Виды закладок

  • Ссылка
  • Папка
  • Программа (возможен запуск с параметрами)
  • Команда в формате командной строки Windows

Использование переменных в качестве подстановок

Переменная Описание переменной
%realprogdir% Реальный путь до папки с Open Server Panel (обратный слеш "\")
%progdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (обратный слеш "\")
%sprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (слеш "/")
%dprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной обратный слеш "\\")
%dsprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной слеш "//")
%realsitedir% Реальный путь до корневой папки доменов (обратный слеш "\")
%sitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (обратный слеш "\")
%ssitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (слеш "/")
%httpport% Порт HTTP сервера
%httpsport% Порт HTTPS сервера
%postgresqlport% Порт PostgreSQL сервера
%mysqlport% Порт MySQL сервера
%mongodbport% Порт MongoDB сервера
%memcacheport% Порт Memcache сервера
%ftpport% Порт FTP сервера
%httpdriver% Название модуля HTTP
%phpdriver% Название модуля PHP
%mysql_driver% Название модуля MySQL / MariaDB
%pg_driver% Название модуля PostgreSQL
%mongo_driver% Название модуля MongoDB
%memcachedriver% Название модуля Memchache
%redisdriver% Название модуля Redis
%dnsdriver% Название модуля DNS
%ip% IP адрес сервера
%disk% Буква диска из генерируемого пути до папки с Open Server Panel с учетом виртуального диска (только буква)
%osdisk% Буква диска из реального пути до папки с Open Server Panel (только буква)
%sysdisk% Системный диск Windows (только буква)

Предупреждение

При создании закладок на запуск программ с параметрами разделителем пути до программы и параметрами запуска является знак #, иначе закладка будет выполнена через командную строку как обычная команда!

Примеры создания закладки на запуск программы с параметрами:

%realprogdir%\modules\heidisql\heidisql.exe#-h=127.0.0.1 -u=root -p=root -P=%mysqlport%

Меню программ

Добавление портативной программы

В Open Server Panel существует возможность добавить в меню свою портативную программу. Для этого необходимо выполнить следующие действия:

  1. Откройте папку ./progs/ в каталоге с Open Server Panel или создайте такую папку если её не существует;
  2. Создайте в папке ./progs/ подпапку с именем категории программ, например ./progs/Офисные программы, или используйте имя Default (программы из подпапки Default отображаются в корне меню, без категории);
  3. Скопируйте каталог с вашей портативной программой (например CintaNotes) в созданную вами папку ./progs/Офисные программы, в итоге у вас должен получиться такой путь: ./progs/Офисные программы/CintaNotes;
  4. Создайте в папке с портативной программой файл osinit.txt содержащий единственную строку с текстом, которая будет использована в меню Open Server Panel вместо отображения оригинального названия EXE файла программы;
  5. Перезапустите управляющую программу Open Server Panel;

Предупреждение

Имя портативной программы (без расширения) и имя папки, в которой она находится, должны быть идентичны! Например, если главный файл портативной программы называется CintaNotes.exe, то путь к нему должен выглядеть так: ./progs/Офисные программы/CintaNotes/CintaNotes.exe

Добавление категории программ

Чтобы добавить собственную категорию в меню программ следует создать одноимённую папку в директории ./progs/. Программы добавленные в папку Default отображаются в корне меню программ, без категории.

Добавление ярлыка программы

Помимо портативного софта в меню программ можно добавить ярлыки на локально установленные программы. Такой указатель на программу будет отображаться в меню вместе с другими программами и будет работать как самый обычный ярлычок. Чтобы добавить ярлык на локально установленную программу просто скопируйте его в папку ./progs/нужная_вам_категория_программ/ или ./progs/Default/.

Информация

Не пытайтесь cкопировать в папку портативных программ ярлыки на папки, сайты и другие объекты не являющиеся программами. Такие ярлыки не будут отображаться в меню и соответственно не будут работать. Для создания ярлыков к сайтам, папкам и т.д. используйте [Меню → Настройки → Закладки] (см. Меню закладок).

Старт/стоп скрипты

Дополнение сценариев запуска и остановки сервера

В Open Server Panel существует возможность дополнять сценарии запуска и остановки сервера своими .bat файлами (батниками).

Чтобы дополнить какой-либо сценарий необходимо создать файл-шаблон .tpl.bat в папке ./userdata/ с определённым именем (см. список ниже). Вы можете записать в такой файл произвольные последовательности команд, предназначенных для исполнения командным интерпретатором Windows.

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

Перед запуском

Используйте шаблон с именем /userdata/pre_start.tpl.bat для указания команд выполняемых ДО запуска всех модулей.

После запуска

Используйте шаблон с именем /userdata/start.tpl.bat для указания команд выполняемых ПОСЛЕ запуска всех модулей, но до того, как флаг состояния (в области уведомлений Windows) станет зеленым.

Перед остановкой

Используйте шаблон с именем /userdata/stop.tpl.bat для указания команд выполняемых ДО остановки модулей.

После остановки

Используйте шаблон с именем /userdata/post_stop.tpl.bat для указания команд выполняемых ПОСЛЕ остановки модулей, но до того, как флаг состояния (в области уведомлений Windows) станет красным.

Предупреждение

После начала процедуры завершения работы Windows запуск любых новых процессов невозможен, поэтому СТОП-скрипты (stop.bat и post_stop.bat) не выполняются. Если вам требуется обязательное выполнение скриптов остановки, то необходимо выключать Open Server Panel вручную непосредственно перед тем, как вы хотите выключить компьютер.

Внимание!

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

Использование переменных в качестве подстановок

В файлах-шаблонах с расширением .tpl.bat можно использовать подстановки. Доступные варианты подстановки программных переменных:

Переменная Описание переменной
%realprogdir% Реальный путь до папки с Open Server Panel (обратный слеш "\")
%progdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (обратный слеш "\")
%sprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (слеш "/")
%dprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной обратный слеш "\\")
%dsprogdir% Генерируемый путь до папки с Open Server Panel с учетом виртуального диска (двойной слеш "//")
%realsitedir% Реальный путь до корневой папки доменов (обратный слеш "\")
%sitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (обратный слеш "\")
%ssitedir% Генерируемый путь до корневой папки доменов с учетом виртуального диска (слеш "/")
%httpport% Порт HTTP сервера
%httpsport% Порт HTTPS сервера
%postgresqlport% Порт PostgreSQL сервера
%mysqlport% Порт MySQL сервера
%mongodbport% Порт MongoDB сервера
%memcacheport% Порт Memcache сервера
%ftpport% Порт FTP сервера
%httpdriver% Название модуля HTTP
%phpdriver% Название модуля PHP
%mysql_driver% Название модуля MySQL / MariaDB
%pg_driver% Название модуля PostgreSQL
%mongo_driver% Название модуля MongoDB
%memcachedriver% Название модуля Memchache
%redisdriver% Название модуля Redis
%dnsdriver% Название модуля DNS
%ip% IP адрес сервера
%disk% Буква диска из генерируемого пути до папки с Open Server Panel с учетом виртуального диска (только буква)
%osdisk% Буква диска из реального пути до папки с Open Server Panel (только буква)
%sysdisk% Системный диск Windows (только буква)

Кроме написания команд перечисленные выше переменные можно использовать для указания реальных переменных окружения, например:

setx DIR_PHP "%realprogdir%\modules\php\%phpdriver%"

Ограниченный режим

При недоступном на запись HOSTS файле программа переходит в ограниченный режим работы с урезанной функциональностью.

В ограниченном режиме вам будет недоступна следующая функциональность:

  • Использование своих алиасов и доменов (кроме домена localhost);
  • Указание IP адреса сервера (кроме адресов 127.0.0.1 и *);

Таким образом в ограниченном режиме вам будет доступен один из двух IP адресов: 127.0.0.1 или *, и только один домен localhost. Другие созданные вами алиасы и домены не будут обработаны программой.

Работать в ограниченном режиме уместно только при полном отсутствии прав администратора, например в условиях организации. В любом другом случае крайне рекомендуется правильно настроить права доступа к HOST файлу для возможности полноценной работы с разными доменами. Разрешить запись в HOSTS файл для всех пользователей можно выполнив через консоль (запускать от имени Администратора) следующую команду:

attrib -s -r -h -a C:\Windows\system32\drivers\etc\hosts

Если в логах запуска вы видите сообщение о том, что Hosts файл недоступен для записи, то возможно что доступ к этому файлу блокируется антивирусом/файрволом, либо действуют ограничения прав доступа Windows.

Добавьте Open Server Panel, а так же все остальные компоненты, о которых будет спрашивать антивирус/файрвол, в доверенные программы. Отключите защиту HOSTS файла (или системных файлов) в настройках вашего антивируса/файрвола, если такая защита присутствует. Попробуйте вручную удалить файл C:\Windows\System32\Drivers\etc\hosts и заново создать со следующим содержимым:

127.0.0.1 localhost

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

Предупреждение

При включённой службе контроля учётных записей пользователей (UAC) и запуске без прав администратора Open Server Panel не будет иметь доступа к HOSTS файлу и автоматически перейдёт в ограниченный режим работы.

Запуск без внесения записей в HOSTS файл

В Open Server Panel реализована возможность полноценного запуска без внесения записей в HOSTS файл. Эта возможность будет полезна пользователям офисных сетей и терминалов, где доступ к HOSTS файлу имеет только старший администратор. Если опция [Не вносить изменения в HOSTS файл] включена, то запуск сервера происходит без редактирования HOSTS файла будто все домены в нём уже прописаны, т.е. доступ к этому файлу не требуется вовсе.

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

Формат внесения записей в HOSTS файл стандартный - ip пробел домен, например:

192.168.5.10  rhino.acme.com
192.168.5.10  x.acme.com

Отправка почты через SMTP

Яндекс почта

Ниже показаны типичные настройки для отправки почты через SMTP сервер выбранного почтового провайдера.

Mail.ru почта

Ниже показаны типичные настройки для отправки почты через SMTP сервер выбранного почтового провайдера.

Gmail почта

Ниже показаны типичные настройки для отправки почты через SMTP сервер выбранного почтового провайдера.

По умолчанию Gmail не даёт возможности использовать SMTP, поэтому доступ нужно активировать отдельно. Вам необходимо выполнить следующие шаги по активации:

1. Авторизуйтесь в своём аккаунте Gmail
2. В той же вкладке браузера перейдите сюда
3. Активируйте доступ к аккаунту для "непроверенных приложений" (см. картинку ниже)
4. Выполните тестовую отправку письма через ваш скрипт на сервере Open Server Panel
5. Обновите страницу (F5) и снова активируйте доступ к аккаунту для "непроверенных приложений" если он не активировался (пришедшее письмо о попытке доступа к аккаунту можно проигнорировать)

Теперь попробуйте отправить письмо еще раз, на этот раз отправка должна заработать.

Информация

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

Внешний доступ

Работа с внешними сетями

Open Server Panel может работать в локальных сетях и сети Интернет как веб-сервер. Для работы в сети Интернет необходим статический(белый) IP адрес. Чтобы открыть доступ к серверу извне необходимо указать * в качестве IP адреса в настройках Open Server Panel, в этом случае доступ откроется сразу для всех сетей, к которым подключён ваш компьютер. Если вы хотите открыть доступ только для одной конкретной сети (например локальной), то укажите в настройках программы IP адрес выданный вашему компьютеру в этой сети.

Информация

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

Доступ извне к локальными доменам

После того, как вы настроите удалённый доступ к своему серверу, все локальные домены станут доступны удалённо. Но как их открыть? Чтобы открыть нужный сайт с удалённой машины потребуется внести в HOSTS файл такого компьютера запись с адресом вашего локального домена, например: 64.55.96.24 supersite (где 64.55.96.24 это адрес вашего компьютера, а supersite это имя локального домена). После внесения такой записи в HOSTS файл на удалённом компьютере домен supersite будет доступен при обычном наборе в строке браузера.

Обратите внимание - при простом наборе IP адреса вашего компьютера http://64.55.96.24/ или при попытке доступа к несуществующему локальному домену будет открываться пустая страница.

Для того, чтобы при наборе IP адреса вашего компьютера открывался определённый локальный сайт, необходимо создать алиас вида ваш_внешний_ip => ваш_локальный_домен. После этих действий указанный вами локальный домен, для которого вы создали алиас, станет доступен через локальную сеть или сеть Интернет по адресу http://ваш_внешний_ip/ (например http://64.55.96.24/). Если ваш компьютер подключен к нескольким сетям и в настройках сервера установлен IP=*, то такой алиас необходимо создать для каждого IP адреса выданного вашему компьютеру в каждой из сетей.

Внимание!

При работе с внешними сетями нет никакой гарантии безопасности вашего компьютера. Сервер часто запускается с правами Администратора, а значит, скрипты, запущенные под его управлением, могут делать на компьютере всё, что угодно. Дыры в безопасности скриптов могут открыть хакерам и вирусам доступ к вашему компьютеру.

Мы не рекомендуем такое использование Open Server Panel! Перед настройкой удалённого доступа к серверу обязательно ознакомьтесь с разделом Защита сервера данного справочного руководства.

Внешнее управление

Open Server Panel может принимать некоторые команды через сеть Интернет, для этого имеется встроенная панель управления которая работает на выделенном порту. Так же программой можно управлять через командную строку.

Управление через Интернет

Чтобы получить доступ к панели управления необходимо набрать адрес http://localhost:1515/ (по умолчанию). Порт, логин и пароль к контрольной панели можно указать непосредственно в настройках Open Server Panel [Меню → Настройки → Разное].

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

Команды для использования в командной строке

"C:\openserver\Open Server Panel.exe"              # запуск программы
"C:\openserver\Open Server Panel.exe" /start       # запуск сервера
"C:\openserver\Open Server Panel.exe" /restart     # перезапуск сервера
"C:\openserver\Open Server Panel.exe" /stop        # остановка сервера
"C:\openserver\Open Server Panel.exe" /exit        # выход из программы

Защита сервера

Настройка защиты

Cервер становится крайне уязвимым, когда он открыт для доступа из сети Интернет, особенно с настройками установленными по умолчанию. Множество ботов и вирусов постоянно сканируют ip адреса в сети Интернет на предмет открытых портов и, как правило, незащищенный сервер оказывается взломанным уже через несколько часов после появления в сети.

Несколько шагов по защите веб-сервера от несанкционированного доступа:

  1. Отключите FTP сервер [Меню → Настройки → FTP сервер];
  2. Установите собственные пароли для root (и других) пользователей всех модулей СУБД;
  3. Включите защиту от внешнего доступа в настройках программы [Меню → Настройки → Сервер];
  4. Теперь перезапустите саму управляющую программу (не сервер);
  5. Выполните настройку файрвола закрыв на доступ извне все порты кроме тех, которые планируется использовать (например: 80,443,21,990,53);

Предупреждение

Не допускайте использования уязвимых скриптов, некорректной конфигурации модулей, простых паролей.

Встроенная защита от внешнего доступа

Выбор опции [Меню → Настройки → Сервер → Защитить сервер от внешнего доступа] отключит часть опасных функций PHP, доступ к веб-инструментам извне будет заблокирован, а доступ к диску для PHP скриптов будет ограничен корневой папкой доменов. Данная опция снижает производительность php-скриптов в 2-10 раз (зависит от интенсивности работы с файловой системой)!

Работа с Composer

Composer совместим со всеми версиями PHP начиная с 5.3 и в Open Server Panel он доступен во всех совместимых модулях "из коробки".

Установка пакетов Composer

  1. Выполните [Меню → Дополнительно → Консоль];
  2. Перейдите в папку с тем сайтом, куда планируется установка;
  3. Выполните установку любого нужного вам пакета, например:
# Переход в папку с проектом
cd C:\openserver\domains\localhost

# Установка Symfony
composer create-project symfony/framework-standard-edition symfony

# Установка PHPUnit
composer create-project phpunit/phpunit phpunit & echo @php -d output_buffering=0 phpunit\phpunit %*>phpunit.bat

# Установка Laravel
composer create-project laravel/laravel laravel --prefer-dist

# Установка phpDocumentor
composer create-project phpdocumentor/phpdocumentor phpdocumentor

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

cd C:\openserver\domains\localhost\phpunit & composer update

Работа в консоли

Для запуска встроенной консоли необходимо запустить сервер и выполнить [Меню → Дополнительно → Консоль]. Среда окружения (англ. Environment) формируется в момент запуска сервера и передаётся всем запускаемым модулям. Любые другие программы, будь то консоль или IDE, так же могут получить правильное окружение, достаточно запускать эти программы из меню Open Server Panel. Для этого можно либо сделать закладку, либо добавить ярлык в меню программ (см. разделы Меню закладок и Меню программ).

Необходимо знать, что если вы запускаете консоль или любую другую программу из стандартного меню Пуск или используя ярлык на рабочем столе Windows, а не из меню Open Server Panel, то они не смогут работать с виртуальным окружением сформированным в Open Server Panel.

Встроенную консоль можно запустить даже если сервер выключен, в Full версии выполните [Меню → Программы → Консоль]. Однако при выключенном сервере среда окружения не сформирована и поэтому работать из консоли с PHP и другими модулями или программами (wget, composer, скриптами и т.д.) будет невозможно.

Внимание!

Если вы запустили консоль ДО запуска сервера, то среда окружения НЕ станет доступна в консоли.

Чтобы начать полноценную работу с модулями после запуска сервера нужно закрыть и заново открыть встроенную консоль (саму программу ConEmu, а не только вкладку), поскольку только при запущенном сервере консоль получает правильно сформированное окружение в момент запуска из меню.

Точно так же среда окружения не будет обновлена в консоли если вы переключились на другой модуль PHP или MySQL и перезапустили сервер, но при этом не перезапустили консоль!

Внимание!

При запуске стороннего ПО (консоли, программы, IDE, скрипты и проч.) строго придерживайтесь правила: сначала запустить сервер - потом программу.

Если вы изменили настройки Open Server Panel или конфиги модулей: выключить программу - потом запустиь её заново.

Не пытайтесь запускать софт в обход меню Open Server, т.к. в этом случае рабочее окружение не будет доступно в вашей программе.

Вопросы и ответы

Ничего не запускается?

Не стоит отчаиваться, загляните в общий лог программы и другие логи компонентов [Меню → Просмотр логов]. В подавляющем большинстве случаев там вы найдете причину неудачного старта. В более сложных случаях включите опцию [Запускать сервер в отладочном режиме], это позволит увидеть отладочную информацию при запуске. Так же добавьте Open Server Panel в доверенные программы вашего файрвола или антивируса, если таковой имеется.

Пишет что порт 80, 3306 и т.д. уже занят!

Включите в настройках Open Server Panel опцию [Запускать сервер в агрессивном режиме], в этом режиме все программы занимающие нужные порты будут принудительно закрыты. Добавьте Open Server Panel в доверенные программы вашего антивируса/файрвола/прокси-сервера или отключите слежение за портами 80/443/21/90xx/3306 если оно есть. В отдельных антивирусах/файрволах возможны свои доп. настройки связанные с перехватом подключений программ к сети.

Пишет что нет прав доступа для работы в этой папке!

Вы пытаетесь запустить Open Server Panel из папки, которая принадлежит другому пользователю, или же файлы Open Server Panel были записаны на компьютер другим пользователем. Если Open Server Panel будет запускаться пользователем Pavel (например), то войдите в систему под учётной записью Pavel и скопируйте Open Server Panel в такую папку, которая принадлежит пользователю Pavel (имеются права на запись), после чего запуск сервера для этого пользователя станет возможным. Вместо копирования можно установить особые права доступа к папке с Open Server Panel, обратитесь к администратору вашего компьютера.

Почему кнопки серые и не нажимаются?!

В любой момент времени активны только те кнопки и разделы меню, которые могут выполнить возложенное на них действие. Например: если сервер не запущен, то пункт меню PHPMyAdmin будет неактивен; если сервер запущен, то кнопки очистки логов будут недоступны и т.д.

Я не могу открыть меню когда флаг желтого цвета!

Желтый флажок говорит о том, что происходит выполнение команды (например запуск, остановка или сохранение настроек). Во время выполнения команд меню программы недоступно.

Создал 3000 доменов и теперь сервер не запускается!

Увеличьте кол-во проверок состояния сервера до 20-30 или выше в настройках программы [Меню → Настройки → Разное]. Переключитесь на использование HTTP модуля Apache если вы используете модуль Nginx.

Хочу протестировать сайт с учётом разных скоростей интернета (мобильные устройства к примеру)!

В Open Server Panel существует возможность ограничения скорости передачи данных для симуляции медленной загрузки сайта. Для ограничения скорости воспользуйтесь меню Open Server Panel: [Меню → Настройки → Разное]. Скорость можно ограничить в пределах 1-40 КБайт в секунду, установка значения в 0 или более 40 отменяет ограничение. Скоростной лимит устанавливается на каждый запрос, поэтому, если клиент одновременно откроет 4 картинки на сайте (4 соединения), то каждая из них будет загружаться с заданной скоростью.

Где редактировать настройки модулей?

Для редактирования настроек модулей пользуйтесь меню Open Server Panel: [Меню → Дополнительно → Конфигурация].

Куда сохраняются мои письма?

По умолчанию все письма сохраняются во временную папку userdata/tmp/email/, во время остановки сервера эта папка не очищается. Можно настроить отправку писем через удалённый SMTP сервер: [Меню → Настройки → Почта].

Я нажимаю в меню программы на нужный сайт, но ничего не открывается!

Для работы многих пунктов меню требуется наличие корректно установленного и работающего браузера по умолчанию. Так же вы можете напрямую указать свой браузер в настройках программы: [Меню → Настройки → Меню].

Я создал домен local_site.loc, но он не работает!

Символа подчеркивания не может быть в имени домена, поэтому такой домен не подключается. Разрешенные символы: [a-z0-9.-].

Сервер не стартует с ip 192.168.0.1 и говорит что localhost работает только на ip 127.0.0.1!

Действительно, домен localhost можно использовать только с ip адресом 127.0.0.1, поэтому либо переименуйте этот домен, либо удалите его, если он вам не нужен.

Я хочу работать без виртуального диска!

Выберите в настройках Open Server Panel работу без виртуального диска и скопируйте папку с сервером в такую директорию, путь до которой содержит только латиницу или цифры, в противном случае работа без вирт. диска будет невозможна.

Я не вижу виртуального диска!

Если вы работаете не под учётной записью администратора, но Open Server Panel запущен с правами администратора, то виртуальный диск (если он используется) будет для вас недоступен. Open Server Panel при этом будет работать нормально. Вы можете отключить использование виртуального диска в настройках, при этом учитывайте требования к абсолютному пути описанные в предыдущем ответе.

Сервер запускается, но браузер говорит что домен не найден!

Если в вашем браузере настроена работа через прокси сервер, то локальные сайты будут ему недоступны. Чтобы исправить ситуацию откажитесь от использования прокси в вашем браузере или добавьте локальные домены и IP адрес сервера в список исключений для прокси в настройках обозревателя. В ряде случаев нужно пересоздать файл HOSTS (см. Решение проблем).

Для чего нужна настройка вывода закладок вместо сайтов?

В таком режиме созданные закладки отображаются вместо списка доменов, это будет полезно при создании демо-сборок с установленными скриптами (см. Создание сборок).

Мне трудно пересоздавать закладки, пользователей FTP и т.д, нужно их просто отредактировать!

Не нужно пересоздавать записи заново, просто сделайте двойной клик на интересующей вас записи в таблице после чего эта запись сразу же удалится из списка и будет вынесена обратно в поля редактирования. Не забудьте добавить отредактированную запись обратно в таблицу!

Подключение к базе данных длится более 1 сек!

Отключите использование протокола IPv6 используя инструкцию из раздела Решение проблем данного руководства.

Я скопировал в папку с доменом свой скрипт, после перезапуска сервер не видит файлов и показывает ошибку!

Скорее всего вы скопировали или создали такую подпапку в папке с доменом, имя которой подпадает под условия автоматического поиска корневой папки домена (см. Домены и алиасы).

Сервер постепенно занял всё место на диске!

Постепенное исчезновение свободного места говорит о том, что вы отключили автоочистку логов при запуске сервера. В результате при активном использовании сервера лог-файлы вырастают до огромных размеров и занимают всё свободное место на диске. Очистите лог-записи в окне просмотра логов и включите автоочистку логов при старте в настройках Open Server Panel. Очистите папку .\userdata\tmp от временных файлов.

Как мне создать собственную конфигурацию хоста для домена?

Используйте шаблон конфигурации виртуального хоста в папке с нужным доменом для создания особой конфигурации домена. При создании/изменении файла требуется перезапуск сервера. Шаблон конфигурации для нужного модуля можно найти в папке ./userdata/config/.

Например, если вы хотите создать собственную конфигурацию домена xxx.ru для модуля Apache-2.4.2, то скопируйте файл ./userdata/config/Apache-2.4.3_vhost.conf в папку с нужным доменом, отредактируйте этот файл под свои нужды и перезапустите сервер.

Или другой пример, при использовании модуля Apache+Nginx можно скопировать в папку домена оба файла конфигурации для каждого сервера: Apache-2.2.23+Nginx-1.2.4_vhosta.conf и Apache-2.2.23+Nginx-1.2.4_vhostn.conf.

Обратите внимание - при редактировании конфигурации хоста нельзя удалять или заменять системные переменные %...%, вы можете вносить только новые записи дополняющие конфигурацию.

Как и где редактируются конфиги компонентов?

В Open Server Panel используются файлы-шаблоны конфигурации, которые доступны через общее меню программы. Не пытайтесь редактировать временные файлы конфигов, которые создаются в момент запуска сервера, это не имеет смысла. Шаблоны конфигурации индивидуальны для каждого модуля, т.е. если вы выберите какой-либо из модулей в качестве активного, то будут активированы и шаблоны настроек именно этого модуля. Например: вы сконфигурировали шаблон файла php.ini при активном модуле PHP 5.2, после чего выбрали модуль PHP 5.3 в качестве активного. В этом случае вам необходимо еще раз сконфигурировать шаблон файла php.ini уже для модуля PHP 5.3.

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

Как указать особые настройки подключения к SMTP серверу для выбранного домена?

В Open Server Panel существует возможность отправки почты через сторонний SMTP сервер, при этом все домены используют те параметры подключения, которые были указаны пользователем в окне настроек Open Server Panel. Для того чтобы определённый домен мог использовать собственные настройки подключения к SMTP серверу нужно указать их в шаблоне конфигурации этого хоста. Откройте шаблон конфигурации виртуального хоста (как его создать описано в предыдущем ответе) в папке с нужным доменом и добавьте в описание хоста следующее содержимое (одной строкой):

php_admin_value sendmail_path "%mailway% -t --smtp-ssl=none --smtp-server=smtp.xxx.xx --smtp-port=xx --smtp-from=xxx@xxx.xx --smtp-user=xxx@xxx.xx --smtp-pass=xxxxxx --pop3-server=pop3.xxx.xx --pop3-user=xxx@xxx.xx --pop3-pass=xxxxxx"

Например:


  %limit%
  DocumentRoot "%hostdir%"
  ...
  php_admin_value sendmail_path "%mailway% -t --smtp-ssl=none --smtp-server=smtp.xxx.xx --smtp-port=xx --smtp-from=xxx@xxx.xx --smtp-user=xxx@xxx.xx --smtp-pass=xxxxxx --pop3-server=pop3.xxx.xx --pop3-user=xxx@xxx.xx --pop3-pass=xxxxxx"
  ...

Последнюю часть строки --pop3-server=pop3.xxx.xx --pop3-user=xxx@xxx.xx --pop3-pass=xxxxxx добавляйте только в том случае, если требуется авторизация POP3 перед SMTP. Возможные значения для параметра --smtp-ssl= это none,auto,ssl или tls.

Необходимо помнить, что при указании собственных настроек подключения к SMTP серверу отправка почты для выбранного домена будет работать не зависимо от основных настроек Open Server Panel. Так же обратите внимание на то, что все данные SMTP сервера включая логин и пароль будут доступны в php скриптах и видны в информации phpinfo(), поэтому в целях безопасности не рекомендуется пользоваться описанной возможностью указания настроек отправки почты в конфиге хоста.

Решение проблем

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

  1. Запустите установщик Open Server Panel и не выбирая никакие компоненты к установке перейдите к окну выбора доп. задач и выполните установку DLL библиотек, настройку системы и прав доступа к файлам.
  2. Убедитесь что IP адрес, заданный в настройках, существует (кроме [*]). Так же убедитесь что все другие настройки программы корректны.
  3. Добавьте Open Server Panel в доверенные программы вашего файрвола/антивируса или настройте их должным образом, если таковые имеются.
  4. Запустите [Меню → Просмотр логов], попробуйте найти причину проблемы и устранить её (если это возможно).
  5. Включите в настройках Open Server Panel опцию [Запускать сервер в отладочном режиме] и попробуйте найти причину проблемы и устранить её (если это возможно).
  6. Выполните через консоль (запускать от имени Администратора) следующую команду: attrib -s -r -h -a C:\Windows\system32\drivers\etc\hosts
  7. Активируйте службу DNS если она отключена и запустите её, отключите все службы в имени которых присутствует IIS.
  8. Отключите глобальные прокси и проксификаторы если они установлены на вашем компьютере.

Информация

Очень распространённая проблема это занятый порт 80, занимает его обычно программа Skype. Для устранения проблемы перейдите в [Настройки Skype → Дополнительно → Соединение] и снимите галочку с пункта [Использовать порты 80 и 443 в качестве альтернативных].

Контроль учётных записей пользователей (UAC)

При включённой службе контроля учётных записей пользователей (UAC) и запуске без прав администратора Open Server Panel не будет иметь доступа к HOSTS файлу и автоматически перейдёт в ограниченный режим работы. Как правило, об ограниченном режиме сигнализирует наличие только одного домена localhost в меню программы, в то время как ранее были созданы и другие домены. Чтобы исправить ситуацию включите опцию [Требовать учётную запись Администратора] в настройках Open Server Panel и перезапустите программу, либо отключите контроль учётный записей (UAC).

Если у вас отсутствует возможность отключения UAC или запуска программы с правами администратора, то существует несколько вариантов решения данной проблемы:

  1. Использование встроенного DNS сервера (настройка согласно Руководства);
  2. Активация опции [Не вносить изменения в HOSTS файл] + ручное редактирование этого файла;
  3. Установить разрешающие права записи в HOSTS файл для всех пользователей Windows;
  4. Отказ от возможности управления доменами и работа с единственным доменом localhost;

Про кеширование сайтов

Кеширование в вебразработке — это очень важно. В WordPress особенно. Не то, чтобы Вордпресс такой плохой и тяжёлый, просто если можно ускорить загрузку страниц и одновременно снизить нагрузку на хостинг, а потратить на это пару минут, не воспользоваться этой возможностью было бы очень глупо. Итак, ближе к делу. Знакомьтесь с самым популярным плагином для кеширования страниц в вордпресс: WP Super Cache

Эффективность WP Super Cache

Просто приведу 2 примера, до и после установки и настройки плагина

До установки WP Super Cache

До установки WP Super Cache

После установки WP Super Cache

После установки WP Super Cache

То есть, вы сами видите грубый расчёт, без плагина страница генерируется 879 миллисекунд, а с плагином — 84 миллисекунды. Разница в 10 раз! Ещё остались сомнения в том, нужно ли его устанавливать?
Особо рекомендую к использованию на виртуальных хостингах, и если ваш сайт по типу информационный: блог или статейник — основное содержание почти не меняется.
Есть и противопоказания, но они больше условные: например, если ваш сайт почти не содержит постоянного содержимого, например предоставляет некоторый сервис, динамически изменяемые в php блоки и тому подобное. Правда, и тут можно найти выход, настроив тип кеширования Legacy или PHP и включив Enable dynamic caching в настройках. Так что, пути выхода есть :) Однако, я лично думаю, что для таких сайтов лучше обходиться объектным кешированием, например, на основе W3 Total Cache, что тоже будет довольно эффективно.

Обзор плагина WP Super Cache

Принцип работы прост: плагин создаёт статичные html и php файлы – копии страниц WordPress и сохраняет их в кеш: /wp-content/cache/supercache/. Потом, при заходе пользователя на какую-либо страницу сайта, WordPress, вместо того, чтобы создать страницу с нуля, отдаёт браузеру заранее сохранённую копию html-страницы из кеша или собирает её максимально быстро из готовых php-файлов. Думаю, вполне очевидно, что такой вариант выходит экономнее по затратам ресурсов сервера и быстрее в плане скорости загрузки страницы.
Конечно, кеш отдаётся не всегда. При настройках по умолчанию, кеш не отдаётся для:

  1. Залогиненных пользователей;
  2. Пользователей, которые только что оставили комментарий на сайте;
  3. Пользователей, которые просматривают защищённую паролем запись.

Но, так как доля этих пользователей незначительна, WP Super Cache является очень эффективным кеширующим инструментом.

Где скачать WP Super Cache

Скачать плагин вы можете из официального репозитория https://wordpress.org/plugins/wp-super-cache/

Как установить плагин WP Super Cache

Можно либо распаковать архив в директорию плагинов /wp-content/plugins/, либо воспользоваться загрузчиком плагинов в админке http://example.com/wp-admin/plugin-install.php?tab=upload

Кстати, есть подробная инструкция с видео для новичков, как устанавливать плагины в WordPress

Здесь и далее заменяйте http://example.com в примерах на ваш адрес сайта

Если у вас свой виртуальный или выделенный сервер, обязательно выставите верные права доступа на распакованные файлы, каталоги, и /wp-content/, чтобы кеш смог записываться

Также, более простым вариантом будет зайти в http://example.com/wp-admin/plugin-install.php, вбить в поиск WP Super Cache и установить найденный плагин

Установка WP Super Cache

Установка WP Super Cache

Сигналом об удачной установке будет надпись:
Плагин WP Super Cache не активирован! Чтобы включить его, перейдите на страницу управления

Настройка WP Super Cache

После установки плагин нужно настроить. Это не займёт много времени. Самые основные моменты я опишу сначала, про тонкую настройку — чуть дальше.

Процесс установки и настройки WP Super Cache на видео:

Итак, вы переходите по ссылке http://example.com/options-general.php?page=wpsupercache.

Если на данном этапе вы видите ошибку
A custom url or permalink structure is required for this plugin to work correctly. Please go to the Permalinks Options Page to configure your permalinks.


значит, у вас не настроены ЧПУ (человеко-понятные урлы). Переходите по ссылке http://example.com/wp-admin/options-permalink.php и выберите любой вариант, кроме первого

Теперь с ходу вас может огорошить сообщением
Your server is configured to show files and directories, which may expose sensitive data such as login cookies to attackers in the cache directories. That has been fixed by adding a file named index.html to each directory. If you use PHP or legacy caching, consider moving the location of the cache directory on the Advanced Settings page. If you just installed WP Super Cache for the first time, you can dismiss this message. Otherwise, you should probably refresh the login cookies of all logged in WordPress users here by clicking the logout link below. The logout link will log out all WordPress users on this site except you. Your authentication cookie will be updated, but you will not be logged out.

В нём говорится о потенциальных проблемах с безопасностью на сервере, но также это сообщение может выскочить при первой установке или сбросе настроек плагина. Так как мы только что установили плагин, спокойно пропускаем сообщение — Dismiss

Включаем кеширование
Включаем WP Super Cache

И тут же чуть ниже проверяем
Проверка работы WP Super Cache

В принципе, всё, плагин работает и уже кеширует страницы :)
Но делает он в этом варианте не совсем эффективно. Приступим к тонкой настройке

Тонкая настройка кеширования

Переходим на вкладку Настройки (http://example.com/wp-admin/options-general.php?page=wpsupercache&tab=settings)

Статус кэширования

WP Super Cache: Статус кеширования и метод доставки кеша

Включить кеширование
Отмечаем. Если снять галочку, кеширование выключится. То есть, грубо говоря, этот пункт включает и выключает кеширование, то есть делает то же самое, что и включение/отключение кеширования на странице http://example.com/wp-admin/options-general.php?page=wpsupercache&tab=easy

Метод доставки кеша

WP Super Cache: Статус кеширования и метод доставки кеша

Тут есть 2 варианта на выбор:

Простой
В данном случае, кеш будет обслуживать PHP. Вариант, когда сервер работает на NGINX + PHP-FPM, и нет возможности вносить изменения в конфигурацию NGINX. Также, может понадобиться, если на сайте используется отдельная тема для мобильных девайсов. В остальных случаях, выбирайте режим Эксперт.
Эксперт
Использовать mod_rewrite для обслуживания кешированных файлов. Выбираем этот пункт как наиболее быстрый и удобный для сервера.

Разное

WP Super Cache разное

Не кэшировать страницы для известных пользователей. (Рекомендовано)
Включать однозначно. Если отключить, для известных пользователей (их 3 типа, указывались выше) будет генерироваться отдельный кеш, который ещё и всплыть наружу может, если теоретически. Ещё вы не будете видеть тулбар админа на страницах, что очень неудобно, когда нужно отредактировать страницу, сбросить кеш или ещё что-то в этом духе.
Не кешировать страницы с параметрами GET (?x=y в конце URL)

Если отметить, то будет принимать во внимание параметры запроса и не кешировать её, если URL будет с параметрами навроде http://example.com/post?utm_source=twitter. Можно включить, можно отключить, смотрите по вашим потребностям. Чаще всего, его отключают.

Сжимать файлы кэша чтобы ускорить работу. (Рекомендовано)

Отключить. В дополнение к обычному html будет создавать сжатую в gzip копию. Если экономите дисковое пространство — отключайте. Если у вас сервер на чистом Apache, либо  NGINX без gzip, что встречается довольно редко — включите. Можете включить и посмотреть, будет мешать — отключите. Будет глючить на вашем хостинге — отключите.

Кеш HTTP заголовков с содержимым страницы.
Отключить. Включать, если есть проблемы с отдачей HTTP-заголовков. Заголовками HTTP должен заведовать сервер, а не плагин кеширования. При включении кеш страницы будет создаваться не в виде одной единой HTML-страницы, а в виде двух php-файлов, один из которых содержит заголовки, а второй — HTML-копию сгенерированной страницы.
Ошибка 304. Данная ошибка возникает тогда, когда страница не была изменена со времени прошлого запроса.
Включать обязательно. Будет отдавать 304 заголовок повторно зашедшему пользователю, если страница не изменилась, что означает, что его браузер не будет выкачивать страницу с сервера, а воспользуется сохранённой локально копией, что очень полезно и эффективно.

Если включен режим Эксперт, то есть в работе используется mod_rewrite, то этот пункт будет неактивным, ибо включен по умолчанию.

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

Если отметить, все пользователи, о которых Worpdress знает (авторизованные, прокомментировавшие), будут считаться анонимными и получать данные из кеша наравне со всеми. Я считаю, что лучше отключить, как правило, их не так уж их и много, а проблемы могут возникать. Но если аудитория сайта состоит, в основном, из авторизованных пользователей, и таковой функционал понадобится, то лучше воспользоваться W3 Total Cache или чем-то более подходящим.

Авто перестройка кэша. Гости блога увидят устаревшие версии страниц кэша пока новые будут генерироваться

Включать, полезный функционал.

Гордо заявить миру что ваш сервер может принять любую нагрузку (поместит сообщение в подвал сайта)

Отключить. Промо плагина и её автора. Если сайт делается ради фана — включите, сделаете добро человеку. Если проект коммерческий, и лишние ссылки недопустимы, отключать без вариантов.

Расширенные

WP Super Cache расширенные

Включить динамическое кеширование. Требует «PHP» или упрощенного режима кеширования. (Смотрите ЧаВо или код примера в wp-super-cache/plugins/dynamic-cache-test.php).
Отключать. Эта опция будет полезна тем, кто изменяет код шаблонов, вставляя в них динамическое содержимое. Он работает, исполняя динамический код на странице перед тем, как выдать её браузеру пользователя.
На пример такого шаблона можно посмотреть тут /wp-content/plugins/wp-super-cache/plugins/dynamic-cache-test.php
Поддержка мобильных устройств. (Требуется внешний плагин или тема. Смотрите ЧаВо для дополнительной информации)
Отключить. В наш век адаптивного дизайна вопрос становится неактуальным. Включите, если же ваша тема подразумевает отдельную выдачу для мобильных, либо вы пользуетесь одним из следующих плагинов:
  • Jetpack’s Mobile Theme Module
  • WPTouch
  • WordPress Mobile Edition
  • WordPress Mobile Pack
Убрать поддержку UTF-8 из файла .htaccess. Требуется только если вы видите странные символы или пунктуация некорректна. Требует обновления правил rewrite
Отключить. Необходимо включать, только если вы видите странные символы или некорректные знаки пунктуации, что случается крайне редко.
Очистить все файлы кеша при публикации или обновлении страницы или записи.
Очищает весь кеш, когда запись или страница публикуется или обновляется. Я отключил, так как не вижу смысла сбрасывать весь кеш из-за одной страницы. Вы смотрите по вашей ситуации.
Дополнительная сверка кэша (очень редко может нарушить работу кэширования).
Отключить
Обновлять страницу при добавлении нового комментария к ней
На ваше усмотрение
Создать список страниц в кэше (выводится на этой странице)
Отключить. Список страниц в кеше можно посмотреть в разделе Состояние кеша
«Поздняя» инициализация. Плагин будет отображать кэшированные страницы после загрузки WordPress. Опция полезна при режиме совместимости.
Отключить
НЕ КЕШИРОВАТЬ СТРАНИЦУ секретный ключ:
Ключ, с помощью которого можно обойти кеш. Например, чтобы увидеть главную страницу в обход кеша, зайдите на страницу http://example.com/?donotcachepage=5aasdawc4fed6ec1b0f5e1037d670867 (ключ вставите свой)

Когда все пункты пройдены, сохраняем их.

Модуль Mod Rewrite

Если вы выбрали способ кеширования mod_rewrite, то плагин потребует обновить .htaccess
WP Super Cache требует обновить htaccess mod_rewrite

Прокручиваем страницу вниз и обновляем
Обновляем правила .htaccess

Просроченные страницы, Очистка мусора

Теперь нужно настроить правила очистки устаревшего кеша
Настройка WP Super Cache: Просроченные страницы, Очистка мусора

  • Таймаут кэширования — выставляется время жизни кеша в секундах, сколько времени он остаётся актуальным. Хорошим тоном будет начать с 1 часа (3600 секунд). Вы подбирайте время, исходя из принципа, как часто обновляется контент на сайте: чем реже, тем большее число можно ставить. Например, в статейниках вполне можно оставлять 86400 секунд, что соответствует 24 часам.

    Также, вы можеет поставить 0, и тогда старый кеш не будет очищаться. Это может быть полезным, скажем, если Вы стремитесь к тому, чтобы дата создания страницы соответствовала дате создания её закешированной копии. Однако, помните, что если Вы вносите изменения в дизайн сайта, либо устанавливаете новый плагин, который вносит в изменения в дизайн страницы, изменения не будут приняты, пока кеш не будет очищен. Я лично рекомендую не обнулять очистку кеша, а ставить время жизни кеша побольше.

  • Планировщик — как часто проверять устаревание кеша. Можно выбрать Таймер — тогда кеш будет проверяться постоянно с интервалом в указанное число секунд, а можно выбрать Часы — тут указывается чёткое время (час и минута) по UTC, в которое с регулярностью Интервал будет проходить проверка актуальности кеша.
  • Электронные адреса для уведомлений — отсылать ли уведомления на email администратора сайта об очистке мусора.

Поисковые и другие боты

Чтобы запретить плагину кэшировать запросы от поисковых ботов и других сетевых роботов, введите их названия в поле ниже (по одному в строке). Если копия страницы уже существует в кэше Super Cache, то она все равно будет отправлена боту.

Стираем и оставляем поле пустым, сохраняем.

Остальные настройки

Несущественны, поэтому оставляете как есть.

Общий кеш

Этот раздел важен в свете того, что Google и другие поисковые системы теперь учитывают скорость загрузки страниц как один из факторов ранжирования сайта в поиске.
Обычно, WP Super Cache создаёт кеш только той страницы, которую кто-то посетил. И это, по сути, правильно. Но что, если этим кто-то является бот поисковика? Никакого положительного эффекта от кеширующего плагина он не увидит. И раздел настроек Общий кеш позволяет избежать этого недоразумения, предсоздавая закешированные копии всех страниц сайта ещё до их посещения кем-либо.

Для любителей консоли SSH есть возможность не использовать Общий кеш, а для разогрева кеша использовать wget:

wget -r -l 3 -nd --wait=5 --delete-after http://example.com

Такую конструкцию можно отправить в cron:

  1. В консоль пишем
    crontab -e
  2. Конструкция ниже обходит сайт каждый час, поддерживая страничный кеш свежим:
    0 * * * * wget -r -l 3 -nd --wait=5 --delete-after http://example.com

Раздел хорошо описан на русском языке, поэтому распишу только основные настройки:
Настройка общего кеша WP Super Cache

  • Обновлять кеш каждые 120 минут — кеш будет считаться актуальным 2 часа. Вы ставите своё время. Чем реже обновляется сайт, тем большее время можно поставить.
  • Предварительный режим (очистка мусора работает не полностью, опция рекомендована к включению.) — включить, в объяснении, думаю, не нуждается.
  • Предзагрузка тегов, категорий и других таксономий. — включить. Будут предзагружены категории, теги и другие таксономии.

Теперь сохраняете данные или создаёте кеш прямо сейчас.

Общий объём кеша будет зависеть от количества записей, страниц, рубрик (категорий), меток (тегов). Дисковое пространство — это, как правило, самый дешёвый и легко масштабируемый ресурс на хостинге и сервере, и если у вас не сильно посещаемый проект (до 10-20 тысяч уникальных пользователей в сутки), а страничный кеш выходит большим, то вы вполне можете брать обычный дешёвый жёсткий диск hdd, на честном хостинге разницу с ssd вряд ли заметите, зато сэкономите бюджет. Если больше, hdd тоже будет хорошо себя показывать, но тут я бы порекомендовал посоветоваться с системными администраторами на предмет оптимизации сервера, либо написать мне в форму обратной связи.

На этом необходимый минимум по настройке WP Super Cache завершён. Далее будет идти информация для продвинутых вебмастеров и системных администраторов, а также некоторая информация, касаемо часто возникающих вопросов.

WP Super Cache и WooCommerce

Если у вас магазин на основе WooCommerce, и вы хотите использовать WP Super Cache, то вам нужно исключить следующие страницы из процесса кеширования:

  • Корзина (Cart)
  • Мой аккаунт (My Account)
  • Оформление заказа (Checkout)

Это можно сделать в разделе Расширенные example.com/wp-admin/options-general.php?page=wpsupercache&tab=settings, просто отметив Страницы (is_page)

WP Super Cache и Woocommerce

Такой вариант подойдёт, если у вас мало записей в Страницах. Если же их много, то лучше не отмечать Страницы (is_page), а добавить части адресов служебных страниц в раздел чуть ниже, как на примере

Поле ниже Вы также можете заполнить фрагментами адресов страниц (или групп страниц, например, архив за год/месяц и т.д.), которые не будут кэшироваться. Плагин будет сканировать адреса страниц на предмет наличая в них фрагментов, указанных ниже, перед кэшированием.

Добавляем служебные страницы WooCommerce в список исключений

Как проверить работу WP Super Cache самостоятельно

Вы можете самостоятельно проверить, как работает плагин, довольно просто.
Для начала, открываете браузер в режиме инкогнито или в приватном режиме. Для Firefox это делается с помощью Ctrl + Shift + P, для Google Chrome или Яндекс БраузераCtrl + Shift + N.
Теперь откройте исходный код страницы (Ctrl + U) и посмотрите в самый конец, там вы увидите примерно следующее





Это отметка, сколько времени собиралась страница и в какие дату и время это произошло.

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



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

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

Далее, если всё в порядке, и вам интересно, сколько времени занимает отклик от сервера до вашего браузера, вы можете воспользоваться консолью разработчика.

Для этого, жмёте F12, откроется консоль, там вы переходите в раздел NetworkDoc или СетьHTML и перезагружаете страницу (Ctrl + F5). По завершению, ищете верхнюю строчку и время отклика, оно должно занимать в норме 100-300 миллисекунд или 0.1-0.3 секунды. Может и больше, если ваш хостинг в США, а вы в России, континентальную удалённость нужно учитывать. Но вообще, чем меньше это значение, тем лучше.
Ради интереса можете временно выключить WP Super Cache и сравнить значения до и после установки плагина.

После установки WP Super Cache

После установки WP Super Cache

И ещё маленький совет — кеш браузера иногда будет путать вас, поэтому полностью сбрасывайте его с помощью Ctrl + F5, а лучше тестируйте работу плагина и сайта в режиме инкогнито браузера.

Настройка сервера для WP Super Cache

Итак, плагин у нас установлен и настроен правильно. Как проверить правильность работы рассказано выше, а теперь перейдём к настройке сервера. Это будет актуальным, если у вас собственный VDS/VPS или выделенный сервер.

Далее, в примерах будет происходить настройка под домен example.com и его поддоменов. Вы должны самостоятельно заменить их на своё имя домена

htaccess (Apache) и WP Super Cache

Этот пункт касается тех, у кого сервер настроен в режиме работы LAMP (Linux, Apache, Mysql, PHP). Если во фронтенде или в роли основного вебсервера установлен NGINX, советую перейти к разделу ниже

Если вы дошли до этого пункта и выбрали в настройках плагина режим mod_rewrite, то по сути ничего делать и не нужно. Но, в целях оптимизации работы (.htaccess загружается каждый раз при загрузке сайта, apache2.conf только 1 раз во время рестарта сервера), или если обработка правил .htaccess на вашем сервере отключена, вы можете скопировать данные из .htaccess и перенести их в конфигурационный файл, где объявляются настройки вашего сайта (например, в Debian он может располагаться в /etc/apache2/vhosts/sheensay.ru.conf).

Далее, пример конфигурационного файла .htaccess

# BEGIN WPSuperCache

RewriteEngine On
RewriteBase /
#If you serve pages from behind a proxy you may want to change 'RewriteCond %{HTTPS} on' to something more sensible
AddDefaultCharset UTF-8
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} !.*=.*
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html.gz -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html.gz" [L]

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} !.*=.*
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{HTTPS} !on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html.gz -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html.gz" [L]

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} !.*=.*
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html" [L]

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} !.*=.*
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTPS} !on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html" [L]


# END WPSuperCache

# BEGIN WordPress

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]


# END WordPress

Пример конфигурационного файла Apache. Вы можете вставить в него код из .htaccess

#user 'example' virtual host 'example.com' configuration file

  ServerName example.com
  AddDefaultCharset UTF-8
  AssignUserID example example
  DirectoryIndex index.html index.php
  DocumentRoot /var/www/example/data/www/example.com
  ServerAdmin [email protected]
  ServerAlias www.example.com
  
    SetHandler application/x-httpd-php
  
    SetHandler application/x-httpd-php-source
  
  php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [email protected]"
  php_admin_value upload_tmp_dir "/var/www/example/data/mod-tmp"

  #php_admin_value session.save_path "/var/www/example/data/mod-tmp"
  php_admin_value session.save_handler "memcache"
  php_admin_value session.save_path "tcp://127.0.0.1:11211"


  php_admin_value open_basedir "/var/www/example/data:."
  CustomLog /var/www/httpd-logs/example.com.access.log combined
  ErrorLog /var/www/httpd-logs/example.com.error.log

  php_admin_flag engine on
  Options -ExecCGI
  # После этой строки вставляются данные из .htaccess

NGINX и WP Super Cache

Предполагается, что NGINX настроен по подобному примеру

Итак, у вас свой виртуальный или выделенный сервер, и вам хочется, чтобы WP Super Cache выжимал по максимуму. Но, из коробки этот плагин предлагает настройки только под php и htaccess. И здесь я опишу, как можно настроить конфигурационный файл NGINX под оптимальную работу с WP Super Cache. Это может пригодиться, скажем, если у вас сервер собран в виде LEMP (Linux, NGINX (EngineX), Mysql, PHP), и вместо Apache в бекенде php-fpm.

Хочу заметить, что в данной конфигурации кеш NGINX включать не нужно, так как NGINX будет брать статичные страницы из кеша WP Super Cache напрямую, минуя интерпретатор PHP. И, на мой взгляд, удобнее именно эта конфигурация, так как управлять кешем из админпанели WordPress удобнее, нежели чем из консоли кешем NGINX.

Если для сайта включен кеш NGINX, и отключить его нельзя, то плагин WP Super Cache лучше не использовать, так как увеличения производительности Вы не заметите, а двойное кеширование будет только мешать.

WooCommerce и другие подобные плагины, которые используют переменные GET в URL, требуют, чтобы при обработке PHP передавались параметры $args:

try_files $wpsupercache $uri $uri/ /index.php?$args

Однако, WP Super Cache может работать неправильно при использовании /index.php?$args.
В таком случае, могу посоветовать выбрать другой кеширующий плагин, например, W3 Total Cache.

В примере будет 3 варианта конфигурации, в зависимости от режима работы WordPress: обычный сайт, WordPress Multisite с сайтами в подкаталогах и WordPress Multisite с сайтами на поддоменах. По умолчанию, включен первый режим. Если у вас Miultisite, просто раскомментируйте нужные строчки.

Ниже пример конфигурационного файла NGINX + php-fpm с возможностью заменить бекенд на Apache с комментариями:

### user 'example' virtual host 'example.com' configuration file
### http://sheensay.ru/?p=1915
server {

  ### Если Multisite поддомены, для domain mapping замените строку ниже на: server_name example.com *.example.com;
  server_name example.com www.example.com;

  ### Если Multisite поддомены, раскомментируйте строку ниже для domain mapping  
  #server_name_in_redirect off;

  ### Если Multisite поддомены, для domain mapping замените строку ниже на: listen 80 default_server;
  listen 1.2.3.4:80; # Укажите вместо 1.2.3.4 IP своего сервера

  charset UTF-8;
  disable_symlinks if_not_owner from=$root_path;
  index index.html index.php;
  root $root_path;
  set $root_path /var/www/example/data/www/example.com;
  access_log /var/log/example.com.access.log ;
  error_log /var/log/example.com.error.log warn;
  #error_log /var/log/example.com.debug.error.log debug;


  include /etc/nginx/vhosts-includes/*.conf;

  ### Если gzip не включен глобально, включим его тут
  # gzip on;
  # gzip_disable "msie6";
  # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;


  ### Разрешаем доступ для Let's Encrypt
  location ~ /\.well-known {
    allow all;
  }

  ### Запрещаем доступ к файлам и каталогам с точкой в начале названия, например, .htaccess, .git
  location ~ /\. {
    deny all; 
  }

  ### Запрещаем доступ к файлам с расширением .php в каталогах загрузок, например, /wp-content/uploads
  location ~* /(?:uploads|languages|files)/.*\.php$ {
    deny all;
  }



  ### Если Multisite в режиме подкаталогов, например http://example.com/wpsubsite/, просто раскоментируйте блок ниже ###
  
  #if (!-e $request_filename) {
  #  rewrite /wp-admin$ $scheme://$host$uri/ permanent;  
  #  rewrite ^(/[^/]+)?(/wp-.*) $2 last;
  #  rewrite ^(/[^/]+)?(/.*\.php) $2 last;
  #}



  ### Устанавливаем новую переменную $cache_uri, которой присваиваем запрос из предустановленной переменной $request_uri
  set $cache_uri $request_uri;

  ### POST запросы не кешируются 
  if ($request_method = POST) {
    set $cache_uri 'null cache';
  }   

  ### Запросы с параметрами в URL не кешируются 
  if ($query_string != "") {
    set $cache_uri 'null cache';
  }   

  ### Не кешировать запросы URL, содержащие следующие части (как правило, админка и служебные, sitemap yoast)
  if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $cache_uri 'null cache';
  }   

  ### Не использовать кеш для авторизованных пользователей и последних комментаторов
  if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
    set $cache_uri 'null cache';
  }

  ### фавикон не логировать
  location = /favicon.ico { log_not_found off; access_log off; }
  ### robots.txt может генерироваться движком WordPress
  location = /robots.txt  { try_files $uri /index.php; }


  ### Определим расположение кеша
  # ${http_host}${cache_uri} может не содержать слеша, потому что ${cache_uri} уже может начинаться со слеша. У вас может быть иначе. Проверьте с помощью add_header
  set $wpsupercache /wp-content/cache/supercache/${http_host}/${cache_uri}/index.html;

  ### Ещё будем пробовать искать версию для https
  set $wpsupercache_ssl /wp-content/cache/supercache/${http_host}/${cache_uri}/index-https.html;

  ### Если у вас сайт на SSL/TLS, то есть, работает по HTTPS, то вместо index.html у вас будут генерироваться index-https.html
  if ( $scheme = 'https' ) {
    set $wpsupercache /wp-content/cache/supercache/${http_host}/${cache_uri}/index-https.html;
  }
  ### Проверочный заголовок, если раскомментируете, увидите, что располагается в переменной $wpsupercache
  #add_header X-wpsc "$wpsupercache" always;


  ### Можно отлавливать переменные в заголовках. Подробнее http://sheensay.ru/nginx
  # add_header X-uri "$uri" always;
  # add_header X-cache-uri "$cache_uri" always;
  # add_header X-$http_host "$http_host" always;

  ### Переходим к работе с бекендом ###
  ### Ниже будут 2 варианта настройки, php5-fpm и Apache.  ####
  ### По умолчанию, всё настроено под первый вариант. ###
  ### Чтобы включить Apache, закомментируйте всё, что идёт ниже до блока Apache ###

  ### 1. PHP-FPM ###

  # Статичные файлы не логируем, выставляем http заголовок Expires на год
  location ~* ^.+\.(jpe?g|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    expires 365d; log_not_found off; access_log off;
  }

  # Основной запрос, в котором мы пытаемся сначала получить закешированную версию страницы
  # Если кеша нет, тогда отправляемся к WordPress, чтобы он его нам создал
  location / {
    try_files $wpsupercache $wpsupercache_ssl $uri $uri/ /index.php?$args ;
  }


  # Наш бекенд - php-fpm
  location ~ \.php$ {

    try_files $uri =404; 
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param SERVER_NAME $http_host;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    # Тут, в зависимости от того, как установлен FastCGI, выбирайте или TCP, или сокет

    # TCP
    #fastcgi_pass 127.0.0.1:9000;
    # Сокет
    fastcgi_pass unix:/var/www/php5-fpm/example.com.sock; # Тут укажите путь до сокета php-fpm конкретного пользователя или сайта

  }



  ### 2. Apache. Если у вас в бекенде Apache, расскоментируйте всё, что ниже закомментировано одинарной решёткой, и закомментируйте всё, что выше до блока 1.PHP-FPM ###

  ### Статичные файлы не логируем, выставляем http заголовок Expires на год
  #location ~* ^.+\.(jpe?g|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
  #  expires 365d; log_not_found off; access_log off;
  #  try_files $uri $uri/ @apache ;
  #}


  #location / {
  #  try_files $wpsupercache $uri @apache ;
  #}


  ### php скрипты отправляем сразу в бекенд
  #location ~ [^/]\.ph(p\d*|tml)$ {
  #  try_files /does_not_exists @apache;
  #}


  ### Отправляем запросы к бекенду (Apache или php-fpm)
  ### Если у вас в бекенде Apache, раскомментируйте блок ниже
  #location @apache {
    ### Apache ###
    #proxy_pass http://127.0.0.1:8080;
    #proxy_redirect http://127.0.0.1:8080 /;
    #proxy_set_header Host $host;
    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #proxy_set_header X-Forwarded-Proto $scheme;
  #}
}

Учтите, что Apache тут висит на порту 8080

Перезагружаем NGINX

nginx -t && nginx -s reload

Как проверить правильность URI файлов кеша WP Super Cache

Допустим, Вы хотите проверить страницу http://example.com/mypage, правильно ли видит NGINX её расположение в кеше. Для этого надо:

  1. Раскомментировать строку с add_header, код будет примерно следующего содержания:
    set $wpsc /wp-content/cache/supercache/$http_host$cache_uri/index.html;
    if ( $scheme = 'https' ){
       set $wpsc /wp-content/cache/supercache/$http_host$cache_uri/index-https.html;
    }
    add_header X-$wpsc_uri $wpsc always;
  2. Перезагрузить nginx:
    nginx -s reload
  3. Открыть Хром в режиме инкогнито (Ctrl + Shift + N) и открыть любую страницу сайта
  4. Нажать F12, откроется консоль. Перезагрузить страницу F5
  5. В консоли выбрать NetworkDoc, затем кликнуть самый верхний пункт в списке (это наша страница mypage), раскроются подробности — в пункте Responce Headers видим наш URI.

    Как проверить заголовки в консоли F12 Googe Chrome

    Как проверить заголовки в консоли F12 Googe Chrome

    В переменной X-$wpsc_uri должно находиться следующее: /wp-content/cache/supercache/example.com/mypage/index.html

Устранение ошибок в работе WP Super Cache

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

Отсутствующие модули Apache

mod_headers - Необходимо настроить кэширование на странице плагина. Пользователи браузера IE7 будут видеть необновленные страницы из кэша без поддержки данного модуля. mod_expires - Установите дату истечения актуальности страниц. Пользователи могут не увидеть новую версию кэшированной страницы без данного модуля.

Если в бекенде PHP-FPM, а не Apache, просто проигнорируйте это сообщение.

Эта ошибка решается довольно просто — включением необходимых модулей Apache
Если у вас стандартный виртуальный хостинг — напишите в службу поддержки, они решат этот вопрос.
Если у вас свой сервер, запускаете в консоли SSH:

a2enmod headers && a2enmod expires

Потом перезагружаете Апач

service apache2 restart

WP Super Cache не создает общий кэш

Убедитесь, что вы нажимаете именно на кнопку Создать общий кеш сейчас. Через 10 секунд перезагрузите страницу, вы увидите процесс создания кеша. Заодно проверьте каталог /wp-content/cache/supercache/имя_домена/структура_сайта/

Если кеш всё равно не создаётся, и у вас простой хостинг — напишите в службу поддержки, они помогут решить вопрос.

Если у вас свой сервер или vps/vds, и кеш не создаётся, проверьте, есть ли у WordPress права писать в каталог /wp-content/cache/. Это можно сделать, скажем, с помощью Far Manager:

  1. Авторизуетесь на сервере по ssh
  2. Переходите в каталог с файлами сайта, например
    cd /var/www/sheensay.ru/wp-content/
  3. Перемещаете указатель на директорию cache и жмёте комбинацию Ctrl + A
  4. Вылезет окно

    Права на запись /wp-content/cache/

    Права на запись /wp-content/cache/

  5. В окошке посмотрите на строки Owner, Group (здесь должны быть прописаны данные аккаунта по аналогии с моим примером). Воспользуйтесь командой chown, чтобы поменять владельца и группу. В консоль пишем:
    chown -Rv sheensay:sheensay cache
    

    Или, так как часто nginx работает под пользователем www-data

    chown -Rv www-data:www-data cache
    
  6. Также, обратите внимание на права доступа Octal: 0755 — это верный уровень. Если что, можно сменить права доступа командой chmod, либо прямо из Far Manager путём проставления галочек в Permissions, не забывая поставить галочку Set attributes recursively (установить атрибуты рекурсивно, то есть во всех вложенных каталогах тоже).

Как очистить кеш WP Super Cache

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

Не забудьте сбросить кеш браузера, например, Ctrl + F5 для конкретной страницы во фронтенде или Ctrl + Shift + Delete для Google Chrome

Как правильно удалить WP Super Cache

Плагин удаляется так же, как и любой другой — через панель управления http://example.com/wp-admin/plugins.php, деактивацию плагина и его последующего удаления.

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

Если хотите удалить его вручную:

  1. Отключить кеширование и очистить кеш (желательно 3 способом)
  2. Деактивировать плагин
  3. Удалить из wp-config.php define( 'WP_CACHE', true );
  4. Удалить из .htaccess правила, добавленные в секцию #WPSuperCache
  5. Удалить /wp-content/advanced-cache.php и /wp-content/wp-cache-config.php
  6. Удалить /wp-content/cache/
  7. Удалить /wp-content/plugins/wp-super-cache/

W3 Total Cache или WP Super Cache

Меня часто спрашивают, какой плагин лучше выбрать, W3 Total Cache или WP Super Cache? Отвечу по пунктам:

Выбирайте WP Super Cache, если:
  • Если у вас информационный сайт — статейник, блог и тому подобное;
  • Вы не особо разбираетесь или не хотите разбираться в тонкостях работы и настроек сайтов и плагинов. WP Super Cache проще в настройке, но от этого он не менее эффективен в работе;
Выбирайте W3 Total Cache, если:
  • Если у вас сервис или сайт, у которого большая аудитория — авторизованные пользователи — сервис, где основной сервис внутри, для доступа к которому нужно авторизоваться, форум, соцсеть и тому подобное;
  • Вы — программист или пытливый человек, которому нравится возиться и разбираться в тонкой настройке кеширования, контролировать подобные тонкости.

Кэширование произвольных данных (результаты выборки, данные внутри виджетов и тп.)

// Обращаемся к кэшу приложения
$cache = Yii::$app->cache;
// Формируем ключ
$key = 'category_list';
// Пробуем извлечь категории из кэша.
$categories = $cache->get($key);
if ($categories === false) {
  //Если $categories нет в кэше, вычисляем заново
  $categories = Category::find()->all();
  // Сохраняем значение $categories в кэше по ключу. Данные можно получить в следующий раз.
  $cache->set($key, $categories);
}

print_r($categories);

Начиная с версии 2.0.11, компонент кэширования предоставляет метод getOrSet(), который упрощает код при получении, вычислении и сохранении данных. Приведённый ниже код делает в точности то же самое, что и код в предыдущем примере:

// Обращаемся к кэшу приложения
$cache = Yii::$app->cache;
// Формируем ключ
$key = 'category_list';
// Данный метод возвращает данные либо из кэша, либо из откуда-либо и записывает их в кэш по ключу на 1 час
$categories = $cache->getOrSet($key, function () {
  return Category::find()->all();
}, 3600);

print_r($categories);

Кэширование фрагментов

Кэширование фрагментов относится к кэшированию фрагментов страницы. Обычно кэширование фрагментов используйтся в представлении:

beginCache('category_list', ['duration' => 3600])):?> foreach($categories as $category): ?>

= $category->name ?>

endforeach; ?> $this->endCache(); endif; ?>

Срок хранения duration. По умолчанию, если срок хранения не указан $defaultDuration = 0. Это означает то, что время хранения бесконечен.

// Кэшированние содержимого на бесконечный срок. Если нужен срок хранения кэша, то установить нужное значение в секундах (например, 3600 = 1 час)
if ($this->beginCache($id, ['duration' => 0])) {
  // ... здесь содержимое ...
  $this->endCache();
}

Зависимости dependency:

// Отображение содержимого зависит от того, изменена или нет категория (изменения значения столбца updated_at)
$dependency = [
  'class' => 'yii\caching\DbDependency',
  'sql' => 'SELECT MAX(updated_at) FROM category',
];

if ($this->beginCache($id, ['dependency' => $dependency])) {
// ... здесь содержимое ...
$this->endCache();
}

Вариации variations на примере кэширования виджета категорий:

 //В variations нужно передать id текущей категории (для каждой категории менюшка сохраняется в отдельный параметр кэша) ?>
beginCache('aside-widget', [
  'duration' => 3600, //(default = 0)
  'dependency' => [
    'class' => 'yii\caching\DbDependency',
    'sql' => 'SELECT MAX(update_at) FROM ' . Category::tableName(),
  ],
  'variations' => [
    isset($this->params['category']) ? $this->params['category']->id : null
]
])): ?>
= CategoryWidget::widget() ?>
endCache(); endif; ?>

Кэширование запросов

Кэширование запросов - это специальная функция, построенная на основе кэширования данных. Она предназначена для кэширования результатов запросов к базе данных.

// Кэширование запросов для DAO
// Возвращает ассоциативный массив с именами столбцов и значений
$categories = Yii::$app->db->cache(function () {
  return Yii::$app->db->createCommand('SELECT * FROM `category`')->queryAll();
});


// Кэширование запросов для ActiveRecord (на 1 час)
// Возвращает объект
$categories = Category::getDb()->cache(function (){
    return Category::find()->all();
}, 3600);

В пределах cache() вы можете отключить кэширование запроса. В этом случае вы можете использовать [[yii\db\Connection::noCache()]]:

categories = Yii::$app->db->cache(function () {

// SQL запросы, которые используют кэширование

Yii::$app->db->noCache(function ($db) {

  // SQL запросы, которые не используют кэширование

});

return $categories;
});

Если вы просто хотите использовать кэширование для одного запроса, вы можете вызвать [[yii\db\Command::cache()]] при построении команды:

// использовать кэширование запросов и установить срок действия кэша на 1 час
$categories = $db->createCommand('SELECT * FROM category)->cache(3600)->queryAll();

Можете использовать [[yii\db\Command::noCache()]] для отключения кэширования запросов для одной команды:

$result = $db->cache(function ($db) { 

	// ... Используется кэширование SQL запросов ...

// не использовать кэширование запросов для этой команды
$categories = $db->createCommand('SELECT * FROM category)->noCache()->queryAll();
// ...
return $result;
});

Кэширование страниц

Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Когда эта страница будет запрошена, сервер вернет её из кэша вместо того чтобы генерировать её заново.

public function behaviors()
{
  return [
    [
      'class' => 'yii\filters\PageCache',
      'only' => ['view'],
      'duration' => 3600,
      'variations' => [
        Yii::$app->language,
      ],
      'dependency' => [
        'class' => 'yii\caching\DbDependency',
        'sql' => 'SELECT MAX(update_at) FROM ' . Page::tableName(),
      ]
    ]
  ];
}

Приведённый код задействует кэширование только для действия view. Содержимое страницы кэшируется максимум на 1 час и варьируется в зависимости от текущего языка приложения. Кэшированная страница должна быть признана просроченной, если поле update_at изменилось.

Кэширование страниц очень похоже на кэширование фрагментов. В обоих случаях поддерживаются параметры duration (продолжительность), dependencies (зависимости), variations (вариации), и enabled (включен). Главное отличие заключается в том, что кэширование страницы реализовано в виде фильтра действия, а кэширование фрагмента в виде виджета.

Очистка кэша

Для очистки всего кэша, вы можете вызвать [[yii\caching\Cache::flush()]].

Очистить кэш из консоли можно вызвав yii cache/flush.

  • yii cache: отображает список доступных кэширующих компонентов приложения
  • yii cache/flush cache1 cache2: очищает кэш в компонентах cache1, cache2 (можно передать несколько названий компонентов кэширования, разделяя их пробелом)
  • yii cache/flush-all: очищает кэш во всех кэширующих компонентах приложения

Внимание!

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

Очистить кэш из контроллера:

// Очитит кэш всего приложения
Yii::$app->cache->flush();

Очистить кэш фрагмента по ключу:

function deleteFragmentCacheByKey($key)
{
  return Yii::$app->cache->delete(['yii\widgets\FragmentCache', $key]);
}

Автоматическое удаление кэша при обновлении записи в базе данных

Когда в БД вносятся изменения (добавление, редактирование, удалении записи в админке), данные в кэше становятся неактуальными. В этом случае можно к модели, которая отвечает за нужную таблицу подключить поведение с событиями для ActiveRecord (EVENT_AFTER_INSERT, EVENT_AFTER_UPDATE, EVENT_AFTER_DELETE), которые при каждом срабатывании будут удалять нужный кэш.

файл CachedBehavior.php в папке common\components\behaviors:

 'deleteCache',
      ActiveRecord::EVENT_AFTER_UPDATE => 'deleteCache',
      ActiveRecord::EVENT_AFTER_DELETE => 'deleteCache',
    ];
  }

  public function deleteCache()
  {
    foreach ($this->cache_key as $id){
      Yii::$app->cache->delete($id);
    }
  }
}

Подключаем поведение к нужной модели:

public function behaviors()
{
  return [
    'CachedBehavior' => [
      'class' => CachedBehavior::class,
      'cache_key' => ['category_list'],
    ]
  ];
}

Автоматическое удаление кэша при выполнении действий контроллера

Код, указанный выше обновляет кэш при действиях, указаных в поведении CachedBehavior. Данное поведение привязано к модели, которая в свою очередь занимается ещё выборкой записей. Такой подход в данном случае не очень интнресный, поэтому мы воспользуемся методом удаления кэша из контроллера. Плюсом такого метода является то, что мы можем на нужный нам контроллер навесить нужные события и в конечном итоге модель будет заниматься только логикой (выборка данных и тд), а контроллер по событию каких-либо действий с записями удалять нужный кэш.

Файл common\components\behaviors\DeleteCacheBehavior.php:

 'deleteCache',
    ];
  }

  public function deleteCache()
  {
    $action = Yii::$app->controller->action->id; //название текущего действия
    if(array_search($action, $this->actions)=== false) return;

    Foreach ($this->cache_key as $id){
      Yii::$app->cache->delete($id);
    }
  }
}

Добавляем поведение в контроллер (у меня это backend\controllers\CategoryController.php):

public function behaviors()
{
	return [
		// ...
		//Класс удаление кэша при выполнении указанных действий
		[
			'class' => DeleteCacheBehavior::class,
			'cache_key' => ['category_list'],
			'actions' => ['create', 'update', 'delete'],
		],
		// ...
	];
}

Удаление кэша по тэгу

Class yii\caching\TagDependency (API Documentation) здесь

При кэшировании данных мы указываем зависимость:

$cache = Yii::$app->cache;
$key = 'category_list';

$categories = $cache->getOrSet($key, function () {
  return Category::find()->all();
}, 3600, new TagDependency([
  'tags' => 'category_list'
]));

В нужном нам контроллере и нужном экшене (после сохранения модели):

if ($model->load(Yii::$app->request->post()) && $model->save()) {
  // При обновлении записи обновится кэш по указанному тэгу
  TagDependency::invalidate(Yii::$app->cache, 'category_list');
  return $this->redirect(['view', 'id' => $model->id]);
}

На гитхабе нашёл вот такой trait. Сам не пробовал использовать. Кому интересно, посмотрите.

Простой сервис для удаления кэша по тэгу

Пример очень простого сервиса по по очистке кэша по тэгу. Дело в том, что лучше бы не вызывать постоянно $cache = Yii::$app->cache;, а работать с объектом кэша напрямую через некий сервис, который будет в нужный нам момент очищать кэш по тэгу.

cache = $cache;
  }

  public function deleteTag($tag)
  {
    TagDependency::invalidate($this->cache, $tag);
  }

  public function flush()
  {
    $this->cache->flush();
  }
}

Там где получаем данные (модель или лучше отдельный репозиторий для получения данных):

cacheService = $cacheService;
  }

  public function getAll(): array
  {
    $key = Category::CACHE_ASIDE;
    $query = Category::find()->select(['name', 'slug'])->orderBy(['name' => SORT_ASC]);
    return $this->cacheService->cache->getOrSet($key, function () use ($query) {
      return $query->all();
    }, 0, new TagDependency([
      'tags' => Category::CACHE_ASIDE
    ]));
  }    
}

Требования

  • PHP >= 7.0;
  • класс HTTP >= 3.0 - НТТР(S) клиент с троттлингом запросов, поддержкой маркера BOM в теле сообщения формата JSON и выводом отладочной информации о запросах и ответах в STDOUT;
  • класс DebugLogger >= 2.0 - логгер, сохраняющий отладочную информацию в файл вместе с данными об объеме используемой оперативной памяти и прошедшем времени;
  • произвольный автозагрузчик классов, реализующий стандарт PSR-4, необходимый в том случае, если не используется Composer.

Установка

Установка через composer:

$ composer require andrey-tech/bitrix24-api-php:"^1.6"

или добавить

"andrey-tech/bitrix24-api-php": "^1.6"

в секцию require файла composer.json.

Класс Bitrix24API

Для работы с REST API Битрикс24 используется класс \App\Bitrix24\Bitrix24API.
При возникновении ошибок выбрасывается исключение класса \App\Bitrix24\Bitrix24APIException.
В настоящее время в классе реализованы методы для работы со следующими сущностями Битрикс24:

  • Сделки
  • Контакты
  • Компании
  • Каталоги товаров
  • Товары
  • Разделы товаров
  • Товарные позиции
  • Задачи
  • Дела
  • Пользователи
  • Диск
  • Лиды

Базовые методы класса

Базовые методы находятся в классе \App\Bitrix24\Bitrix24API:

  • __construct(string $webhookURL) Конструктор класса.
  • request(string $function, array $params = []) :?array Отправляет запрос в API.
  • getList(string $function, array $params = []) :\Generator Загружает все сущности заданного типа.
  • fetchList(string $function, array $params = []) :\Generator Загружает все сущности быстрым методом.
  • batchRequest(array $commands, $halt = true) :array Отправляет пакет запросов в API.
  • buildCommands(string $function, array $items) :array Создает массив команд для пакетного запроса.
  • buildCommand(string $function, array $params) :string Возвращает команду для пакетного запроса.
  • getLastResponse() :?array Возвращает последний ответ от API.
  • setLogger($logger) Устанавливает объект класса, выполняющего логирование отладочной информации в файл.

Параметры методов:

  • $webhookURL - URL входящего вебхука;
  • $function - имя метода (функции) запроса;
  • $params - параметры запроса;
  • $commands - пакет команд;
  • $items - массив полей запросов;
  • $halt - прерывать последовательность запросов в случае ошибки;
  • $logger - объект класса, реализующего интерфейс \App\DebugLogger\DebugLoggerInterface.

Дополнительные параметры

Дополнительные параметры настройки доступны через публичные статические и нестатические свойства класса \App\Bitrix24\Bitrix24API:

Нестатическое свойство По умолчанию Описание
$batchSize 50 Устанавливает количество команд в одном пакете запросов (batch)
$logger null Хранит объект класса \App\DebugLogger\DebugLogger, выполняющего логирование запросов и ответов к API в файл. Если null, то логирование не выполняется.
$http \App\HTTP\HTTP Хранит объект класса \App\HTTP\HTTP, отправляющего запросы к API
Статическое свойство По умолчанию Описание
$WITH_CONTACTS 'CONTACTS' Имя поля для массива возвращаемых связанных сущностей типа контакт
$WITH_COMPANIES 'COMPANIES' Имя поля для массива возвращаемых связанных сущностей типа компания
$WITH_PRODUCTS 'PRODUCTS' Имя поля для массива возвращаемых связанных сущностей типа товар

Методы для работы с сущностями Битрикс24

Методы работы со сделками

Методы для работы со сделками находятся в трейте \App\Bitrix24\Deal:

  • getDeal($dealId, array $with = []) :array Возвращает сделку по ее ID.
  • addDeal(array $fields = [], array $params = []) :int Добавляет сделку и возвращает ее ID.
  • updateDeal($dealId, array $fields = [], array $params = []) :int Обновляет сделку и возвращает ее ID.
  • deleteDeal($dealId) :int Удаляет сделку и возвращает ее ID.
  • getDealList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все сделки с возможностью фильтрации, сортировки и выборки полей.
  • fetchDealList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все сделки с возможностью фильтрации, сортировки и выборки полей.
    Реализует быстрый метод загрузки при работе с большими объемами данных.
  • addDeals(array $deals = [], array $params = []) :array
    Пакетно добавляет сделки со связанными товарными позициями, возвращает массив ID сделок.
  • updateDeals(array $deals = [], array $params = []) :array
    Пакетно обновляет сделки со связанными товарными позициями, возвращает массив ID сделок.
  • deleteDeals(array $dealIds = []) :array Пакетно удаляет сделки, возвращает массив ID сделок.
  • setDealFile($dealId, $userFieldId, string $fileName, string $fileContent, bool $isBase64FileData = true) :int
    Устанавливает файл в НЕ множественное пользовательское поле типа файл (файл нельзя удалить) и возвращает ID сделки.
  • setDealFiles($dealId, $userFieldId, array $files = [], bool $isBase64FileData = true) :int
    Устанавливает файлы во множественное пользовательское поле типа файл (файлы можно удалить) и возвращает ID сделки.
  • getDealContactItems($dealId) :array Возвращает массив параметров контактов, связанных со сделкой.
  • setDealContactItems($dealId, array $contacts) :array Устанавливает контакты, связанные со сделкой.
  • setDealProductRows($dealId, array $products) :array Устанавливает товарные позиции, связанные со сделкой.
  • getDealProductRows($dealId) :array Возвращает массив параметров товарных позиций, связанных со сделкой.
  • getDealFields() :array Возвращает описание полей сделки, в том числе пользовательских.

Параметры методов:

  • $dealId - ID сделки;
  • $dealIds - массив ID сделок;
  • $with - имена связанных сущностей, возвращаемых вместе со сделкой:
    • \App\Bitrix24\Bitrix24API::$WITH_CONTACTS - контакты (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством Bitrix24API::$WITH_CONTACTS);
    • \App\Bitrix24\Bitrix24API::$WITH_PRODUCTS - товарные позиции (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством Bitrix24API::$PRODUCTS);
  • $fields - набор полей сделки;
  • $params - набор параметров сделки;
  • $filter - параметры фильтрации;
  • $order - параметры сортировки;
  • $select - параметры выборки полей;
  • $userFieldId ID НЕ множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX');
  • $files - массив параметров файлов ([ [ , ], ... ]) (пустой массив для удаления всех файлов);
  • $isBase64FileData - RAW данные файла закодированы в BASE64?;
  • $contacts - массив параметров контактов;
  • $products - массив параметров товарных позиций.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Добавляем новую сделку
    $dealId = $bx24->addDeal([
        'TITLE'      => 'Новая сделка №1',
        'COMPANY_ID' => 6,
        'CONTACT_ID' => 312
    ]);
    print_r($dealId);

    // Устанавливаем набор связанных контактов
    $bx24->setDealContactItems($dealId, [
        [ 'CONTACT_ID' => 313 ],
        [ 'CONTACT_ID' => 454 ]
    ]);

    // Устанавливаем набор связанных товарных позиций
    $bx24->setDealProductRows($dealId, [
        [ 'PRODUCT_ID' => 1689, 'PRICE' => 1500.00, 'QUANTITY' => 2 ],
        [ 'PRODUCT_ID' => 1860, 'PRICE' => 500.00, 'QUANTITY' => 15 ]
    ]);

    // Обновляем существующую сделку
    $bx24->updateDeal($dealId, [
        'TITLE' => 'Новая сделка №12'
    ]);


    // При необходимости, изменяем значение по умолчанию 'PRODUCTS' на '_PRODUCTS' для имени поля
    // со списком товарных позиций, возвращаемых вместе со сделкой
    Bitrix24API::$WITH_PRODUCTS = '_PRODUCTS';

    // Загружаем сделку по ID вместе со связанными товарами и контактами одним запросом
    $deal = $bx24->getDeal($dealId, [ Bitrix24API::$WITH_PRODUCTS, Bitrix24API::$WITH_CONTACTS ]);
    print_r($deal);

    // Удаляем существующую сделку
    $bx24->deleteDeal($dealId);

    // Загружаем все сделки используя быстрый метод при работе с большими объемами данных
    $generator = $bx24->fetchDealList();
    foreach ($generator as $deals) {
        foreach($deals as $deal) {
            print_r($deal);
        }
    }

    // Пакетно добавляем сделки вместе с товарными позициями
    $dealIds = $bx24->addDeals([
        [
            'TITLE' => 'Новая сделка №1121',
            'COMPANY_ID' => 6,
            'CONTACT_ID' => 312,
            'PRODUCTS' => [
                [ "PRODUCT_ID" => 27, "PRICE" => 100.00, "QUANTITY" => 11 ],
            ]

        ],
        [
            'TITLE' => 'Новая сделка №1122',
            'COMPANY_ID' => 6,
            'PRODUCTS' => [
                [ "PRODUCT_ID" => 28, "PRICE" => 200.00, "QUANTITY" => 22 ],
                [ "PRODUCT_ID" => 27, "PRICE" => 200.00, "QUANTITY" => 11 ],
            ]
        ]
    ]);
    print_r($dealIds);

    // Пакетно удаляем сделки
    $bx24->deleteDeals($dealIds);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с контактами

Методы для работы с контактами находятся в трейте \App\Bitrix24\Contact:

  • getContact($contactId, array $with = []) :array Возвращает контакт по его ID.
  • addContact(array $fields = [], array $params = []) :int Добавляет контакт и возвращает его ID.
  • updateContact($contactId, array $fields = [], array $params = []) :int Обновляет контакт и возвращает его ID.
  • deleteContact($contactId) :int Удаляет контакт и возвращает его ID.
  • getContactList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все контакты с возможностью фильтрации, сортировки и выборки полей.
  • fetchContactList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все контакты с возможностью фильтрации, сортировки и выборки полей.
    Реализует быстрый метод загрузки при работе с большими объемами данных.
  • addContacts(array $contacts = [], array $params = []) :array Пакетно добавляет контакты.
  • updateContacts(array $contacts = [], array $params = []) :array Пакетно обновляет контакты.
  • deleteContacts(array $contactIds = []) :array Пакетно удаляет контакты.
  • getContactCompanyItems($contactId) :array Возвращает компании, связанные с контактом по ID.
  • setContactCompanyItems($contactId, array $companies) :array Устанавливает компании, связанные с контактом по ID.
  • getContactFields() :array Возвращает описание полей контакта.

Параметры методов:

  • $contaxctId - ID контакта;
  • $contactIds - массив ID сделок;
  • $with - имена связанных сущностей, возвращаемых вместе с контактом:
    • \App\Bitrix24\Bitrix24API::$WITH_COMPANIES - компании (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством Bitrix24API::$WITH_COMPANIES);
  • $fields - набор полей сделки;
  • $params - набор параметров сделки;
  • $filter - параметры фильтрации;
  • $order - параметры сортировки;
  • $select - параметры выборки полей;
  • $contacts - массив параметров контактов;
  • $companies - массив параметров компаний.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Добавляем новый контакт
    $contactId = $bx24->addContact([
        'NAME'        => 'Иван',
        'COMPANY_ID'  => 332,
        'SECOND_NAME' => 'Васильевич',
        'LAST_NAME'   => 'Петров'
    ]);
    print_r($contactId);

    // Устанавливаем набор связанных компаний
    $bx24->setContactCompanyItems($contactId, [
        [ 'COMPANY_ID' => 8483 ],
        [ 'CONPANY_ID' => 4094 ]
    ]);

    // Обновляем существующий контакт
    $bx24->updateContact($contactId, [
        'NAME' => 'Фёдор'
    ]);

    // Загружаем контакт по ID вместе со связанными компаниями
    $contact = $bx24->getContact($contactId, [ Bitrix24API::$WITH_COMPANIES ]);
    print_r($contact);

    // Удаляем существующий контакт
    $bx24->deleteContact($contactId);

    // Загружаем все контакты используя быстрый метод при работе с большими объемами данных
    $generator = $bx24->fetchContactList();
    foreach ($generator as $contacts) {
        foreach($contacts as $contact) {
            print_r($contact);
        }
    }

    // Пакетно добавляем контакты
    $contactIds = $bx24->addContacts([
        [
            'NAME'        => 'Владимир',
            'COMPANY_ID'  => 3322,
            'SECOND_NAME' => 'Вадимович',
            'LAST_NAME'   => 'Владимиров'
        ],
        [
            'NAME'        => 'Андрей',
            'COMPANY_ID'  => 1332,
            'SECOND_NAME' => 'Васильевич',
            'LAST_NAME'   => 'Иванов'
        ]
    ]);
    print_r($contactIds);

    // Пакетно удаляем контакты
    $bx24->deleteContacts($contactIds);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с компаниями

Методы для работы с компаниями находятся в трейте \App\Bitrix24\Company:

  • getCompany($companyId, array $with = []) Возвращает компанию по ID.
  • addCompany(array $fields = [], array $params = []) :int Добавляет компанию и возвращает ее ID.
  • updateCompany($companyId, array $fields = [], array $params = []) :int Обновляет компанию и возвращает ее ID.
  • deleteCompany($companyId) :int Удаляет компанию и возвращает ее ID.
  • getCompanyList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все компании с возможностью фильтрации, сортировки и выборки полей.
  • fetchCompanyList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все компании с возможностью фильтрации, сортировки и выборки полей.
    Реализует быстрый метод загрузки при работе с большими объемами данных.
  • addCompanies(array $companies = [], array $params = []) :array Пакетно добавляет компании.
  • updateCompanies(array $companies = [], array $params = []) :array Пакетно обновляет компании.
  • deleteCompanies(array $companyIds = []) :array Пакетно удаляет компании.
  • getCompanyContactItems($companyId) :array Возвращает контакты, связанные с компанией.
  • setCompanyContactItems($companyId, array $contacts) :array Устанавливает контакты, связанные с компанией.

Параметры методов:

  • $companyId - ID компании;
  • $companyIds - массив ID компаний;
  • $with - имена связанных сущностей, возвращаемых вместе с компанией:
    • \App\Bitrix24\Bitrix24API::$WITH_CONTACTS - контакты (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством Bitrix24API::$WITH_CONTACTS);
  • $filter - параметры фильтрации;
  • $order - параметры сортировки;
  • $select - параметры выборки полей;
  • $contacts - массив параметров контактов;
  • $companies - массив параметров компаний.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Добавляем новую компанию
    $companyId = $bx24->addCompany([
        'TITLE' => 'OOO Рога и Копыта'
    ]);
    print_r($companyId);

    // Устанавливаем набор связанных контактов
    $bx24->setCompanyContactItems($companyId, [
        [ 'CONTACT_ID' => 4838 ],
        [ 'CONTACT_ID' => 8583 ]
    ]);

    // Обновляем существующую компанию
    $bx24->updateCompany($companyId, [
        'TITLE' => 'ИП Рога и Копыта'
    ]);

    // Загружаем компанию по ID вместе со связанными контактами
    $company = $bx24->getCompany($companyId, [ Bitrix24API::$WITH_CONTACTS ]);
    print_r($company);

    // Удаляем существующую компанию
    $bx24->deleteCompany($companyId);

    // Загружаем все компании используя быстрый метод при работе с большими объемами данных
    $generator = $bx24->fetchCompanyList();
    foreach ($generator as $companies) {
        foreach($companies as $company) {
            print_r($company);
        }
    }

    // Пакетно добавляем компании
    $companyIds = $bx24->addCompanies([
        [ 'TITLE' => 'ПАО Абракадабра' ],
        [ 'TITLE' => 'ЗАО Моя компания' ]
    ]);
    print_r($companyIds);

    // Пакетно удаляем компании
    $bx24->deleteCompanies($companyIds);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с каталогами

Методы для работы с товарными каталогами находятся в трейте \App\Bitrix24\Catalog:

  • getCatalogList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все каталоги с возможностью фильтрации, сортировки и выборки полей.
  • fetchCatalogList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все каталоги с возможностью фильтрации, сортировки и выборки полей.
    Реализует быстрый метод загрузки при работе с большими объемами данных.
  • getCatalogFields() :array Возвращает описание полей каталога товаров.

Параметры методов:

  • $filter - параметры фильтрации;
  • $order - параметры сортировки;
  • $select - параметры выборки полей.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Загружаем все товарные каталоги используя быстрый метод при работе с большими объемами данных
    $generator = $bx24->fetchCatalogList();
    foreach ($generator as $catalogs) {
        foreach($catalogs as $catalog) {
            print_r($catalog);
        }
    }

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с товарами

Методы для работы с товарами находятся в трейте \App\Bitrix24\Product:

  • getProduct($productId) :array Возвращает товар по ID.
  • addProduct(array $fields = []) :int Добавляет товар и возвращает его ID.
  • updateProduct($productId, array $fields = []) :int Обовляет товар и возвращает его ID.
  • deleteProduct($productId) :int Удаляет товар и возвращает его ID.
  • getProductList(array $filter = [], array $select = [ '*', 'PROPERTY_*' ], array $order = []) :\Generator
    Загружает все товары с возможностью фильтрации, сортировки и выборки полей.
  • fetchProductList(array $filter = [], array $select = [ '*', 'PROPERTY_*' ], array $order = []) :\Generator
    Загружает все товары с возможностью фильтрации, сортировки и выборки полей.
    Реализует быстрый метод загрузки при работе с большими объемами данных.
  • addProducts(array $products = []) :array Пакетно добавляет товары.
  • updateProducts(array $products = []) :array Пакетно обновляет товары.
  • deleteProducts(array $productIds = []) :array Пакетно удаляет товары.
  • getProductFields() :array Возвращает описание полей товара, в том числе пользовательских.

Параметры методов:

  • $productId - ID товара.
  • $productIds - массив ID товаров.
  • $fields - набор полей товара.
  • $filter - параметры фильтрации;
  • $select - параметры выборки полей;
  • $order - параметры сортировки.
  • $products - массив наборов полей товара.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Получаем товар по его ID
    $product = $bx24->getProduct(2396);
    print_r($product);

    // Обновляем товар
    $bx24->updateProduct(2396, [
        "PRICE" => 4900
    ]);

    // Удаляем товар
    $bx24->deleteProduct(2396);

    // Загружаем все товары c фильтрацией по полю SECTION_ID
    $generator = $bx24->fetchProductList([ 'SECTION_ID' => 13 ]);
    foreach ($generator as $users) {
        foreach($users as $user) {
            print_r($user);
        }
    }
       
    // Пакетно обновляем товары
    $bx24->updateProducts([
        [   
            "ID"          => 27,
            "NAME"        => "Тестовый товар 11",
            "CURRENCY_ID" => "RUB",
            "PRICE"       => 4900,
            "SORT"        => 500,
            "SECTION_ID"  => 13
        ],
        [ 
            "ID"          => 28,
            "NAME"        => "Тестовый товар 12",
            "CURRENCY_ID" => "RUB",
            "PRICE"       => 900,
            "SORT"        => 100,
            "SECTION_ID"  => 13
        ],
        [
            "ID"          => 29,
            "NAME"        => "Тестовый товар 13",
            "CURRENCY_ID" => "RUB",
            "PRICE"       => 2900,
            "SORT"        => 300,
            "SECTION_ID"  => 13
        ]
    ]);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы работы с разделами товаров

Методы для работы с разделами товаров находятся в трейте \App\Bitrix24\ProductSection:

  • getProductSection($productSectionId) :array Возвращает раздел товаров по ID.
  • addProductSection(array $fields = []) :int Добавляет раздел товаров и возвращает его ID.
  • updateProductSection($productSectionId, array $fields = []): int Обновляет раздел товаров и возвращает его ID.
  • deleteProductSection($productSectionId) :int Удаляет раздел товаров и возвращает его ID.
  • getProductSectionList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все разделы товаров с возможностью фильтрации, сортировки и выборки полей.
  • fetchProductSectionList(array $filter = [], array $select = [], array $order = []) :\Generator
    Загружает все разделы товаров с возможностью фильтрации, сортировки и выборки полей. Реализует быстрый метод загрузки при работе с большими объемами данных.
  • addProductSections(array $productSections = []) :array Пакетно добавляет разделы товаров.
  • updateProductSections(array $productSections = []) :array Пакетно обновляет разделы товаров.
  • deleteProducts(array $productSectionIds = []) :array Пакетно удаляет разделы товаров.
  • getProductSectionFields() :array Возвращает описание полей раздела товара.

Параметры методов:

  • $productSectionId - ID раздела товаров;
  • $productSectionIds - массив ID разделов товаров;
  • $fields - набор полей раздела товаров;
  • $filter - параметры фильтрации;
  • $select - параметры выборки полей;
  • $order - параметры сортировки.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Получаем раздел товаров по его ID
    $productSection = $bx24->getProductSection(16);
    print_r($productSection);

    // Обновляем раздел товаров
    $bx24->updateProductSection(16, [
        'NAME' => 'Раздел товаров 1'
    ]);

    // Удаляем раздел товаров
    $bx24->deleteProductSection(16);

    // Загружаем все разделы товаров c фильтрацией по полю CATALOG_ID
    $generator = $bx24->fetchProductSectionList([ 'CATALOG_ID' => 2 ]);
    foreach ($generator as $productSections) {
        foreach($productSections as $productSection) {
            print_r($productSection);
        }
    }
      
    // Пакетно добавляем разделы товаров
    $productSectionIds = $bx24->addProductSections([
        [   
            "NAME"       => "Раздел товаров 3",
            'CATALOG_ID' => 2
        ],
        [   
            "NAME"       => "Раздел товаров 4",
            'CATALOG_ID' => 2
        ]
    ]);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы работы с товарными позициями

Методы для работы с товарными позициями находятся в трейте \App\Bitrix24\ProductRow:

  • getProductRowFields() :array Возвращает описание полей товарных позиций.

Методы для работы с пользователями

Методы для работы с пользователями находятся в трейте \App\Bitrix24\User:

  • getUser($userId) ?:array Возвращает пользователя по ID.
  • getUsers(array $filter = [], string $order = 'ASC', string $sort = '', bool $adminMode = false) :\Generator
    Загружает всех пользователей с возможностью фильтрации, сортировки и выборки полей.
  • getUserFields() :array Возвращает описание полей пользователя.

Параметры методов:

  • $userId - ID пользователя;
  • $filter - параметры фильтрации;
  • $order - направление сортировки (ASC|DESC);
  • $sort - поле, по которому сортируются результаты;
  • $select - параметры выборки полей;
  • $adminMode - включает режим администратора для получения данных о любых пользователях.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Получаем пользователя по ID
    $user = $bx24->getUser(34782);
    print_r($user);

    // Получаем всех пользователей типа сотрудник с сортировкой по имени
    $generator = $bx24->getUsers(
        [ 'USER_TYPE' => 'employee' ],
        $order = 'ASC',
        $sort = 'NAME' 
    );
    foreach ($generator as $users) {
        foreach($users as $user) {
            print_r($user);
        }
    }

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы работы с задачами

Методы для работы с задачами находятся в трейте \App\Bitrix24\Task:

  • getTask($taskId, array $select = []) :?array Возвращает задачу по ID.
  • addTask(array $fields = []) :int Добавляет новую задачу.
  • addTasks(array $tasks = []) :array Пакетно добавляет задачи.
  • getTaskFields() :array Возвращает описание полей задачи.

Параметры методов:

  • $taskId - ID задачи;
  • $select - параметры выборки полей;
  • $fields - набор полей задачи;
  • $tasks - массив наборов полей задач.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Получаем задачу по ID
    $task = $bx24->getTask(4325);
    print_r($task);

    // Создаем новую задачу
    $taskId = $bx24->addTask([
        'TITLE'           => 'Новая задача №123', // Название задачи
        'DESCRIPTION'     => 'Описание задачи', // Описание задачи
        'RESPONSIBLE_ID'  => 43242, // ID ответственного пользователя
        'UF_CRM_TASK'     => [ 'D_' . 38492 ], // Привязка задачи к сделке ('D_' - сущность сделка, 38492 - ID сделки)
        'START_DATE_PLAN' => '09.08.2005', // Плановая дата начала.
        'END_DATE_PLAN'   => '09.09.2005', // Плановая дата завершения
        'DEADLINE'        => '2005-09-09T18:31:42+03:30' // Крайний срок
    ]);
    print_r($taskId);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с делами

Методы для работы с делами (активностями) находятся в трейте \App\Bitrix24\Activity:

  • getActivity($activityId) :?array Возвращает дело по ID.
  • addActivity(array $fields = []) :int Создает новое дело и возвращает его ID.
  • addActivities(array $activities = []) :array Пакетно создает дела.
  • getActivityFields() :array Возвращает описание полей дела.

Параметры методов:

  • $activityId - ID дела;
  • $fields - набор полей дела;
  • $activities - массив наборов полей дел.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Добавляем новое дело типа письмо
    $activityId = $bx24->addActivity([
        'SUBJECT'          => 'Заголовок письма', // Email subject
        'DESCRIPTION'      => 'Описание активности', // Email body
        'DESCRIPTION_TYPE' => 2, // Тип тела email: 1- Plain text, 2 - bbCode, 3 - HTML (crm.enum.contenttype)
        'COMPLETED'        => 'N', // Флаг немедленной отправки: Y|N
        'DIRECTION'        => 2, // Направление: 1 - входящее, 2 - исходящее (crm.enum.activitydirection)
        'OWNER_TYPE_ID'    => 2, // Тип сущности: 2 - Сделка, 3 - контакт, 4 - Компания,... (crm.enum.ownertype)
        'OWNER_ID'         => 39293, // ID сущности (сделки)
        'TYPE_ID'          => 4, // Тип активности: 4 - Письмо (crm.enum.activitytype)
        'RESPONSIBLE_ID'   => 4852, // ID ответственного пользователя
        'START_TIME'       => '2005-08-09T18:31:42+03:30', // Время начала
        'END_TIME'         => '2005-09-10T18:31:42+03:30', // Время окончания
        'COMMUNICATIONS' => [ // Параметры получателей письма
            [
                'VALUE'          => 'test@example.com', // Email компании
                'ENTITY_ID'      => 58938, // ID компании
                'ENTITY_TYPE_ID' => 4 // Тип сущности: 4 - Компания ('crm.enum.ownertype');
            ]
        ],
        'SETTINGS' => [
            'MESSAGE_FROM' => 'from@example.com'
        ]
    ]);
    print_r($activityId);

    // Получаем дело по ID
    $activity = $bx24->getActivity($activityId);
    print_r($activity);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с диском

Методы для работы с Диском находятся в трейте \App\Bitrix24\Disk:

  • getDiskStorageList(array $filter = []) :\Generator
    Загружает список доступных хранилищ с возможностью фильтрации.
  • getDiskStorageChildren($storageId, array $filter = []) :array
    Возвращает список файлов и папок, которые находятся непосредственно в корне хранилища с возможностью фильтрации.
  • uploadfileDiskFolder($folderId, string $fileContent, array $data, bool $isBase64FileData = true) :array Загружает новый файл в указанную папку на Диск.

Параметры методов:

  • $filter - параметры фильтрации;
  • $storageId - ID хранилища;
  • $filter - параметры фильтрации;
  • $folderId - ID папки;
  • $fileContent - RAW данные файла;
  • $data - набор параметров, описывающих файл (обязательное поле NAME - имя нового файла);
  • $isBase64FileData - RAW данные файла закодированы в BASE64?
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Загружаем список доступных хранилищ
    $generator = $bx24->getDiskStorageList();
    foreach ($generator as $storages) {
        foreach ($storages as $storage) {
            print_r($storage);
        }
    }

    // Загружаем список файлов и папок, которые находятся непосредственно в корне хранилища
    $files = $bx24->getDiskStorageChildren($storageId = 2);
    foreach ($files as $file) {
        print_r($file);
    }

    // Загружаем файл в указанную папку на Диск
    $bx24->uploadfileDiskFolder(
        $filderId = 4709,
        $rawFile = file_get_contents('./schet.pdf'),
        [ 'NAME' => 'schet.pdf' ],
        $isBase64FileData = false
    );

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Методы для работы с лидами

Методы для работы с лидами находятся в трейте \App\Bitrix24\Lead:

  • getLeadFields() :array Возвращает описание полей лида, в том числе пользовательских.
  • getLead($leadId, array $with = []) :array Возвращает лид по его ID.
  • addLead(array $fields = [], array $params = []) :int Добавляет лид и возвращает его ID.
  • updateLead($leadId, array $fields = [], array $params = []) :int Обновляет лид и возвращает его ID.
  • deleteLead($leadId) :int Удаляет лид по его ID.
  • getLeadList(array $filter = [], array $select = [], array $order = []): Generator
    Загружает все лиды с возможностью фильтрации, сортировки и выборки полей.
  • fetchLeadList(array $filter = [], array $select = [], array $order = []): Generator
    Загружает все лиды с возможностью фильтрации, сортировки и выборки полей.
    Реализует быстрый метод загрузки при работе с большими объемами данных.
  • getLeadProductRows($leadId) :array Возвращает массив параметров товарных позиций, связанных с лидом.
  • setLeadProductRows($leadId, array $products) :array Устанавливает товарные позиции, связанные с лидом.

Параметры методов:

  • $leadId - ID лида;
  • $with - имена связанных сущностей, возвращаемых вместе с лидом:
    • \App\Bitrix24\Bitrix24API::$WITH_PRODUCTS - товарные позиции (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством Bitrix24API::$PRODUCTS);
  • $fields - набор полей лида;
  • $params - набор параметров лида;
  • $filter - параметры фильтрации;
  • $order - параметры сортировки;
  • $select - параметры выборки полей;
  • $products - массив параметров товарных позиций.
use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;

try {

    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Добавляем новый лид
    $leadId = $bx24->addLead([
        'TITLE'      => 'Новый лид №1'
    ]);
    print_r($leadId);

    // Устанавливаем набор связанных товарных позиций
    $bx24->setLeadProductRows($leadId, [
        [ 'PRODUCT_ID' => 1689, 'PRICE' => 1500.00, 'QUANTITY' => 2 ],
        [ 'PRODUCT_ID' => 1860, 'PRICE' => 500.00, 'QUANTITY' => 15 ]
    ]);

    // Обновляем существующий лид
    $bx24->updateLead($leadId [
        'TITLE' => 'Новый лид №12'
    ]);

    // При необходимости, изменяем значение по умолчанию 'PRODUCTS' на '_PRODUCTS' для имени поля
    // со списком товарных позиций, возвращаемых вместе с лидом
    Bitrix24API::$WITH_PRODUCTS = '_PRODUCTS';

    // Загружаем лид по ID вместе со связанными товарными позициями
    $lead = $bx24->getLead($leadId, [ Bitrix24API::$WITH_PRODUCTS ]);
    print_r($lead);

    // Удаляем существующий лид
    $bx24->deleteLead($leadId);

    // Загружаем все лиды используя быстрый метод при работе с большими объемами данных
    $generator = $bx24->fetchLeadList();
    foreach ($generator as $leads) {
        foreach($leads as $lead) {
            print_r($lead);
        }
    }

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}    

Вспомогательные классы

Класс HTTP

Класс \App\HTTP\НТТР обеспечивает:

  • формирование POST запросов к API Битрикс 24 по протоколу HTTPS;
  • троттлинг запросов к API на требуемом уровне - не более 2-х запросов в секунду;
  • вывод отладочной информации о запросах к API в STDOUT.

При возникновении ошибок выбрасывается исключение класса \App\HTTP\HTTPException.

Дополнительные параметры

Дополнительные параметры устанавливаются через публичные свойства объекта класса \App\HTTP\HTTP:

Свойство По умолчанию Описание
$debugLevel \App\HTTP\HTTP::DEBUG_NONE Устанавливает уровень вывода отладочной информации о запросах в STDOUT (битовая маска, составляемая из значений DEBUG_NONE, DEBUG_URL, DEBUG_HEADERS, DEBUG_CONTENT)
$throttle 0 Максимальное число HTTP запросов в секунду (0 - троттлинг отключен)
$addBOM false Добавлять маркер ВОМ UTF-8 (EFBBBF) к запросам в формате JSON
$useCookies false Использовать cookies в запросах
$cookieFile 'temp/cookies.txt' Путь к файлу для хранения cookies
$verifySSLCertificate true Включить проверку SSL/TLS-сертификата сервера
$SSLCertificateFile 'cacert.pem' Устанавливает файл SSL/TLS-сертификатов X.509 корневых удостоверяющих центров (CA) в формате РЕМ (установка в null означает использовать файл, указанный в параметре curl.cainfo файла php.ini)
$userAgent 'HTTP-client/3.x.x' Устанавливает НТТР заголовок UserAgent в запросах
$curlConnectTimeout 60 Устанавливает таймаут соединения, секунды
$curlTimeout 60 Устанавливает таймаут обмена данными, секунды
$successStatusCodes [ 200 ] Коды статуса НТТР, соответствующие успешному выполнению запроса

Примеры

use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;
use App\HTTP\HTTP;

try {
    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Устанавливаем максимальный уровень вывода отладочных сообщений в STDOUT
    $bx24->http->debugLevel = HTTP::DEBUG_URL |  HTTP::DEBUG_HEADERS | HTTP::DEBUG_CONTENT;

    // Устанавливаем троттлинг запросов на уровне не более 1 запроса в 2 секунды
    $bx24->http->throttle = 0.5;

    // Устанавливаем таймаут обмена данными в 30 секунд
    $bx24->http->curlTimeout = 30;

    // Получаем компанию по ID
    $results = $bx24->getCompany(20);

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Примеры отладочных сообщений:

[1] ===> POST https://www.example.com/rest/1/u7ngxagzrhpuj31a/crm.company.get.json
POST rest/1/u7ngxagzrhpuj31a/crm.company.get.json HTTP/1.1
Host: www.example.com
User-Agent: HTTP-client/2.x.x
Accept: */*
Content-Length: 5
Content-Type: application/x-www-form-urlencoded

id=20

[1] 

Класс DebugLogger

Класс \App\DebugLogger\DebugLogger обеспечивает логирование запросов и ответов к API Битрикс24 в файл.
При возникновении ошибок выбрасывается исключение класса \App\DebugLogger\DebugLoggerException.

Методы класса

  • static instance(string $logFileName = 'debug.log') :self
    Возвращает единственный объект данного класса для заданного лог-файла $logFileName.
    • $logFileName - имя лог-файла.
  • save(mixed $info, object $object = null, string $header = null) :void Сохраняет подлежащую логированию информацию в файл.
    • $info - строка, массив или объект для логирования;
    • $object - ссылка на объект класса в котором выполняется логирование;
    • $header - строка заголовка для сохраняемой в лог файл информации.

Дополнительные параметры

Дополнительные параметры устанавливаются через публичные свойства класса \App\DebugLogger\DebugLogger:

Нестатическое свойство По умолчанию Описание
$isActive false Включает или выключает логирование для конкретного файла, задаваемого параметром $logFileName метода instance()
Статическое свойство По умолчанию Описание
$logFileDir temp/ Устанавливает каталог, в котором сохраняются лог-файлы
mkdirMode 0755 Устанавливает режим доступа для создаваемых каталогов для хранения лог файлов в виде восьмеричного числа
$uniqIdLength 7 Длина уникального буквенно-цифрового [a-z0-9]+ идентификатора объекта класса DebugLogger для сохранения в лог файле, позволяющего находить записи, созданные одним и тем же процессом

Примеры

use App\Bitrix24\Bitrix24API;
use App\Bitrix24\Bitrix24APIException;
use App\DebugLogger\DebugLogger;

try {
    $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
    $bx24 = new Bitrix24API($webhookURL);

    // Устанавливаем каталог для сохранения лог файлов
    DebugLogger::$logFileDir = 'logs/';

    // Создаем объект класса логгера
    $logFileName = 'debug_bitrix24api.log';
    $logger = DebugLogger::instance($logFileName);

    // Включаем логирование
    $logger->isActive = true;

    // Устанавливаем логгер
    $bx24->setLogger($logger);

    // Загружаем все компании
    $bx24->fetchCompanyList();

} catch (Bitrix24APIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Пример результатов логирования:

*** 92qshr5 [2020-06-14 13:32:44.993285 +00:00 Δ0.012308 s, 0.70/2.00 MiB] ********************
* Class: App\Bitrix24\Bitrix24API
ЗАПРОС: crm.company.list.json
{
    "order": {
        "ID": "ASC"
    },
    "filter": {
        ">ID": 0
    },
    "select": [],
    "start": -1
}


*** 92qshr5 [2020-06-14 13:32:46.900518 +00:00 Δ1.907233 s, 1.14/2.00 MiB] ********************
ОТВЕТ: crm.company.list.json
{
    "result": [
        {
            "ID": "2",
            "COMPANY_TYPE": "PARTNER",
            "TITLE": "ООО",
            "LOGO": {
                "id": 112,
                "showUrl": "\/bitrix\/components\/bitrix\/crm.company.show\/show_file.php?ownerId=2",
                "downloadUrl": "\/bitrix\/components\/bitrix\/crm.company.show\/show_file.php?auth=&ownerId=2"
            }
        }
    }
}

*** 92qshr5 [2020-06-14 13:32:46.902085 +00:00 Δ0.001567 s, 1.30/2.00 MiB] ********************
* Class: App\Bitrix24\Bitrix24API
По запросу (fetchList) crm.company.list получено сущностей: 50, всего получено: 50
Формат заголовков лога
*** 92qshr5 [2020-06-14 13:32:46.902085 +00:00 Δ0.001567 s, 1.30/2.00 MiB] ********************
* Class: App\Bitrix24\Bitrix24API
  • 92qshr5 - уникальный буквенно-цифровой [a-z0-9]+ идентификатор объекта класса DebugLogger, позволяющий находить в лог файле записи, созданные одним и тем же процессом;
  • 2020-06-14 13:32:46.902085 - дата и время сохранения информации с точностью до микросекунд;
  • Δ0.001567 s - время, прошедшее с момента предыдущего сохранения информации в секундах и микросекундах;
  • 1.30/2.00 MiB - данные об используемой оперативной памяти в единицах количества информации с двоичными приставками:
    • 1.30 - максимальный объем памяти, который был выделен PHP-скрипту системой;
    • 2.00 - реальный объем памяти, выделенный PHP-скрипту системой;
  • 'Class: App\Bitrix24\Bitrix24API' - полное имя класса из которого сделано сохранение в лог файл.

Автор

© 2019-2021 andrey-tech

Что такое PHP Composer

Composer – это пакетный менеджер зависимостей, предназначенный для упрощения загрузки и установки сторонних php библиотек в проект. Например, с помощью него можно очень просто добавить в разрабатываемый проект php пакеты, а также развернуть другие проекты, которые распространяются вместе с файлом «composer.json».

«composer.json» - это текстовый файл, в котором в формате JSON описаны все сторонние пакеты от которых зависит данный проект.

Например, для того чтобы в некоторый разрабатываемый проект добавить сторонние библиотеки, в нём можно просто создать «composer.json» и описать в этом файле все необходимые зависимости. После этого для установки всех требуемых внешних php пакетов в проект достаточно будет ввести в консоли всего одну команду (composer install).

Другой вариант заключается в применении команды require. В этом случае самостоятельно создавать файл «composer.json» не нужно. composer require – это команда для установки php пакетов в проект посредством Composer. Кроме установки данная команда также автоматически его пропишет в файл «composer.json». В дальнейшем для того, чтобы скопировать этот проект, например на другой компьютер, вам не нужно будет переносить туда все внешние пакеты, достаточно будет переместить туда только файл «composer.json». Установка всех зависимостей на этом компьютере будет осуществляться уже посредством ввода всего одной команды (composer install).

При использовании команды require, она ещё выполняет создание файла «composer.json», если его ещё в нет проекте.

Кроме этого, Composer применяется не только для установки php библиотек. С помощью Composer осуществляется также установка различных php фреймворков (Laravel, Yii2, Symfony и др.) и CMS (Drupal, MODX 3 и др.).

Composer представляет собой обычный php скрипт, т.е. программу, написанную на языке php.

Основная цель этой программы заключается в том, чтобы предоставить веб-разработчику удобный инструмент, с помощью которого он сможет очень просто загружать и устанавливать пакеты в проект, их обновлять, а также при необходимости осуществлять их удаление. Все эти действия Composer позволяет выполнить с помощью ввода всего одной или нескольких команд. Удобно, не правда ли?

В качестве репозитория пакетов Composer по умолчанию использует packagist.org.

При установке php пакетов Composer не просто устанавливает их, он также устанавливает все зависимости, от которых эти пакеты зависят. Т.е., например, если загружаемая библиотека будет зависеть от 3 других пакетов, а каждая из них, ещё в свою очередь от нескольких и так далее, то Composer всё это установит автоматически. В противном случае, т.е. без использования Composer, загрузку и установку основных пакетов, а также всех зависимостей придётся выполнять самостоятельно.

Загрузку сторонних библиотек Composer выполняет в папку «vendor», которую данный php скрипт создаёт в корневой директории проекта. Кроме этого, он ещё создаёт специальный файл «autoload.php», включив который в проект вы сразу же подключите к нему все ранее загруженные им библиотеки.

require "path/to/vendor/autoload.php"; 

Дополнительно при загрузке сторонних библиотек Composer генерирует ещё файл «composer.lock». Если «composer.json» - это главный файл Composer, в котором содержится описание основных пакетов, включая требования к их версиям, то «composer.lock» - это файл, содержащий уже не требования, а реальные версии пакетов, которые им были установлены на компьютер пользователя.

Основное назначение файла «composer.lock» заключается в полном сохранении среды, в которой осуществлялась разработка и тестирование проекта.

Например, если вы захотите скопировать проект в какое-то другое место без переноса файла «composer.lock», то выполнив в нём команду composer install, вы можете получить другие версии пакетов. Эта может случиться из-за выхода новых версий как основных пакетов, описанных в файле «composer.json», так и их зависимостей, зависимостей их зависимостей и т.д. Например, представим что выход новых версий основных пакетов не произошёл, но обновились версии у пакетов, от которых зависят основные пакеты. В результате установки работающего проекта, можем получить неработоспособный, если в какой-нибудь новой версии одного из этих пакетов была допущена ошибка. Поэтому если вы хотите сохранить полностью среду, то при копировании проекта необходимо дополнительно включать в проект файл «composer.lock».

Например, разворачивая проект на production, включающий в себя файл «composer.lock», вы получите те же версии зависимостей, которые у вас были при разработке и тестировании.

Работа с Composer осуществляется в основном в консольном или терминальном режиме, т.е. с помощью ввода команд через командную строку.

Официальный сайт Composer расположен по адресу https://getcomposer.org

Если вы использовали npm, то Сomposer – это нечто подобное, только не для «node.js», а для php.

Как установить Composer

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

Установка Composer в Ubuntu, выполняющейся в подсистеме Windows для Linux (WSL)

Как установить локальный веб-сервер для разработки php проектов на подсистему Windows для Linux в Windows 10 можете ознакомиться в этой статье.

Для установки Composer в Windows 10 на подсистему Windows для Linux (WSL) необходимо выполнить следующие команды:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php
php -r "unlink ('composer-setup.php');"  

Первая команда выполняет загрузку скрипта установщика с сайта «getcomposer.org». Вторая команда выполняет запуск этого установщика. В процессе своей работы установщик проверит некоторые настройки «php.ini», предупредит вас, если они установлены неправильно, а затем загрузит последний «composer.phar» в текущий каталог. Последняя или третья команда просто удалит загруженный установщик, который ранее использовался для установки Composer.

Phar — это исполняемые файлы (программы), которые выполняются посредством php интерпретатора.

Если при установке php пакетов у вас выводиться ошибки на отсутствие прав записи в каталог «~/.composer/cache», то в командной строке просто запустите данную команду:

sudo chmod -R a+rw ~/.composer/cache

Для установки Composer глобально, т.е. чтобы он был доступен с помощью команды composer необходимо дополнительно выполнить ещё следующую команду:

mv composer.phar /usr/local/bin/composer

Эта команда переместит файл «composer.phar» из директории пользователя в директорию «/usr/local/bin» и уберёт у него расширение «phar».

Установка Composer на OpenServer (в Windows)

В OpenServer по умолчанию уже установлен Composer. Находится он в зависимости от выбранной версии PHP (устанавливается в настройках OpenServer) в директории «OSPanel\modules\PHP_*\».

Работа с Composer в OpenServer по умолчанию осуществляется в собственной консоли. Для того чтобы открыть эту консоль необходимо нажать на значок Open Server правой кнопкой мыши в области уведомлений и в открывшемся контекстном меню найти соответствующий пункт.

В консоли для проверки того, что Composer подключен, например, можно ввести команду:

composer

Эта команда также отобразит версию Composer.

Если при выполнении этой команды отобразится сообщение, что версия Composer устарела, то её можно обновить. Осуществляется это посредством выполнения следующей команды:

composer self-update

Установка Composer на хостинг

Для установки Composer на хостинг, можно просто скачать данную программу самостоятельно, а затем загрузить её в корневую директорию проекта, например, с помощью FTP.

Самостоятельная загрузка нужной версии Composer выполняется со страницы «Download». Версии программы на данной странице расположены в разделе «Manual Download».

Выполнение команд на удалённом сервере обычно осуществляют с помощью SSH. По умолчанию на shared хостингах данный сетевой протокол выключен. Для его включения необходимо найти соответствующий пункт в панели управления, открыть его и нажать в нем на кнопку «Включить SSH».

Если вы пользователь Windows 10, то клиент SSH включен в систему по умолчанию. Поэтому для выполнения команд на удаленном сервере, можно в этой версии Windows не устанавливать никакой дополнительный софт, а например, воспользоваться программой «Командная строка» или «Windows PowerShell».

Например:

ssh -l логин ip_адрес_сервера
cd public_html/blog
php7.1 composer.phar -v

Основные команды Composer

Разберем основные команды Composer для начинающих.

Если вы используете «composer.phar» локально, то приведённые команды необходимо соответственно изменить в зависимости от того как настроено ваше окружение.

Например, если файл «composer.phar» находится в текущем каталоге и интерпретатор php доступен без указания пути к нему, то установка пакета будет осуществляться так:

php composer.phar require vendor/package

Установка пакета

Установка пакета через Composer осуществляется посредством выполнения следующей команды:

composer require vendor/package

vendor — это имя поставщика php пакета, а package — это его название.

Например, добавление в проект пакета twig через composer будет осуществляться так:

composer require "twig/twig:^2.0"

Команда require не только загрузит требуемую библиотеку в проект, но и пропишет её ещё в файле «composer.json», т.е. обновит его. Если устанавливаемый пакет зависит от других библиотек, то они также будут установлены или обновлены. Кроме этого ещё будет обновлён файл «composer.lock».

Установка всех пакетов в проект

Установка сразу всех пакетов в проект осуществляется посредством команды:

composer install

Эта команда работает следующим образом:

  • проверяет, имеется ли файл «composer.lock»;
  • если файл «composer.lock» существует, то устанавливает версии, указанные в нём;
  • если файла «composer.lock» нет, то разрешает зависимости, описанные в файле «composer.json», создаёт файл «composer.lock» и устанавливает зависимости.

Обновление зависимостей

Команда для обновления установленных библиотек:

composer update

Эта команда обновит все зависимости установленные в проекте до последних версий (в соответствии с «composer.json») и файл «composer.lock».

Если необходимо обновить не все пакеты, а один или несколько, то их необходимо перечислить через пробел.

Команда для обновления одной библиотеки:

composer update vendor/package

Удаление пакета

Команда Composer для удаления пакета из проекта:

composer remove vendor/package

Для удаления одновременно нескольких пакетов можете их перечислить через пробел:

composer remove vendor/package vendor2/package2

Обновление Composer

Команда для обновления Сomposer до последней версии:

composer self-update

Обновление lock файла без обновления пакетов

Для обновления файла «composer.lock» без обновления самих пакетов:

composer update --lock

Создать новый проект

Создание нового проекта из указанного пакета в текущую директорию выполняется так:

composer create-project vendor/package

Создание нового проекта в указанную директорию выполняется так:

composer create-project vendor/package folder

Вывод всех установленных библиотек

Команда для отображения всех установленных php пакетов:

composer show

Проверка валидности файла «composer.json»

Команда с помощью которой можно проверить валидность файла «composer.json»:

composer validate

Вывод списка всех доступных команд

Вывести на экран все доступные команды Composer можно так:

composer list

Очистка внутреннего кэша пакетов Composer

Выполнение очистки внутреннего кэша пакетов Composer осуществляется с помощью команды:

composer clear-cache

Получение подробной справки по команде

Вывод подробной справки по команде:

composer help имя_команды

Например, вывести подробную инструкцию по использованию команды require можно следующим образом:

composer help require

Вывести зависимости для указанного пакета

Вывести все зависимости указанного пакета от других можно с помощью команды:

composer depends vendor/package

Создание базового варианта файла composer.json с помощью мастера

Создание базового варианта файла composer.json с помощью мастера, т.е. посредством ответов на вопросы:

composer init

Примеры использования Composer для установки PHP фреймворков и CMS

Установка фреймворка Laravel в текущую директорию осуществляется через Composer посредством ввода следующей команды:

composer create-project --prefer-dist laravel/laravel

Установка последней версии фреймворка Yii2 через Composer:

composer create-project --prefer-dist yiisoft/yii2-app-basic

Установка разрабатываемой версии MODX Revolution 3 через Composer:

composer create-project modx/revolution www 3.x-dev

Установка через Composer нового приложения Symfony, предназначенного для создания традиционных веб-приложений:

composer create-project symfony/website-skeleton

Установка Symfony для использования его для создания микросервисов, консольных приложений или API осуществляется так:

composer create-project symfony/skeleton

Установка Drupal через Composer:

composer create-project drupal-composer/drupal-project:8.x-dev --no-interaction

Clear Cache in Laravel (Terminal)

Log in to the system running your Laravel application and open a terminal. Then navigate to your Laravel application code. Here you can issue the commands to clear the cache as follows:

  1. Clear Application Cache

    Run the following command to clear the application cache of the Laravel application.

    php artisan cache:clear
    
  2. Clear Route Cache

    To clear the route cache of your Laravel application execute the following command from the shell.

    php artisan route:clear
    
  3. Clear Configuration Cache

    You can use config:clear to clear the config cache of the Laravel application.

    php artisan config:clear
    
  4. Clear Compiled Views Cache

    Also, you may need to clear compiled view files of your Laravel application. To clear compiled view files run the following command from the terminal.

    php artisan view:clear
    

Clear Cache in Laravel (Browser)

Most of the shared hosting providers don’t provide SSH access to the systems. In that case, you can clear the Laravel cache by calling the URL in the browser. You can simply place the below code in your routes/web.php file of the Laravel application. Then access this URL in the browser to clear the cache of the Laravel application.

Route::get('/clear-cache', function() {

    Artisan::call('cache:clear');

    return "Cache is cleared";

});