====== PHP разное, TnT ====== ===== HowTo - Как сделать xyz? ===== ==== Проверка системной локали ==== Locale for dummies - https://anton-pribora.ru/articles/php/locales/ ', 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. Но есть [[https://haydenjames.io/set-monitor-phps-realpath_cache_size-correctly/|другое мнение]]. ==== Тест imageantialias() ==== [[http://php.net/manual/ru/function.imageantialias.php|GD и функции для работы с изображениями Функции, imageantialias]] CentOS 6/7, Remi PHP 5.6, ошибка **Fatal error: Call to undefined function imageantialias()** Пример/тест Remi хороший репозиторий, но не подойдет ([[https://forum.remirepo.net/viewtopic.php?id=3476|1]], [[https://blog.remirepo.net/post/2013/06/14/gd-last-2.1-en|2]]) Выручают IUS и Webtatic Всё на месте $ php -r "var_dump(function_exists('imageantialias'));" bool(true) ==== Тест imagescale() ==== [[http://php.net/manual/ru/function.imagescale.php|GD и функции для работы с изображениями Функции, imagescale]] [[https://blogs.oracle.com/oswald/scaling-images-in-php-done-right|Пример]]/тест ==== Увеличение лимита памяти для 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 ==== connect('127.0.0.1', 11211) or die ("Не могу подключиться"); $version = $memcache->getVersion(); echo "Версия сервера: ".$version."
\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 секунд)
\n"; $get_result = $memcache->get('key'); echo "Данные из кеша:
\n"; var_dump($get_result); ?>
Если указан путь к сокету на сервере, то 11211 нужно заменить на 0 via http://www.sysmasters.net/ ==== Тест memcached ==== 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|https://gist.github.com/juanramon/921538]]) ==== Как убедиться, что у нас работает MPM-ITK ==== Для теста создадим php-файл В случае с httpd-itk/apache2-mpm-itk скрипт должен вывести нечто подобное (в данном случае была установлена панель ispmanager) uid=500(dx) gid=500(dx) groups=500(dx),1000(mgrsecure) ==== Как убедиться, что open_basedir работает ==== Для теста создадим в htdocs/public_html php-файл Если 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 ==== * [[https://coderwall.com/p/21uxeq/connecting-to-a-mssql-server-database-with-php-on-ubuntu-debian|https://coderwall.com/p/21uxeq/connecting-to-a-mssql-server-database-with-php-on-ubuntu-debian]] * [[https://davejamesmiller.com/blog/connecting-php-to-microsoft-sql-server-on-linux|https://davejamesmiller.com/blog/connecting-php-to-microsoft-sql-server-on-linux]] apt-get install freetds-common freetds-bin unixodbc php5-sybase ==== Как отключить eAccelerator ==== php_flag eaccelerator.enable 0 php_flag eaccelerator.optimizer 0 ==== Пример отправки сообщения на PHP через внешний SMTP ==== '; // change this to your email address $to = ''; // 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 появилась опция [[http://www.php.net/manual/en/mail.configuration.php#ini.mail.add-x-header|mail.add_x_header]], которая добавляет в почтовые заголовки писем строку ''X-PHP-Originating-Script'' Пример с сайта [[http://ericheikes.com/tracing-spam-from-php-scripts/|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|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 Проверяем Также можно добавить ''ignore_repeated_errors on'', чтобы не записывать повторяющиеся ошибки. Очень удобно смотреть почтовую очередь Postfix через [[http://www.postfix.org/qshape.1.html|qshape]] - [[http://www.postfix.org/QSHAPE_README.html|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|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() ? ==== Никак. [[http://php.net/manual/en/function.eval.php|eval()]] не функция. Зачем вобще отключать? Томущо супер надежные CMS навроде Joomla или Wordpress ломают и потом отыскиваются файлы, которые рассылают спам: eval(base64_decode( Кто виноват? Во всём виноваты коммуняки Чубайс виноват! Что делать? Резать к чёртовой матери, не дожидаясь перитонитов! Через Suhosin или через [[http://php.net/manual/ru/ini.core.php#ini.disable-functions|disable_functions]] в php.ini === Suhosin === Установить расширение [[https://suhosin.org/stories/howtos.html#eval-and-other-language-constructs|Suhosin]] [Suhosin] extension=suhosin.so suhosin.executor.disable_eval = On === disable_functions === Если нет возможности установить модуль, если он не подгружается или он портит работу ваших скриптов, то рубанем функцию [[http://php.net/manual/en/function.base64-decode.php|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 можно сделать для отдельной директории php_admin_value mbstring.func_overload 0 ==== 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 ==== * http://forum.directadmin.com/showthread.php?t=50885 * https://akrabat.com/ssl-certificate-verification-on-php-5-6/ ==== 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://www.amixa.com/blog/2012/06/06/how-to-use-google-fonts-under-both-ssl-and-non-ssl-without-ssl-insecure-messages/|http://www.amixa.com/blog/2012/06/06/how-to-use-google-fonts-under-both-ssl-and-non-ssl-without-ssl-insecure-messages/]] * [[https://www.ssl.com/how-to/fix-warnings-of-non-ssl-elements-on-your-site/|https://www.ssl.com/how-to/fix-warnings-of-non-ssl-elements-on-your-site/]] Меняем абсолютные ссылки 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|http://php.net/manual/en/intl.installation.php]] yum install php-intl apt-get install php5-intl ===== Ссылки ===== * [[http://forum.php.su/topic.php?forum=71&topic=13529|Описание: Notice, Warning, Fatal, Parse, Deprecated, Strict]] * [[http://kurapov.ee/rus/technology/web/php/php_profiling/|Профилирование PHP проектов]] * [[http://mylinuxthoughts.blogspot.ru/2013/05/how-to-install-php-extensions-using.html|Install PHP Extensions using PECL on RHEL/CentOS/Scientific Linux]] * [[https://samsonasik.wordpress.com/2012/07/24/zend-framework-2-trailing-slash/|Zend Framework 2 : Handling Trailing Slash “issue”]] * [[http://phpfaq.ru/debug|Как найти ошибку в своем коде?]] * [[http://www.drupal.ru/node/79258|http://www.drupal.ru/node/79258]] * [[http://www.askapache.com/php/custom-phpini-tips-and-tricks.html|Custom PHP.ini tips and tricks]] * [[http://sadmin.pp.ua/shell-udalenie-ustarevshix-php-sessij.html|Shell: удаление устаревших php сессий]]