RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:php_tnt

Содержание

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

via http://www.sysmasters.net/

Тест 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

Как отключить 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

FIXME

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

Выключаем через htaccess

mbstrig.func_overload=0

http://php.net/manual/en/mbstring.overload.php

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

Ссылки

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/php_tnt.txt · Последнее изменение: 2022/03/26 18:40 — dx