In order for php to see extensions, it is necessary to specify the root folder when specifying the address to the directory with extensions in php.ini. For example extension_dir = "php/ext"
Существует два способа загрузки PHP-модуля в Windows (здесь идёт речь не о скачивании модуля, а о том, чтобы PHP применял его в работе): скомпилировать его вместе с PHP или загрузить DLL. Загрузка заранее скомпилированного модуля — самый простой и рекомендуемый способ.
Загрузить модуль можно, если он существует в системе в виде файла .dll. Все модули автоматически и периодически компилируются командой PHP (подробнее о скачивании рассказано в следующем разделе).
Чтобы скомпилировать модуль внутри PHP, обратитесь к разделу документации «Сборка из исходников».
Для компиляции отдельного модуля в виде DLL-файла, обратитесь к разделу «Сборка из исходников». Если DLL-файла нет ни в стандартной поставке PHP, ни в PECL, возможно, потребуется скомпилировать его, прежде чем можно будет использовать модуль.
PHP-модулям обычно присваивают имена вида php_*.dll (где звёздочка означает имя модуля), и они размещаются в папке PHP\ext.
PHP поставляется с наиболее полезными для большей части разработчиков модулями. Такие модули называются входящими в комплект (“bundled”).
Однако, если входящие в комплект модули не дают нужной функциональности, нужный модуль всё ещё может быть найден на сайте » PECL. Библиотека модулей сообщества PHP (The PHP Extension Community Library, PECL) — это хранилище модулей PHP, в котором расположен каталог всех известных модулей, и оборудование, которое даёт место для хранения скачиваемых и разрабатываемых PHP-модулей.
Разработанный для отдельных целей модуль можно загрузить в библиотеку PECL, чтобы другие люди, которым он может быть нужен, могли извлечь из него пользу. Неплохим побочным последствием этого будет хорошая вероятность получить отзывы, благодарности (надеемся, что так и будет), сообщения об ошибках и даже исправления/патчи. Пожалуйста, прочтите » публикацию PECL перед отправкой модуля в PECL.
Часто будет доступно несколько версий каждого модуля DLL:
и т. д.
Помните, настройки модулей должны совпадать со всеми настройками бинарного файла PHP. Следующий PHP-скрипт выведет все настройки PHP:
Пример #1 Вызов функции phpinfo()
<?php
phpinfo();
?>
Или запустите из командной строки:
drive:\path\to\php\executable\php.exe -i
Самый распространённый способ загрузить PHP-модуль — включить его в конфигурационном файле php.ini. Обратите внимание, что бо́льшая часть модулей уже прописана в файле php.ini, и для их активации нужно просто удалить точку с запятой.
Обратите внимание, начиная с PHP 7.2.0 вместо имени файла модуля можно указывать название модуля. Такой способ становится рекомендованным для определения, какие модули будут загружены, так как он наиболее лёгкий и платформонезависимый. Поддержка имён файлов всё ещё сохраняется для совместимости с предыдущими версиями.
;extension=php_extname.dll
extension=php_extname.dll
; Начиная с PHP 7.2 лучше делать так: extension=extname zend_extension=another_extension
Однако, некоторые веб-серверы создают путаницу, т. к. они не используют файл php.ini, расположенный в дистрибутиве PHP. Путь расположения файла php.ini указан в выводе функции phpinfo():
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\8.2\php.ini
После активации модуля сохраните php.ini, перезагрузите веб-сервер и снова проверьте вывод функции phpinfo(). Для нового модуля появится отдельный раздел.
Если модуль не появился в выводе функции phpinfo(), необходимо проверить лог-файлы, чтобы узнать, откуда берётся проблема.
При работе с PHP из командной строки (CLI) ошибки загрузки сообщение об ошибке загрузки модуля можно будет прочитать на экране.
Расположение и формат лог-файлов при работе PHP на веб-сервере зависят от программного обеспечения. Пожалуйста, обратитесь к документации веб-сервера, чтобы узнать расположение лог-файлов, поскольку их расположение не зависит от PHP.
Частые проблемы — это расположение модуля DLL и DLL-файлов, от которых он зависит, значение директивы "extension_dir" в файле php.ini, а также несовпадение настроек компиляции.
Если проблема лежит в несовпадении настроек компиляции, то, возможно, скачан неправильный DLL-файл. Нужно попробовать скачать модуль снова с правильными настройками. Ещё раз, информация функции phpinfo() может существенно помочь.
In order for php to see extensions, it is necessary to specify the root folder when specifying the address to the directory with extensions in php.ini. For example extension_dir = "php/ext"
This is handwaved somewhat in the "Resolving problems" section, but mis-location of (non-extension) DLL files is often a problem when installing PHP extensions on Windows.
Many PHP extensions come with not only the extension DLL, but supplementary DLLs that are required by that extension. (For example, php_luasandbox.dll comes with lua5.1.dll, the lua interpreter it sandboxes.) Those other DLLs should go into the same directory as the php.exe binary, NOT the extension directory.
So, if php_luasandbox.dll is installed at C:\PHP8.1\ext\php_luasandbox.dll, the interpreter would be located at C:\PHP8.1\lua5.1.dll. That allows the PHP binary C:\PHP8.1\php.exe to find those additional DLLs when required.
In addition to the helpful comments of ferdnyc and dario: A few weeks ago I've set up a new W11 using PHP 8.1. (as a module) with Apache. It was working fine.
Today i wanted to install the PECL-extension php-amqp. This extension comes with two additional files that are said to be placed in PHPs main directory. It worked fine running from the command prompt but with Apache the extension failed with "Unable to load dynamic library 'amqp'".
I tried 100 ways to notate paths in php.ini and http.conf: c:, C:, \, \\, /, ". I also installed a new PHP in the root to get rid of the space in the path. It did not help.
When reading dario's comment i stumbeled across him mentioning "path environment variable". I checked that in Window's settings and I realized, that i had added PHP's path to the USER'S path-settings, but not to the SYSTEM'S path. That is why it worked in the command prompt but not when starting Apache as a service. After adding it there it worked fine.
On windows, drop your extension's dependencies into a dir of your choice, but outside of your php install. Add that dir to a path environment variable used by your php. Add <extension_name>.dll to your php's extension_dir, and update your php.ini (unless you're simply testing with php's cli).