Stylesheet conf/userstyle.css not found, please contact the developer of "dokuwiki_2024" template.
linux:php_tnt
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
linux:php_tnt [2021/06/25 10:09] – dx | linux:php_tnt [2022/03/26 18:40] (текущий) – dx | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== PHP разное, | ||
+ | ===== HowTo - Как сделать xyz? ===== | ||
+ | |||
+ | ==== Проверка системной локали ==== | ||
+ | |||
+ | Locale for dummies - https:// | ||
+ | |||
+ | <code php> | ||
+ | <? | ||
+ | // Установка локали | ||
+ | echo setlocale(LC_ALL, | ||
+ | |||
+ | // Выведет ru_RU.CP1251 для FreeBSD | ||
+ | // Выведет rus_RUS.CP1251 для линукса | ||
+ | // Выведет Russian_Russia.1251 для Windows | ||
+ | |||
+ | // ... | ||
+ | |||
+ | // Вывод локализованных сообщений, | ||
+ | echo '< | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Как установить локаль в CentOS | ||
+ | |||
+ | < | ||
+ | cd / | ||
+ | localedef -c -i ru_RU -f CP1251 ru_RU.CP1251 | ||
+ | locale -a | grep ru_RU | ||
+ | </ | ||
+ | |||
+ | Формат следующий | ||
+ | |||
+ | < | ||
+ | https:// | ||
+ | </ | ||
+ | |||
+ | ==== Размер realpath_cache_size ==== | ||
+ | |||
+ | Битрикс рекомендует ставить **realpath_cache_size** равным 4096K. Но есть [[https:// | ||
+ | |||
+ | ==== Тест imageantialias() ==== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | CentOS 6/7, Remi PHP 5.6, ошибка **Fatal error: Call to undefined function imageantialias()** | ||
+ | |||
+ | Пример/ | ||
+ | |||
+ | <code php> | ||
+ | |||
+ | <?php | ||
+ | // Создание двух изображений | ||
+ | $aa = imagecreatetruecolor(400, | ||
+ | $normal = imagecreatetruecolor(200, | ||
+ | |||
+ | // Включение сглаживания для одного из них | ||
+ | imageantialias($aa, | ||
+ | |||
+ | // Задание цветов | ||
+ | $red = imagecolorallocate($normal, | ||
+ | $red_aa = imagecolorallocate($aa, | ||
+ | |||
+ | // Рисование линий | ||
+ | imageline($normal, | ||
+ | imageline($aa, | ||
+ | |||
+ | // Размещение изображений рядом для сравнения (АА: слева, Обычное: | ||
+ | imagecopymerge($aa, | ||
+ | |||
+ | // Вывод результата | ||
+ | header(' | ||
+ | |||
+ | imagepng($aa); | ||
+ | imagedestroy($aa); | ||
+ | imagedestroy($normal); | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Remi хороший репозиторий, | ||
+ | |||
+ | Выручают IUS и Webtatic | ||
+ | |||
+ | Всё на месте | ||
+ | |||
+ | < | ||
+ | $ php -r " | ||
+ | bool(true) | ||
+ | </ | ||
+ | |||
+ | ==== Тест imagescale() ==== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | <code php> | ||
+ | <? | ||
+ | $source_image = imagecreatefromjpeg(" | ||
+ | $source_imagex = imagesx($source_image); | ||
+ | $source_imagey = imagesy($source_image); | ||
+ | $dest_imagex = 300; | ||
+ | $dest_imagey = 200; | ||
+ | $dest_image = imagecreatetruecolor($dest_imagex, | ||
+ | imagecopyresampled($dest_image, | ||
+ | $dest_imagey, | ||
+ | header(" | ||
+ | imagejpeg($dest_image, | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== Увеличение лимита памяти для 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(' | ||
+ | |||
+ | ==== 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 ==== | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | $memcache = new Memcache; | ||
+ | $memcache-> | ||
+ | $version = $memcache-> | ||
+ | echo " | ||
+ | $tmp_object = new stdClass; | ||
+ | $tmp_object-> | ||
+ | $tmp_object-> | ||
+ | $memcache-> | ||
+ | echo " | ||
+ | $get_result = $memcache-> | ||
+ | echo " | ||
+ | var_dump($get_result); | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Если указан путь к сокету на сервере, | ||
+ | |||
+ | via http:// | ||
+ | |||
+ | ==== Тест memcached ==== | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | error_reporting(E_ALL|E_STRICT); | ||
+ | ini_set(' | ||
+ | $mem = new memcached(); | ||
+ | $mem-> | ||
+ | $result = $mem-> | ||
+ | if ($result) { | ||
+ | echo $result; | ||
+ | } else { | ||
+ | echo " | ||
+ | $mem-> | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== Запретить 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/ | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ==== Вывод ошибок 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 / | ||
+ | php_value error_reporting 999999999 | ||
+ | # php_value error_reporting -1 | ||
+ | php_value log_errors_max_len 0 | ||
+ | </ | ||
+ | |||
+ | ==== Проверяем работу url_fopen ==== | ||
+ | |||
+ | allow_url_fopen.php ([[https:// | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | if( ini_get(' | ||
+ | die(' | ||
+ | } else { | ||
+ | die(' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== Как убедиться, | ||
+ | |||
+ | Для теста создадим php-файл | ||
+ | |||
+ | <code php><? | ||
+ | |||
+ | В случае с httpd-itk/ | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Как убедиться, | ||
+ | |||
+ | Для теста создадим в htdocs/ | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | print_r(shell_exec(' | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Если open_basedir настроен правильно, | ||
+ | |||
+ | ==== Выполнение PHP кода в HTML файлах ==== | ||
+ | |||
+ | PHP как модуль Apache | ||
+ | |||
+ | < | ||
+ | AddType application/ | ||
+ | AddType application/ | ||
+ | </ | ||
+ | |||
+ | PHP как CGI | ||
+ | |||
+ | < | ||
+ | AddHandler application/ | ||
+ | AddHandler application/ | ||
+ | </ | ||
+ | |||
+ | FastCGI | ||
+ | |||
+ | < | ||
+ | FCGIWrapper / | ||
+ | FCGIWrapper / | ||
+ | FCGIWrapper / | ||
+ | AddHandler fcgid-script .php .html .htm | ||
+ | </ | ||
+ | |||
+ | ==== MSSQL в PHP ==== | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Как отключить eAccelerator ==== | ||
+ | |||
+ | < | ||
+ | php_flag eaccelerator.enable 0 | ||
+ | php_flag eaccelerator.optimizer 0 | ||
+ | </ | ||
+ | |||
+ | ==== Пример отправки сообщения на PHP через внешний SMTP ==== | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | // Pear Mail Library | ||
+ | require_once " | ||
+ | |||
+ | $from = '< | ||
+ | $to = '< | ||
+ | $subject = 'Test Message'; | ||
+ | $body = "Hello world! this is the content of the email"; | ||
+ | |||
+ | $headers = array(' | ||
+ | |||
+ | $smtp = Mail:: | ||
+ | |||
+ | // Send the mail | ||
+ | $mail = $smtp-> | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== Логирование отправки сообщений PHP-скриптами ==== | ||
+ | |||
+ | Или как найти откуда спамят с сервера? | ||
+ | |||
+ | Начиная с версии 5.3 в PHP появилась опция [[http:// | ||
+ | |||
+ | Пример с сайта [[http:// | ||
+ | |||
+ | < | ||
+ | To: [email protected] | ||
+ | Subject: Order Detail | ||
+ | X-PHP-Originating-Script: | ||
+ | </ | ||
+ | |||
+ | Итак, создаём лог файл | ||
+ | |||
+ | < | ||
+ | touch / | ||
+ | chmod 777 / | ||
+ | </ | ||
+ | |||
+ | Добавляем в **php.ini** | ||
+ | |||
+ | < | ||
+ | mail.add_x_header = On | ||
+ | mail.log = / | ||
+ | </ | ||
+ | |||
+ | **mail.add_x_header** | ||
+ | |||
+ | via [[http:// | ||
+ | |||
+ | Чтобы узнать где находится php.ini в вашей ОС выполните команду | ||
+ | |||
+ | < | ||
+ | # php -i | grep php.ini | ||
+ | Configuration File (php.ini) Path => /etc | ||
+ | Loaded Configuration File => / | ||
+ | </ | ||
+ | |||
+ | Проверяем | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | if (mail(" | ||
+ | echo ' | ||
+ | else | ||
+ | echo ' | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Также можно добавить '' | ||
+ | |||
+ | Очень удобно смотреть почтовую очередь Postfix через [[http:// | ||
+ | |||
+ | Если выдается сообщение **qshape command not found**, то ставим через пакетный менеджер ОС | ||
+ | |||
+ | RHEL, CentOS, Fedora | ||
+ | |||
+ | < | ||
+ | |||
+ | Debian, Ubuntu | ||
+ | |||
+ | < | ||
+ | |||
+ | Если в лог ничего не попадает, | ||
+ | |||
+ | Для Exim | ||
+ | |||
+ | < | ||
+ | |||
+ | Для Postfix | ||
+ | |||
+ | FIXME | ||
+ | |||
+ | ==== disable_func ==== | ||
+ | |||
+ | Как выключить определенные PHP функции - [[http:// | ||
+ | |||
+ | < | ||
+ | disable_functions = pcntl_alarm, | ||
+ | </ | ||
+ | |||
+ | ==== Как отключить функцию eval() ? ==== | ||
+ | |||
+ | Никак. [[http:// | ||
+ | |||
+ | Зачем вобще отключать? | ||
+ | |||
+ | Томущо супер надежные CMS навроде Joomla или Wordpress ломают и потом отыскиваются файлы, которые рассылают спам: | ||
+ | |||
+ | <?php eval(base64_decode(‘Your day just sucks’)); ?> | ||
+ | |||
+ | eval(base64_decode( | ||
+ | |||
+ | Кто виноват? | ||
+ | |||
+ | Через Suhosin или через [[http:// | ||
+ | |||
+ | === Suhosin === | ||
+ | |||
+ | Установить расширение [[https:// | ||
+ | |||
+ | < | ||
+ | [Suhosin] | ||
+ | extension=suhosin.so | ||
+ | suhosin.executor.disable_eval = On | ||
+ | </ | ||
+ | |||
+ | === disable_functions === | ||
+ | |||
+ | Если нет возможности установить модуль, | ||
+ | |||
+ | В php.ini добавляем | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Отладка PHP через tcpdump ==== | ||
+ | |||
+ | В один прекрасный день я открыл для себя неочевидные возможности tcpdump. | ||
+ | |||
+ | Проблема - в FreeBSD не обрабатываются .php файлы. | ||
+ | |||
+ | Если включение повышенного уровня логов в файле ''/ | ||
+ | |||
+ | < | ||
+ | log_level = debug | ||
+ | daemonize = no | ||
+ | </ | ||
+ | |||
+ | не даёт результатов и в браузере нет сообщений об ошибках, | ||
+ | |||
+ | Для обнаружения проблемы будем смотреть сетевой трафик на 9000 порту | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Как посмотреть в логе POST запросы ==== | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Время отправления скрипта ==== | ||
+ | |||
+ | < | ||
+ | max_execution_time = 300 # php.ini | ||
+ | request_terminate_timeout = 300 # php-fpm | ||
+ | fastcgi_read_timeout 300; # nginx | ||
+ | </ | ||
+ | |||
+ | ===== Ошибки баги глюки ===== | ||
+ | |||
+ | ==== php_value takes two arguments ==== | ||
+ | |||
+ | Правильно (.htaccess) | ||
+ | |||
+ | < | ||
+ | |||
+ | Неправильно | ||
+ | |||
+ | < | ||
+ | opcache.memory_consumption 128 | ||
+ | php_value opcache.memory_consumption=128 | ||
+ | </ | ||
+ | |||
+ | ==== Overloading of string functions using mbstring.func_overload ==== | ||
+ | |||
+ | Ошибка | ||
+ | |||
+ | < | ||
+ | |||
+ | Решение: | ||
+ | |||
+ | В случае с Apache можно сделать для отдельной директории | ||
+ | |||
+ | < | ||
+ | < | ||
+ | php_admin_value mbstring.func_overload 0 | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== Zend OPcache can't be temporary enabled ==== | ||
+ | |||
+ | **PHP message: PHP Warning: | ||
+ | |||
+ | Волноваться не о чем. Просто opcache.enable включен в нескольких местах. | ||
+ | |||
+ | У меня был указан '' | ||
+ | |||
+ | В php.ini параметр '' | ||
+ | |||
+ | Поэтому либо делаем off в php.ini либо не добавляем в конфиг пула. | ||
+ | |||
+ | ==== Overloading of string functions using mbstring.func_overload is not supported by phpseclib ==== | ||
+ | |||
+ | Выключаем через htaccess | ||
+ | |||
+ | < | ||
+ | |||
+ | http:// | ||
+ | |||
+ | ==== error: | ||
+ | |||
+ | * http:// | ||
+ | * https:// | ||
+ | |||
+ | ==== 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, | ||
+ | { | ||
+ | $pathinfo = pathinfo($file); | ||
+ | $filename = $pathinfo[' | ||
+ | $path = $pathinfo[' | ||
+ | $target_path = !is_null($target_path) ? $target_path : $path; | ||
+ | |||
+ | if (!$rar = rar_open($file)) { | ||
+ | $this-> | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | $entries = rar_list($rar); | ||
+ | foreach($entries as $entry) { | ||
+ | $nameindex = $entry-> | ||
+ | $fileinfo = pathinfo($nameindex); | ||
+ | $entry-> | ||
+ | } | ||
+ | |||
+ | rar_close($rar); | ||
+ | unlink($file); | ||
+ | |||
+ | return true; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | |||
+ | Всё оказалось просто. Кроме основого php.ini надо было добавить '' | ||
+ | |||
+ | ==== Неправильная кодировка ==== | ||
+ | |||
+ | Добавляем в .htaccess, php.ini или httpd.conf (vhost) | ||
+ | |||
+ | < | ||
+ | |||
+ | Если не заработало, | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Uncaught Error: Call to undefined function mime_content_type() ==== | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Скорее всего не установлено расширение | ||
+ | |||
+ | Одним словом | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== После включения на сайте https появилось сообщение о незащищенном содержимом ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | Меняем абсолютные ссылки < | ||
+ | |||
+ | ==== open_basedir restriction in effect ==== | ||
+ | |||
+ | В журнале ''/ | ||
+ | |||
+ | < | ||
+ | |||
+ | или | ||
+ | |||
+ | < | ||
+ | |||
+ | eAccelerator 0.9.6.1 | ||
+ | |||
+ | **Решение** | ||
+ | |||
+ | Открыть '' | ||
+ | |||
+ | < | ||
+ | |||
+ | Заменить на | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | phpize | ||
+ | ./configure | ||
+ | make | ||
+ | make test | ||
+ | make install | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | service apache2 restart | ||
+ | service httpd restart | ||
+ | </ | ||
+ | |||
+ | Также есть версия, | ||
+ | |||
+ | ==== Class ' | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | < | ||
+ | yum install php-intl | ||
+ | apt-get install php5-intl | ||
+ | </ | ||
+ | |||
+ | ===== Ссылки ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// |