PHP-FPM: как узнать, какие строки кода долго выполняются

PHP-FPM поддерживает опцию журналирования медленных участков кода. Для её включения, необходимо в конфигурационный файл воркера добавить строки:

slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s

где slowlog — принимает путь, до файла для ведения журнала;
request_slowlog_timeout — задаёт максимальное время исполнения команды интерпретатора, при превышении которого она будет добавлена в журнал.

PHP — Fatal error: Call to undefined function mb_internal_encoding

В журнал вэб-сервера записываются ошибки Call to undefined function mb_internal_encoding.
Сие говорит о том, что: либо эта функция отключена директивой disable_functions (настройки в php.ini или в конфигурационном файле сайта, в директории pool.d), либо отключен модуль mbstring.so (закомментирован в файле 20-mbstring.ini в директории conf.d), либо модуль mbstring не установлен (пакет php*.*-mbstring).
Проверяем, установлен ли пакет:

dpkg —get-selections | grep mbstring

В случае отсутствия оного, ищем доступные версии:

apt-cache search mbstring

Выбираем версию, соответствующую версии установленного PHP интерпретатора, и устанавливаем её:

apt-get install php5.6-mbstring

Если же пакет уже был установлен, то правим конфигурационные файлы.

PHP — Fatal error: Call to undefined function utf8_encode

В журнал вэб-сервера записываются ошибки Call to undefined function utf8_encode.
Сие говорит о том, что: либо эта функция отключена директивой disable_functions (настройки в php.ini или в конфигурационном файле сайта, в директории pool.d), либо отключен модуль xml.so (закомментирован в файле 15-xml.ini в директории conf.d), либо модуль xml не установлен (пакет php*.*-xml).
Проверяем, установлен ли пакет с расширением для PHP:

dpkg —get-selections | grep xml

В случае отсутствия оного, ищем доступные версии:

apt-cache search xml

Выбираем версию, соответствующую версии установленного PHP интерпретатора, и устанавливаем её:

apt-get install php5.6-xml

Если же пакет уже был установлен, то правим конфигурационные файлы.

BitrixEnv — PHP Fatal error: Allowed memory size

Один из разделов сайта на Битриксе, развёрнутом в не открывается, в журнал httpd записываются ошибки:
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 84 bytes) in /home/bitrix/site.ru/bitrix/templates/site.ru/components/bitrix/catalog.section/catalog/result_modifier.php on line 467

Так как для выполнения кода, PHP интерпретатору недостаточно памяти, то необходимо увеличить значение директивы memory_limit в файле /etc/php.d/bitrixenv.ini, после чего, перезагрузить вэб-сервис:

service httpd restart

TeamPass: Function mysqli_fetch_all is not available

При установке TeamPass, на стадии проверки сервера отображается ошибка: Function mysqli_fetch_all is not available.
В данной ситуации, TeamPass не обнаружил функции mysqli_fetch_all, которая входит в состав расширения php5-mysqlnd для PHP. Расширение php5-mysqlnd доступно в виде пакета, который при установке удаляет пакет php5-mysql:

apt-get install php5-mysqlnd

Disk quota exceeded при наличии свободного места

Порой при работе сайта на арендованном VPS может появиться подобная ошибка:

Warning: mkdir(): Disk quota exceeded
in /var/www/site.ru/logger.php
on line XXX Can’t log exception

Работа сайта может быть нарушена при обращениях к БД. Сама БД при перезагрузке может выдавать ошибку:

mysql open: Disk quota exceeded

Аналогичную ошибку при запуске могут выдавать и все остальные программы.
Если при проверке наличия свободного места (команда df -h) мы видим, что свободного места ещё достаточно, то вероятно дело в ограничении максимального количества дескрипторов, установленных хостером. Следует обратиться в службу технической поддержки, уточнить, подошли ли Вы к пределу количества инод, и если это так, то попросить увеличить лимит. После этого попытаться заново запустить все необходимые службы.

vmError: Failed to retrieve the Currency Converter XML document

При использовании конвертера валют в Джумле не происходит обновления курса (в моём случае использовался файл convertCBRF.php для парсинга котировок с сайта ЦБ РФ), при этом в панели администратора, в разделе Товары, отображается ошибка vmError: Failed to retrieve the Currency Converter XML document.
Для начала требуется проверить, не заблокировал ли сайт ЦБ IP-адрес сервера. Для этого можно попробовать получить данные котировок программой wget (URL, по которому обращается сценарий, указан в самом файле):

cd
wget http://www.cbr.ru/scripts/XML_daily.asp?date_req=12/11/2014

Если сайт ЦБ отдаёт данные (файл скачался и содержит котировки), то можно попробовать вывести значение переменной с необработанными данными. Для этого создаём в директории сайта тестовый php файл, с содержимым:

<?php
header('Content-type: text/xml; charset=windows-1251');
$contents = file_get_contents( 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=12/11/2014' );   
print_r($contents); 
?>

Если при запросе этого файла обозреватель верно отобразит котировки (как на сайте ЦБ), то проблема в коде файла конвертера. Если отобразится ошибка Warning: file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0, то значит на сервере отключён HTTP враппер. Включить его можно, изменив значение в php.ini на allow_url_fopen=0, либо добавив строку php_admin_value[allow_url_fopen] = 1 в конфигурационный файл конкретного сайта, при использовании пула конфигураций PHP-FPM, либо добавить строку php_admin_flag allow_url_fopen On в файл httpd.conf, при использовании PHP в качестве модуля.

Call-time pass-by-reference has been deprecated — argument passed by value.

Данное предупреждение говорит о том, что передача аргументов по ссылке во время вызова функции была объявлена устаревшей. Избавиться от этого предупреждения можно убрав в указанной строчке символ & перед именем переменной, передаваемой в какую-либо функцию.

PHP не отображает ошибки

Если при включенном режиме отображения ошибок они таки не отображаются и не пишутся в лог файлы, то не плохо бы проверить файл скрипта на наличие @include_once и, в случае наличия оных, убрать собаку:

sudo grep -rl ‘@include_once’ /путь_до_папки_со_скриптами | sudo xargs sed -i ‘s/@include_once/include_once/g’

Cron — Выполнение PHP сценария с GET запросом

Для выполнения PHP файла по крону с GET запросом, можно воспользоваться программой GET. Запись в crontab имеет примерно такой вид:

0 0 * * * www-data /usr/bin/GET ‘http://mysite.ru/cron.php?module[]=exchange’

При отсутствии в системе программы /usr/bin/GET, следует установить пакет libwww-perl.