Содержание
PHP разное, TnT
HowTo - Как сделать xyz?
Проверка системной локали
Locale for dummies - https://anton-pribora.ru/articles/php/locales/
<?php // Установка локали echo setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); // Выведет ru_RU.CP1251 для FreeBSD // Выведет rus_RUS.CP1251 для линукса // Выведет Russian_Russia.1251 для Windows // ... // Вывод локализованных сообщений, например, даты echo '<br />', 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. Но есть другое мнение.
Тест imageantialias()
GD и функции для работы с изображениями Функции, imageantialias
CentOS 6/7, Remi PHP 5.6, ошибка Fatal error: Call to undefined function imageantialias()
Пример/тест
<?php // Создание двух изображений $aa = imagecreatetruecolor(400, 100); $normal = imagecreatetruecolor(200, 100); // Включение сглаживания для одного из них imageantialias($aa, true); // Задание цветов $red = imagecolorallocate($normal, 255, 0, 0); $red_aa = imagecolorallocate($aa, 255, 0, 0); // Рисование линий imageline($normal, 0, 0, 200, 100, $red); imageline($aa, 0, 0, 200, 100, $red_aa); // Размещение изображений рядом для сравнения (АА: слева, Обычное: справа) imagecopymerge($aa, $normal, 200, 0, 0, 0, 200, 100, 100); // Вывод результата header('Content-type: image/png'); imagepng($aa); imagedestroy($aa); imagedestroy($normal); ?>
Remi хороший репозиторий, но не подойдет (1, 2)
Выручают IUS и Webtatic
Всё на месте
$ php -r "var_dump(function_exists('imageantialias'));" bool(true)
Тест imagescale()
GD и функции для работы с изображениями Функции, imagescale
Пример/тест
<?php $source_image = imagecreatefromjpeg("osaka.jpg"); $source_imagex = imagesx($source_image); $source_imagey = imagesy($source_image); $dest_imagex = 300; $dest_imagey = 200; $dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey); imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey); header("Content-Type: image/jpeg"); imagejpeg($dest_image,NULL,80); ?>
Увеличение лимита памяти для 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
<?php $memcache = new Memcache; $memcache->connect('127.0.0.1', 11211) or die ("Не могу подключиться"); $version = $memcache->getVersion(); echo "Версия сервера: ".$version."<br/>\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 секунд)<br/>\n"; $get_result = $memcache->get('key'); echo "Данные из кеша:<br/>\n"; var_dump($get_result); ?>
Если указан путь к сокету на сервере, то 11211 нужно заменить на 0
Тест memcached
<?php error_reporting(E_ALL|E_STRICT); ini_set('display_errors', true); $mem = new memcached(); $mem->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)
<?php if( ini_get('allow_url_fopen') ) { die('allow_url_fopen is enabled. file_get_contents should work well'); } else { die('allow_url_fopen is disabled. file_get_contents would not work'); } ?>
Как убедиться, что у нас работает MPM-ITK
Для теста создадим php-файл
<?php system ("id"); ?>
В случае с httpd-itk/apache2-mpm-itk скрипт должен вывести нечто подобное (в данном случае была установлена панель ispmanager)
uid=500(dx) gid=500(dx) groups=500(dx),1000(mgrsecure)
Как убедиться, что open_basedir работает
Для теста создадим в htdocs/public_html php-файл
<?php print_r(shell_exec('ls /home/admin/web/foobar.com/')); ?>
Если 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
apt-get install freetds-common freetds-bin unixodbc php5-sybase
Как отключить eAccelerator
php_flag eaccelerator.enable 0 php_flag eaccelerator.optimizer 0
Пример отправки сообщения на PHP через внешний SMTP
<?php // Pear Mail Library require_once "Mail.php"; $from = '<[email protected]>'; // change this to your email address $to = '<[email protected]>'; // 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 появилась опция mail.add_x_header, которая добавляет в почтовые заголовки писем строку X-PHP-Originating-Script
Пример с сайта http://ericheikes.com/tracing-spam-from-php-scripts/
To: [email protected] 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
Чтобы узнать где находится php.ini в вашей ОС выполните команду
# php -i | grep php.ini Configuration File (php.ini) Path => /etc Loaded Configuration File => /etc/php.ini
Проверяем
<?php if (mail("[email protected]", "Тема письма", "Проверяем похапэ!")) echo 'OK'; else echo 'ERROR'; ?>
Также можно добавить ignore_repeated_errors on
, чтобы не записывать повторяющиеся ошибки.
Очень удобно смотреть почтовую очередь Postfix через qshape - 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
disable_func
Как выключить определенные PHP функции - 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() ?
Никак. eval() не функция.
Зачем вобще отключать?
Томущо супер надежные CMS навроде Joomla или Wordpress ломают и потом отыскиваются файлы, которые рассылают спам:
<?php eval(base64_decode(‘Your day just sucks’)); ?>
eval(base64_decode(
Кто виноват? Во всём виноваты коммуняки Чубайс виноват! Что делать? Резать к чёртовой матери, не дожидаясь перитонитов!
Через Suhosin или через disable_functions в php.ini
Suhosin
Установить расширение Suhosin
[Suhosin] extension=suhosin.so suhosin.executor.disable_eval = On
disable_functions
Если нет возможности установить модуль, если он не подгружается или он портит работу ваших скриптов, то рубанем функцию 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 можно сделать для отдельной директории
<Directory /var/www/foobar.com/teapot> php_admin_value mbstring.func_overload 0 </Directory>
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
error:14090086:SSL
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:// на 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
yum install php-intl apt-get install php5-intl
Обсуждение