Установка PHP-расширения в Windows
В Windows есть два способа загрузки PHP-расширения: скомпилировать его вместе с PHP или загрузить DLL. Загрузка заранее скомпилированного расширения является наиболее простым и предпочитаемым способом.
Для загрузки расширения, оно должно присутствовать на вашей системе в виде ".dll" файла. Все расширения автоматически и периодически компилируются командой PHP (см. следующий раздел для загрузки).
За инструкциями по компиляции расширения в PHP обратитесь к разделу "Сборка из исходников".
Для компиляции отдельного расширения (или DLL-файла), обратитесь к разделу " Сборка из исходников". Если DLL-файла нет ни в стандартной поставке PHP ни в PECL, возможно, вам придется скомпилировать его вручную.
Где найти расширение?
PHP-расширения обычно имеют имена вида "php_*.dll" (где звездочка обозначает имя расширения) и располагаются в папке "PHP\ext" ("PHP\extensions" в PHP 4).
PHP поставляет расширения наиболее полезные большинству разработчиков. Такие расширения называются "основными" ("core").
Однако, если вам требуется функционал, который не предоставляется ни одним из основных расширений, возможно, нужное вам расширение есть в PECL. Библиотека расширений сообщества PHP (The PHP Extension Community Library, PECL) является хранилищем расширений PHP, предоставляя каталог и хостинг всех известных расширений для скачки и дальнейшей разработки расширений в PHP.
Если вы разработали какое-либо расширение для собственных нужд, возможно, вы захотите хранить его в PECL, так, чтобы другие также могли воспользоваться результатами вашего труда. Хорошим побочным эффектом будет неплохой шанс получить обратную связь, благодарности (надеемся, что так и будет), сообщения об ошибках и даже исправления/патчи. Пожалуйста, прочтите http://pecl.php.net/package-new.php перед отправкой вашего расширения в PECL.
Какое расширение нужно загрузить?
Очень часто существует несколько версий расширения DLL:
- Различные номера версий (по крайней мере первые два числа должны совпадать)
- Различные настройки потокобезопасности
- Различная архитектура процессора (x86, x64, ...)
- Различные настройки отладки
- и т.д.
Помните, что настройки ваших расширений должны совпадать со всеми настройками используемого вами бинарного файла PHP. Следующий PHP-скрипт выведет вам все все настройки PHP:
Пример #1 Вызов phpinfo()
<?php
phpinfo();
?>
Или запустите из командной строки:
drive:\\path\to\php\executable\php.exe -i
Загрузка расширения
Наиболее распространенным способом загрузки PHP-расширения является его включение в конфигурационном файле php.ini. Обратите внимание, что большинство расширений уже прописаны в вашем php.ini и для их активации вам просто нужно удалить точку с запятой.
;extension=php_extname.dll
extension=php_extname.dll
Однако, некоторые веб-серверы создают путаницу, т.к. они не используют php.ini, расположенный в дистрибутиве PHP, а используют свой собственный. Узнать, где находится используемый сервером php.ini, можно посмотрев на выводимый путь в phpinfo():
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
После активации расширения сохраните php.ini, перезагрузите веб-сервер и снова проверьте phpinfo(), в нем должен появиться отдельный раздел с новым расширением.
Решение проблем
Если расширение не появилось в выводе phpinfo(), проверьте лог-файлы на наличие сообщений об ошибках.
Если вы используете PHP в командной строке (CLI), ошибки загрузки расширения будут доступны сразу же на экране.
Если вы используете PHP на веб-сервере, расположение и формат лог-файлов сильно зависит от используемого вами веб-сервера. Пожалуйста, обратитесь к документации вашего веб-сервера, т.к. в данном случае эта ситуация не управляется самим PHP.
Частой проблемой является расположение DLL-файлов, значение " extension_dir" в php.ini, а также несовпадение настроек компиляции.
Если проблемой является несовпадение настроек компиляции, то возможно, вы скачали не тот DLL-файл. Попробуйте снова скачать расширение, на этот раз с правильными настройками. Еще раз, информация функции phpinfo() сильно помогает в этом случае.
Коментарии
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.
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).
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.
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"