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"
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).
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.