RTFM.WIKI

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

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

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


Боковая панель


Навигация

Линкшэринг

ALARM!

Добавить новую страницу

You are not allowed to add pages
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'); в код скрипта, который требует больше памяти

Тест 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 = '<user@example.com>'; // change this to your email address
$to = '<user2@example.com>';  // 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: 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

Чтобы узнать где находится php.ini в вашей ОС выполните команду

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

Проверяем

<?php
if (mail("bob@foobar.com", "Тема письма", "Проверяем похапэ!"))
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

Ошибки баги глюки

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

Ссылки

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies

Discussion

Enter your comment. Wiki syntax is allowed:
 
linux/php_tnt.txt · Последнее изменение: 2019/12/13 17:24 (внешнее изменение)