Сервер:
CentOS Linux release 7.4.1708 (Core) , 3.10.0-693.5.2.el7.x86_64
PHP 5.4.16 (cli) (built: Nov 15 2017 16:33:54)
Мне не удалось заставить PHP SOAP работать без ошибок на веб-страницах, хотя тест, который я провел, отлично работал в командной строке Linux для PHP cli. После долгих поисков я нашел предложение добавить в файл /etc/php.ini следующее:
extension=soap.so
Это заставляет веб-страницы, выполняющие запросы SOAP, нормально работать, однако интерфейс командной строки PHP выдает эту ошибку:
PHP Warning: Module 'soap' already loaded in Unknown on line 0
Я получаю указанное выше сообщение даже при выполнении команды «php -v» в командной строке.
Если модуль soap уже загружен, почему мыло не работает на веб-страницах для cgi? Если он уже загружен, где он уже загружен и как это исправить?
# yum list | grep -i soap
php-soap.x86_64 5.4.16-43.el7_4 @updates
CGSI-gSOAP.x86_64 1.3.10-7.el7 epel
CGSI-gSOAP-devel.x86_64 1.3.10-7.el7 epel
SOAPpy.noarch 0.11.6-17.el7 base
fence-agents-vmware-soap.x86_64 4.0.11-66.el7_4.3 updates
glite-lbjp-common-gsoap-plugin.x86_64 3.2.12-7.el7 epel
glite-lbjp-common-gsoap-plugin-devel.x86_64
gsoap.x86_64 2.8.16-9.el7 epel
gsoap-devel.x86_64 2.8.16-9.el7 epel
gsoap-doc.noarch 2.8.16-9.el7 epel
perl-POE-Component-Server-SOAP.noarch 1.14-12.el7 epel
perl-SOAP-Lite.noarch 1.10-1.el7 epel
perl-SOAP-WSDL.noarch 3.003-6.el7 epel
perl-SOAP-WSDL-Apache.noarch 3.003-6.el7 epel
perl-SOAP-WSDL-examples.noarch 3.003-6.el7 epel
php-ZendFramework-Soap.noarch 1.12.20-1.el7 epel
php-ZendFramework2-Soap.noarch 2.4.11-1.el7 epel
php-pear-SOAP.noarch 0.13.0-5.el7 epel
qtsoap.x86_64 2.7-9.el7 epel
qtsoap-devel.x86_64 2.7-9.el7 epel
Это существовало как часть "yum install php-soap":
# cat /etc/php.d/soap.ini
; Enable soap extension module
extension=soap.so
Похоже, это следует оставить в покое. Если я удалю extension = soap.so из /etc/php.ini, предупреждающее сообщение об ошибке в командной строке исчезнет, но это приведет к поломке веб-страниц, связанных с php soap.
Кроме того, я не понимаю, почему SOAP для веб-страниц php просто не устанавливается и не настраивается с остальными установками yum для php и soap.
Нужно ли изменить их .ini или другие файлы конфигурации, чтобы добавить extension = soap.so? Если да, то где эти файлы?
Я запустил программу phpinfo через веб-браузер и из командной строки и получил те же результаты для пути:
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
Scan this dir for additional .ini files => /etc/php.d
Исключением является то, что из веб-браузера для «Server API» это: Apache 2.0 Handler.
Когда я запускаю это:
php -i | grep -i soap
Это результат:
PHP Warning: Module 'soap' already loaded in Unknown on line 0
/etc/php.d/soap.ini,
PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0
soap
Soap Client => enabled
Soap Server => enabled
soap.wsdl_cache => 1 => 1
soap.wsdl_cache_dir => /tmp => /tmp
soap.wsdl_cache_enabled => 1 => 1
soap.wsdl_cache_limit => 5 => 5
soap.wsdl_cache_ttl => 86400 => 86400
Для сравнения я создал экземпляр в virtualBox для CentOS 7 и вручную установил PHP 7 вместо PHP 5, который поставляется с CentOS 7.
PHP 7.0.25 (cli) (built: Oct 27 2017 13:55:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
У него есть только один файл php.ini, расположенный в /etc/php.ini, и с добавлением к нему soap.so он отлично работает без ошибок в командной строке, а phpinfo (), запущенный с сервера, также говорит, что он использует php. ini в / etc. Он также упомянул, что он использует /etc/php.d, но так что PHP 5. Но каталог выглядит иначе, даже если он содержит то же содержимое файла soap.ini, но имена файлов разные. В установке PHP 7 они называются 20-soap.ini, а в установке PHP 5 - soap.ini.
В PHP 5, если я добавляю soap.so в файл /etc/php.ini, то же самое, что и CGI, по-видимому, заставляет SOAP работать для CGI, но генерирует ошибку в командной строке о том, что мыло уже загружено.
Это может быть полезно, я отредактировал php.ini, чтобы добавить soap.ini, и сделал следующее:
service httpd restart
Это заставляет CGI работать, и никаких ошибок из командной строки для PHP, то есть до тех пор, пока я не перезагружу сервер, а затем не вернется предупреждение PHP об уже загруженном мыле.
Где еще и как PHP cli уже загрузил мыло, чтобы не добавлять его в файл php.ini? Может ли это означать, что PHP был скомпилирован с помощью встроенного в него soap.so?
Да, это нормально. Например, в Debian:
root@xxxxx:~# ls /etc/php5/
apache2 cgi cli conf.d fpm mods-available
Например, в этом случае есть apache2 php.ini по умолчанию, другой для CGI, еще один для FPM и один для CLI. Если бы я пошел в каждый из этих каталогов, я бы нашел php.ini для каждого из них.
Быстрый ответ - ДА. Каждый раз, когда я пытаюсь устранить неполадки с php, первое, что я делаю, - это phpinfo () (или php -i), чтобы проверить, какой из них он использует первым.
Путь php.ini может быть разным для cli и cgi. Тест <?php phpinfo(); ?>
с помощью cli и cgi, чтобы узнать, какой путь они используют.
Мне кажется, что ваш исполняемый файл php cli связан с soap. Поэтому он жалуется, когда вы указываете ему в php.ini снова загрузить его. С другой стороны, ваш веб-сервер может использовать php через общую библиотеку, которая не связана с soap.so, поэтому вам понадобится строка «extension = soap.so» в php.ini для загрузки soap.so с помощью dlopen (). Решением может быть использование другого php.ini для библиотеки php веб-сервера и исполняемого файла php cli, как это обычно бывает в дистрибутивах на основе Debian. Попытайтесь выяснить, как ваш веб-сервер использует модуль php. Например. на Ubuntu 16.04 с apache можно найти /usr/lib/apache2/modules/libphp7.0.so
. Затем сравните связанные библиотеки:
ldd $(which php)
ldd /usr/lib/apache2/modules/libphp7.0.so
(Замените путь во второй строке на путь к вашему модулю php.)
Вы можете использовать переключатель -c в командной строке php, чтобы указать другой ini-файл.
php -c /etc/php.cli.ini myprogram.php
PHP может по-разному читать файлы конфигурации для SAPI (серверного API) и CLI.
Если эта переменная среды установлена в вашем профиле или в общесистемном профиле bash, PHP будет сканировать каталоги в поисках файлов конфигурации.
PHP_INI_SCAN_DIR =: / и т.д. / php.d
Это похоже на то, что происходит в вашем случае. Эта переменная среды может быть установлена для вас, но не для пользователя apache.
Когда вы запускаете CLI, он читает все файлы конфигурации php.ini и выдает это предупреждение.
Видеть http://php.net/manual/en/configuration.file.php для получения дополнительной информации о настройке PHP.