Организация общих PHP-библиотек: каталог /usr/share/php
Назначение и базовое использование /usr/share/php
Как сделать так, чтобы все PHP-скрипты в системе могли использовать одни и те же библиотеки из единого каталога?
Директория /usr/share/php является стандартным местом для установки общесистемных PHP-библиотек, не привязанных к конкретному проекту. Основной способ её использования – включение в include_path в файле php.ini.
Шаги по настройке:
- Открыть файл
php.ini(обычно/etc/php/8.x/cli/php.iniдля CLI или/etc/php/8.x/apache2/php.iniдля Apache). - Найти параметр
include_pathи добавить в него путь:/usr/share/php(если его там нет). Пример:
include_path = ".:./inc:/usr/share/php" - Перезапустить веб-сервер (например,
sudo systemctl restart apache2). - Теперь можно использовать любые библиотеки, установленные в
/usr/share/php, черезrequire_onceбез указания полного пути.
Типичные ошибки и способы их решения:
- Библиотека не найдена – проверьте, что файл действительно находится в
/usr/share/phpи имеет правильные права доступа (обычно644для файлов,755для директорий). Используйтеsudo find /usr/share/php -name "*.php"для поиска. - Конфликт версий библиотек – если одинаковые классы определены в разных местах, приведите
include_pathк единому порядку. Лучше использовать автозагрузку с помощью Composer.
Альтернативные варианты работы с /usr/share/php
Как установить библиотеку из репозитория системы, чтобы она попала в /usr/share/php?
Большинство дистрибутивов Linux предоставляют пакеты PHP-библиотек через свои менеджеры. Например, для Ubuntu/Debian:
sudo apt update
sudo apt install php-mysql php-xml php-mbstring
Эти пакеты часто размещают свои файлы в /usr/share/php. После установки библиотеки доступны всем скриптам. Если библиотека не установлена, вы получите ошибку class not found.
Проблема: пакет установлен, но класс не найден.
Проверьте, что модуль загружен PHP (команда php -m). Если модуль отключён, включите его через phpenmod или вручную в php.ini.
Как использовать /usr/share/php для собственных скриптов без изменения php.ini?
Можно временно добавить путь в сам скрипт через функцию set_include_path():
set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/share/php');
require_once 'MyLibrary/MyClass.php';
Этот способ удобен для тестирования или в изолированных сценариях.
Как организовать автозагрузку классов из /usr/share/php с помощью Composer?
Если ваша библиотека использует PSR-4 или PSR-0, можно добавить её в файл composer.json проекта:
{
"autoload": {
"psr-4": {
"MyLibrary\\": "/usr/share/php/MyLibrary/"
}
}
}
Затем выполнить composer dump-autoload. Однако такой подход не рекомендуется для production, так как нарушает изоляцию проекта. Лучше использовать composer require для зависимостей.
Расширенные примеры работы с /usr/share/php
Пример 1: Поиск всех PHP-файлов в /usr/share/php
find /usr/share/php -type f -name "*.php" 2>/dev/null | head -20
Результат (пример):
/usr/share/php/Date/Holidays.php /usr/share/php/Date/Holidays/Driver.php /usr/share/php/PEAR.php /usr/share/php/PEAR/ErrorStack.php /usr/share/php/PEAR/Register.php
Пример 2: Написание простого скрипта с использованием библиотеки из /usr/share/php
Предположим, установлена библиотека PEAR. Создадим скрипт test_pear.php:
<?php
require_once 'PEAR.php'; // файл /usr/share/php/PEAR.php уже в include_path
echo "PEAR класс загружен: " . class_exists('PEAR') ? 'да' : 'нет';
?>
Выполнение:
php test_pear.php PEAR класс загружен: да
Пример 3: Установка PHP-библиотеки через apt и проверка include_path
sudo apt install php-pear
php -r "echo get_include_path();"
Возможный вывод (при условии, что /usr/share/php уже прописан):
.:/usr/share/php
Пример 4: Добавление каталога /usr/share/php только для одного скрипта через .htaccess (Apache)
php_value include_path ".:/usr/share/php"
Результат:
После перезапуска Apache скрипты в этой директории смогут использовать библиотеки из /usr/share/php без дополнительного require пути.
Пример 5: Использование Composer с локальной библиотекой, расположенной в /usr/share/php
Если библиотека не имеет composer.json, её можно подключить через автозагрузку Composer, указав путь в секции autoload.files:
{
"autoload": {
"files": [
"/usr/share/php/some_library/init.php"
]
}
}
После composer dump-autoload файл будет подгружаться автоматически при каждом запуске скрипта.
Пример 6: Создание символической ссылки для временного использования библиотеки
sudo ln -s /path/to/my/library /usr/share/php/MyLib
# теперь MyLib доступен как /usr/share/php/MyLib
Проверка:
ls -la /usr/share/php/MyLib lrwxrwxrwx 1 root root 22 Sep 10 12:00 MyLib -> /path/to/my/library
Пример 7: Отладка конфликтов между библиотеками – проверка дублирующихся классов
php -r "
require_once 'PEAR.php';
require_once '/usr/share/php/PEAR.php';
echo 'OK';
"
Результат при наличии дубликата:
Fatal error: Cannot redeclare class PEAR in /usr/share/php/PEAR.php on line 42
Решение – удалить дублирующийся файл или привести include_path к единственному источнику.