====== PHP разное, TnT ======
===== HowTo - Как сделать xyz? =====
==== Проверка системной локали ====
Locale for dummies - https://anton-pribora.ru/articles/php/locales/
', strftime('Число: %d, месяц: %B, день недели: %A');
?>
Как установить локаль в CentOS
cd /usr/share/i18n
localedef -c -i ru_RU -f CP1251 ru_RU.CP1251
locale -a | grep ru_RU
Формат следующий
https://www.shellhacks.com/ru/linux-define-locale-language-settings/
==== Размер realpath_cache_size ====
Битрикс рекомендует ставить **realpath_cache_size** равным 4096K. Но есть [[https://haydenjames.io/set-monitor-phps-realpath_cache_size-correctly/|другое мнение]].
==== Тест imageantialias() ====
[[http://php.net/manual/ru/function.imageantialias.php|GD и функции для работы с изображениями Функции, imageantialias]]
CentOS 6/7, Remi PHP 5.6, ошибка **Fatal error: Call to undefined function imageantialias()**
Пример/тест
Remi хороший репозиторий, но не подойдет ([[https://forum.remirepo.net/viewtopic.php?id=3476|1]], [[https://blog.remirepo.net/post/2013/06/14/gd-last-2.1-en|2]])
Выручают IUS и Webtatic
Всё на месте
$ php -r "var_dump(function_exists('imageantialias'));"
bool(true)
==== Тест imagescale() ====
[[http://php.net/manual/ru/function.imagescale.php|GD и функции для работы с изображениями Функции, imagescale]]
[[https://blogs.oracle.com/oswald/scaling-images-in-php-done-right|Пример]]/тест
==== Увеличение лимита памяти для php скрипта (Fatal error: Allowed memory size of XYZ bytes exhausted) ====
Ошибка **Fatal error: Allowed memory size of XYZ bytes exhausted (tried to allocate XXX bytes) on /site/XYZ**
Как увеличить memory_limit для PHP
* php_value memory_limit 256M через .htaccess
* memory_limit = 256M в php.ini если есть доступ
* ini_set('memory_limit', "256M'); в код скрипта, который требует больше памяти
==== Allowed memory size # 2 ====
Bytes2MB
* PHP: Fatal Error: Allowed Memory Size of 8388608 Bytes Exhausted - 8 MB
* PHP: Fatal Error: Allowed Memory Size of 16777216 Bytes Exhausted - 16 MB
* PHP: Fatal Error: Allowed Memory Size of 33554432 Bytes Exhausted - 32 MB
* PHP: Fatal Error: Allowed Memory Size of 67108864 Bytes Exhausted - 64 MB
* PHP: Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted - 128 MB
* PHP: Fatal Error: Allowed Memory Size of 268435456 Bytes Exhausted - 256 MB
* PHP: Fatal Error: Allowed Memory Size of 536870912 Bytes Exhausted - 512 MB
* PHP: Fatal Error: Allowed Memory Size of 1073741824 Bytes Exhausted - 1 GB
==== Тест memcache ====
connect('127.0.0.1', 11211) or die ("Не могу подключиться");
$version = $memcache->getVersion();
echo "Версия сервера: ".$version."
\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Ошибка при сохранении данных на сервере");
echo "Данные сохранены в кеше. (время жизни данных 10 секунд)
\n";
$get_result = $memcache->get('key');
echo "Данные из кеша:
\n";
var_dump($get_result);
?>
Если указан путь к сокету на сервере, то 11211 нужно заменить на 0
via http://www.sysmasters.net/
==== Тест memcached ====
addServer("127.0.0.1",11211);
$result = $mem->get("Test");
if ($result) {
echo $result;
} else {
echo "Тестовый ключ не найден, добавляю... Обновите страницу.";
$mem->set("Test", "Ключ найден, memcached работает") or die("Не получилось...");
}
?>
==== Запретить php в uploads ====
Говноджумлы и говновпешечки
Options -Indexes
php_flag engine 0
RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
https://searchengines.guru/showpost.php?p=11439693&postcount=3
https://searchengines.guru/showthread.php?p=11439693#post11439693
https://searchengines.guru/showthread.php?t=774117
==== Вывод ошибок PHP, самый крутой htaccess сниппет ====
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
# php_value error_log /home/path/public_html/domain/PHP_errors.log
php_value error_reporting 999999999
# php_value error_reporting -1
php_value log_errors_max_len 0
==== Проверяем работу url_fopen ====
allow_url_fopen.php ([[https://gist.github.com/juanramon/921538|https://gist.github.com/juanramon/921538]])
==== Как убедиться, что у нас работает MPM-ITK ====
Для теста создадим php-файл
В случае с httpd-itk/apache2-mpm-itk скрипт должен вывести нечто подобное (в данном случае была установлена панель ispmanager)
uid=500(dx) gid=500(dx) groups=500(dx),1000(mgrsecure)
==== Как убедиться, что open_basedir работает ====
Для теста создадим в htdocs/public_html php-файл
Если open_basedir настроен правильно, будет выведен листинг каталога.
==== Выполнение PHP кода в HTML файлах ====
PHP как модуль Apache
AddType application/x-httpd-php .html .htm
AddType application/x-httpd-php .asp
PHP как CGI
AddHandler application/x-httpd-php .html .htm
AddHandler application/x-httpd-php .asp
FastCGI
FCGIWrapper /var/www/username/data/php-bin/php .html
FCGIWrapper /var/www/username/data/php-bin/php .htm
FCGIWrapper /var/www/username/data/php-bin/php .php
AddHandler fcgid-script .php .html .htm
==== MSSQL в PHP ====
* [[https://coderwall.com/p/21uxeq/connecting-to-a-mssql-server-database-with-php-on-ubuntu-debian|https://coderwall.com/p/21uxeq/connecting-to-a-mssql-server-database-with-php-on-ubuntu-debian]]
* [[https://davejamesmiller.com/blog/connecting-php-to-microsoft-sql-server-on-linux|https://davejamesmiller.com/blog/connecting-php-to-microsoft-sql-server-on-linux]]
apt-get install freetds-common freetds-bin unixodbc php5-sybase
==== Как отключить eAccelerator ====
php_flag eaccelerator.enable 0
php_flag eaccelerator.optimizer 0
==== Пример отправки сообщения на PHP через внешний SMTP ====
'; // change this to your email address
$to = ''; // change to address
$subject = 'Test Message'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail
$headers = array('From' => $from, 'To' => $to, 'Subject' => $subject);
$smtp = Mail::factory('smtp', array('host' => 'ssl://smtp.example.com', 'port' => '587', 'auth' => true, 'username' => 'username', 'password' => 'password'));
// Send the mail
$mail = $smtp->send($to, $headers, $body);
?>
==== Логирование отправки сообщений PHP-скриптами ====
Или как найти откуда спамят с сервера?
Начиная с версии 5.3 в PHP появилась опция [[http://www.php.net/manual/en/mail.configuration.php#ini.mail.add-x-header|mail.add_x_header]], которая добавляет в почтовые заголовки писем строку ''X-PHP-Originating-Script''
Пример с сайта [[http://ericheikes.com/tracing-spam-from-php-scripts/|http://ericheikes.com/tracing-spam-from-php-scripts/]]
To: victim@example.com
Subject: Order Detail
X-PHP-Originating-Script: 1040:kka3f2.php(1) : eval()'d code
Итак, создаём лог файл
touch /var/log/phpmail.log
chmod 777 /var/log/phpmail.log
Добавляем в **php.ini**
mail.add_x_header = On
mail.log = /var/log/phpmail.log
**mail.add_x_header** - //Добавляет заголовок X-PHP-Originating-Script, который будет содержать UID скрипта и имя файла.// \\ **mail.log** - //Путь к лог-файлу, в который будут записываться все вызовы функции mail(). Записи в логе содержат полный путь до скрипта, номер строки, адрес получателя To и заголовки.//
via [[http://php.net/manual/ru/mail.configuration.php|http://php.net/manual/ru/mail.configuration.php]]
Чтобы узнать где находится php.ini в вашей ОС выполните команду
# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
Проверяем
Также можно добавить ''ignore_repeated_errors on'', чтобы не записывать повторяющиеся ошибки.
Очень удобно смотреть почтовую очередь Postfix через [[http://www.postfix.org/qshape.1.html|qshape]] - [[http://www.postfix.org/QSHAPE_README.html|http://www.postfix.org/QSHAPE_README.html]]
Если выдается сообщение **qshape command not found**, то ставим через пакетный менеджер ОС
RHEL, CentOS, Fedora
yum install postfix-perl-scripts
Debian, Ubuntu
apt-get install postfix-perl-scripts
Если в лог ничего не попадает, а почтовая очередь не уменьшается и спам идёт, то смотрим лог MTA
Для Exim
cat /var/spool/exim4/input/*-H | grep X-PHP-Originating-Script: | sort | uniq
Для Postfix
FIXME
==== disable_func ====
Как выключить определенные PHP функции - [[http://php.net/manual/en/ini.core.php#ini.disable-functions|http://php.net/manual/en/ini.core.php#ini.disable-functions]]
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,exec,passthru,shell_exec,system,proc_open,popen
==== Как отключить функцию eval() ? ====
Никак. [[http://php.net/manual/en/function.eval.php|eval()]] не функция.
Зачем вобще отключать?
Томущо супер надежные CMS навроде Joomla или Wordpress ломают и потом отыскиваются файлы, которые рассылают спам:
eval(base64_decode(
Кто виноват? Во всём виноваты коммуняки Чубайс виноват! Что делать? Резать к чёртовой матери, не дожидаясь перитонитов!
Через Suhosin или через [[http://php.net/manual/ru/ini.core.php#ini.disable-functions|disable_functions]] в php.ini
=== Suhosin ===
Установить расширение [[https://suhosin.org/stories/howtos.html#eval-and-other-language-constructs|Suhosin]]
[Suhosin]
extension=suhosin.so
suhosin.executor.disable_eval = On
=== disable_functions ===
Если нет возможности установить модуль, если он не подгружается или он портит работу ваших скриптов, то рубанем функцию [[http://php.net/manual/en/function.base64-decode.php|base64_decode]]
В php.ini добавляем
disable_functions=base64_decode
==== Отладка PHP через tcpdump ====
В один прекрасный день я открыл для себя неочевидные возможности tcpdump.
Проблема - в FreeBSD не обрабатываются .php файлы.
Если включение повышенного уровня логов в файле ''/usr/local/etc/php-fpm.conf''
log_level = debug
daemonize = no
не даёт результатов и в браузере нет сообщений об ошибках, то предоставим дело профессионалу.
Для обнаружения проблемы будем смотреть сетевой трафик на 9000 порту
tcpdump -A -ni lo0 port 9000
==== Как посмотреть в логе POST запросы ====
grep POST access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head
==== Время отправления скрипта ====
max_execution_time = 300 # php.ini
request_terminate_timeout = 300 # php-fpm
fastcgi_read_timeout 300; # nginx
===== Ошибки баги глюки =====
==== php_value takes two arguments ====
Правильно (.htaccess)
php_value opcache.memory_consumption 128
Неправильно
opcache.memory_consumption 128
php_value opcache.memory_consumption=128
==== Overloading of string functions using mbstring.func_overload ====
Ошибка
Fatal error: Uncaught UnexpectedValueException: Overloading of string functions using mbstring.func_overload is not supported by phpseclib. in /var/www/foobar.com/.../phpseclib/bootstrap.php:11
Решение: cделать mbstring.func_overload = 0 в php.ini или .htaccess
В случае с Apache можно сделать для отдельной директории
php_admin_value mbstring.func_overload 0
==== Zend OPcache can't be temporary enabled ====
**PHP message: PHP Warning: Zend OPcache can't be temporary enabled (it may be only disabled till the end of request) in Unknown on line 0"**
Волноваться не о чем. Просто opcache.enable включен в нескольких местах.
У меня был указан ''php_admin_value[opcache.enable] = on'' в пуле fpm.
В php.ini параметр ''opcache.enable'' закоментирован, но значение по умолчанию для него on.
Поэтому либо делаем off в php.ini либо не добавляем в конфиг пула.
==== Overloading of string functions using mbstring.func_overload is not supported by phpseclib ====
Выключаем через htaccess
mbstrig.func_overload=0
http://php.net/manual/en/mbstring.overload.php
==== error:14090086:SSL ====
* http://forum.directadmin.com/showthread.php?t=50885
* https://akrabat.com/ssl-certificate-verification-on-php-5-6/
==== PHP Fatal error: Call to undefined function rar_open() in ====
Через браузер rar_open() работает. Через консоль ошибка из заголовка.
/**
*
* @param type $file
* @param type $user_id
* @param type $target_path
* @return boolean
*/
private function openRar($file, $user_id = 0, $target_path = null)
{
$pathinfo = pathinfo($file);
$filename = $pathinfo['basename'];
$path = $pathinfo['dirname'] . '/';
$target_path = !is_null($target_path) ? $target_path : $path;
if (!$rar = rar_open($file)) {
$this->setError('Unable to open '.$filename);
return false;
}
$entries = rar_list($rar);
foreach($entries as $entry) {
$nameindex = $entry->getName();
$fileinfo = pathinfo($nameindex);
$entry->extract(null, $target_path . $user_id . '||' . uniqid() . '.' . $fileinfo['extension']);
}
rar_close($rar);
unlink($file);
return true;
}
https://secure.php.net/manual/ru/rar.examples.php
Всё оказалось просто. Кроме основого php.ini надо было добавить ''extension = /usr/lib/php5/20121212/rar.so'' в файл ''/etc/php5/cli/php.ini''
==== Неправильная кодировка ====
Добавляем в .htaccess, php.ini или httpd.conf (vhost)
php_value default_charset "windows-1251"
Если не заработало, то ещё
AddDefaultCharset Windows-1251
==== Uncaught Error: Call to undefined function mime_content_type() ====
http://php.net/manual/ru/ref.fileinfo.php
Скорее всего не установлено расширение
Одним словом
extension=fileinfo.so
==== После включения на сайте https появилось сообщение о незащищенном содержимом ====
* [[http://www.amixa.com/blog/2012/06/06/how-to-use-google-fonts-under-both-ssl-and-non-ssl-without-ssl-insecure-messages/|http://www.amixa.com/blog/2012/06/06/how-to-use-google-fonts-under-both-ssl-and-non-ssl-without-ssl-insecure-messages/]]
* [[https://www.ssl.com/how-to/fix-warnings-of-non-ssl-elements-on-your-site/|https://www.ssl.com/how-to/fix-warnings-of-non-ssl-elements-on-your-site/]]
Меняем абсолютные ссылки http:// на https:// либо делаем их относительными
==== open_basedir restriction in effect ====
В журнале ''/var/log/apache2/error.log'' ошибка
PHP Warning: require(): open_basedir restriction in effect. File() is not within the allowed path(s);
или
PHP Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s);
eAccelerator 0.9.6.1
**Решение**
Открыть ''eaccelerator.c'', найти
if (php_check_open_basedir(realfilename TSRMLS_CC)) {
Заменить на
if (php_check_open_basedir(p->realfilename TSRMLS_CC)) {
phpize
./configure
make
make test
make install
service apache2 restart
service httpd restart
Также есть версия, что достаточно указать дополнительный ключ при сборке ''--without-eaccelerator-use-inode''
==== Class 'IntlDateFormatter' not found ====
[[http://php.net/manual/en/intl.installation.php|http://php.net/manual/en/intl.installation.php]]
yum install php-intl
apt-get install php5-intl
===== Ссылки =====
* [[http://forum.php.su/topic.php?forum=71&topic=13529|Описание: Notice, Warning, Fatal, Parse, Deprecated, Strict]]
* [[http://kurapov.ee/rus/technology/web/php/php_profiling/|Профилирование PHP проектов]]
* [[http://mylinuxthoughts.blogspot.ru/2013/05/how-to-install-php-extensions-using.html|Install PHP Extensions using PECL on RHEL/CentOS/Scientific Linux]]
* [[https://samsonasik.wordpress.com/2012/07/24/zend-framework-2-trailing-slash/|Zend Framework 2 : Handling Trailing Slash “issue”]]
* [[http://phpfaq.ru/debug|Как найти ошибку в своем коде?]]
* [[http://www.drupal.ru/node/79258|http://www.drupal.ru/node/79258]]
* [[http://www.askapache.com/php/custom-phpini-tips-and-tricks.html|Custom PHP.ini tips and tricks]]
* [[http://sadmin.pp.ua/shell-udalenie-ustarevshix-php-sessij.html|Shell: удаление устаревших php сессий]]