Организация общих PHP-библиотек: каталог /usr/share/php

Раздел: Администрирование PHP -> Настройка окружения PHP

Назначение и базовое использование /usr/share/php

Как сделать так, чтобы все PHP-скрипты в системе могли использовать одни и те же библиотеки из единого каталога?

Директория /usr/share/php является стандартным местом для установки общесистемных PHP-библиотек, не привязанных к конкретному проекту. Основной способ её использования – включение в include_path в файле php.ini.

Шаги по настройке:

  1. Открыть файл php.ini (обычно /etc/php/8.x/cli/php.ini для CLI или /etc/php/8.x/apache2/php.ini для Apache).
  2. Найти параметр include_path и добавить в него путь :/usr/share/php (если его там нет). Пример:
    include_path = ".:./inc:/usr/share/php"
  3. Перезапустить веб-сервер (например, sudo systemctl restart apache2).
  4. Теперь можно использовать любые библиотеки, установленные в /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 к единственному источнику.

Путь usr/share/php - comments

En
Usr share php (php)