Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версия | |||
| linux:php_tnt [2021/08/17 15:12] – 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:// | ||