RTFM.WIKI

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

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

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


Stylesheet conf/userstyle.css not found, please contact the developer of "dokuwiki_2024" template.
linux:php_tnt

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
linux:php_tnt [2021/08/17 15:12] dxlinux:php_tnt [2022/03/26 18:40] (текущий) dx
Строка 1: Строка 1:
 +====== PHP разное, TnT ======
  
 +===== HowTo - Как сделать xyz? =====
 +
 +==== Проверка системной локали ====
 +
 +Locale for dummies - https://anton-pribora.ru/articles/php/locales/
 +
 +<code php>
 +<?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');
 +?>
 +</code>
 +
 +Как установить локаль в CentOS
 +
 +<code>
 +cd /usr/share/i18n
 +localedef -c -i ru_RU -f CP1251 ru_RU.CP1251
 +locale -a | grep ru_RU
 +</code>
 +
 +Формат следующий
 +
 +<code>
 +https://www.shellhacks.com/ru/linux-define-locale-language-settings/
 +</code>
 +
 +==== Размер 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()**
 +
 +Пример/тест
 +
 +<code php>
 +
 +<?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);
 +?>
 +</code>
 +
 +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
 +
 +Всё на месте
 +
 +<code>
 +$ php -r "var_dump(function_exists('imageantialias'));"
 +bool(true)
 +</code>
 +
 +==== Тест imagescale() ====
 +
 +[[http://php.net/manual/ru/function.imagescale.php|GD и функции для работы с изображениями Функции, imagescale]]
 +
 +[[https://blogs.oracle.com/oswald/scaling-images-in-php-done-right|Пример]]/тест
 +
 +<code php>
 +<?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);
 +?>
 +</code>
 +
 +==== Увеличение лимита памяти для 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 ====
 +
 +<code php>
 +<?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);
 +?>
 +</code>
 +
 +Если указан путь к сокету на сервере, то 11211 нужно заменить на 0
 +
 +via http://www.sysmasters.net/
 +
 +==== Тест memcached ====
 +
 +<code php>
 +<?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("Не получилось...");
 +}
 +?>
 +</code>
 +
 +==== Запретить php в uploads ====
 +
 +Говноджумлы и говновпешечки
 +
 +<code>
 +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
 +</code>
 +
 +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 сниппет ====
 +
 +<code>
 +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
 +</code>
 +
 +==== Проверяем работу url_fopen ====
 +
 +allow_url_fopen.php ([[https://gist.github.com/juanramon/921538|https://gist.github.com/juanramon/921538]])
 +
 +<code php>
 +<?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');
 +    }
 +?>
 +</code>
 +
 +==== Как убедиться, что у нас работает MPM-ITK ====
 +
 +Для теста создадим php-файл
 +
 +<code php><?php system ("id"); ?></code>
 +
 +В случае с httpd-itk/apache2-mpm-itk скрипт должен вывести нечто подобное (в данном случае была установлена панель ispmanager)
 +
 +<code>uid=500(dx) gid=500(dx) groups=500(dx),1000(mgrsecure)</code>
 +
 +==== Как убедиться, что open_basedir работает ====
 +
 +Для теста создадим в htdocs/public_html php-файл
 +
 +<code php>
 +<?php
 +print_r(shell_exec('ls /home/admin/web/foobar.com/'));
 +?>
 +</code>
 +
 +Если open_basedir настроен правильно, будет выведен листинг каталога.
 +
 +==== Выполнение PHP кода в HTML файлах ====
 +
 +PHP как модуль Apache
 +
 +<code>
 +AddType application/x-httpd-php .html .htm
 +AddType application/x-httpd-php .asp
 +</code>
 +
 +PHP как CGI
 +
 +<code>
 +AddHandler application/x-httpd-php .html .htm
 +AddHandler application/x-httpd-php .asp
 +</code>
 +
 +FastCGI
 +
 +<code>
 +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
 +</code>
 +
 +==== 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]]
 +
 +<code>apt-get install freetds-common freetds-bin unixodbc php5-sybase</code>
 +
 +==== Как отключить eAccelerator ====
 +
 +<code>
 +php_flag eaccelerator.enable 0
 +php_flag eaccelerator.optimizer 0
 +</code>
 +
 +==== Пример отправки сообщения на PHP через внешний SMTP ====
 +
 +<code php>
 +<?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);
 +?>
 +</code>
 +
 +==== Логирование отправки сообщений 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/]]
 +
 +<code>
 +To: [email protected]
 +Subject: Order Detail
 +X-PHP-Originating-Script: 1040:kka3f2.php(1) : eval()'d code
 +</code>
 +
 +Итак, создаём лог файл
 +
 +<code>
 +touch /var/log/phpmail.log
 +chmod 777 /var/log/phpmail.log
 +</code>
 +
 +Добавляем в **php.ini**
 +
 +<code>
 +mail.add_x_header = On
 +mail.log = /var/log/phpmail.log
 +</code>
 +
 +**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 в вашей ОС выполните команду
 +
 +<code>
 +# php -i | grep php.ini
 +Configuration File (php.ini) Path => /etc
 +Loaded Configuration File => /etc/php.ini
 +</code>
 +
 +Проверяем
 +
 +<code php>
 +<?php
 +if (mail("[email protected]", "Тема письма", "Проверяем похапэ!"))
 +echo 'OK';
 +else
 +echo 'ERROR';
 +?>
 +</code>
 +
 +Также можно добавить ''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
 +
 +<code>yum install postfix-perl-scripts</code>
 +
 +Debian, Ubuntu
 +
 +<code>apt-get install postfix-perl-scripts</code>
 +
 +Если в лог ничего не попадает, а почтовая очередь не уменьшается и спам идёт, то смотрим лог MTA
 +
 +Для Exim
 +
 +<code>cat /var/spool/exim4/input/*-H  | grep X-PHP-Originating-Script: | sort | uniq</code>
 +
 +Для 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]]
 +
 +<code>
 +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
 +</code>
 +
 +==== Как отключить функцию eval() ? ====
 +
 +Никак. [[http://php.net/manual/en/function.eval.php|eval()]] не функция.
 +
 +Зачем вобще отключать?
 +
 +Томущо супер надежные CMS навроде Joomla или Wordpress ломают и потом отыскиваются файлы, которые рассылают спам:
 +
 +<?php eval(base64_decode(‘Your day just sucks’)); ?>
 +
 +eval(base64_decode(
 +
 +Кто виноват? Во всём виноваты <del>коммуняки</del>  Чубайс виноват! Что делать? Резать к чёртовой матери, не дожидаясь перитонитов!
 +
 +Через 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]]
 +
 +<code>
 +[Suhosin]
 +extension=suhosin.so
 +suhosin.executor.disable_eval = On
 +</code>
 +
 +=== disable_functions ===
 +
 +Если нет возможности установить модуль, если он не подгружается или он портит работу ваших скриптов, то рубанем функцию [[http://php.net/manual/en/function.base64-decode.php|base64_decode]]
 +
 +В php.ini добавляем
 +
 +<code>disable_functions=base64_decode</code>
 +
 +==== Отладка PHP через tcpdump ====
 +
 +В один прекрасный день я открыл для себя неочевидные возможности tcpdump.
 +
 +Проблема - в FreeBSD не обрабатываются .php файлы.
 +
 +Если включение повышенного уровня логов в файле ''/usr/local/etc/php-fpm.conf''
 +
 +<code>
 +log_level = debug
 +daemonize = no
 +</code>
 +
 +не даёт результатов и в браузере нет сообщений об ошибках, то предоставим дело профессионалу.
 +
 +Для обнаружения проблемы будем смотреть сетевой трафик на 9000 порту
 +
 +<code>tcpdump -A -ni lo0 port 9000</code>
 +
 +==== Как посмотреть в логе POST запросы ====
 +
 +<code>grep POST access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head</code>
 +
 +==== Время отправления скрипта ====
 +
 +<code>
 +max_execution_time = 300        # php.ini
 +request_terminate_timeout = 300 # php-fpm
 +fastcgi_read_timeout 300;       # nginx
 +</code>
 +
 +===== Ошибки баги глюки =====
 +
 +==== php_value takes two arguments ====
 +
 +Правильно (.htaccess)
 +
 +<code>php_value opcache.memory_consumption 128</code>
 +
 +Неправильно
 +
 +<code>
 +opcache.memory_consumption 128
 +php_value opcache.memory_consumption=128
 +</code>
 +
 +==== Overloading of string functions using mbstring.func_overload ====
 +
 +Ошибка
 +
 +<code>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</code>
 +
 +Решение: cделать mbstring.func_overload = 0 в php.ini или .htaccess
 +
 +В случае с Apache можно сделать для отдельной директории
 +
 +<code>
 +<Directory /var/www/foobar.com/teapot>
 +php_admin_value mbstring.func_overload 0
 +</Directory>
 +</code>
 +
 +==== 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
 +
 +<code>mbstrig.func_overload=0</code>
 +
 +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() работает. Через консоль ошибка из заголовка.
 +
 +<code>
 +/**
 +*
 +* @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;
 +
 +</code>
 +
 +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)
 +
 +<code>php_value default_charset "windows-1251"</code>
 +
 +Если не заработало, то ещё
 +
 +<code>AddDefaultCharset Windows-1251</code>
 +
 +==== Uncaught Error: Call to undefined function mime_content_type() ====
 +
 +http://php.net/manual/ru/ref.fileinfo.php
 +
 +Скорее всего не установлено расширение
 +
 +Одним словом
 +
 +<code>extension=fileinfo.so</code>
 +
 +==== После включения на сайте 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/]]
 +
 +Меняем абсолютные ссылки <nowiki>http:// на https://</nowiki> либо делаем их относительными
 +
 +==== open_basedir restriction in effect ====
 +
 +В журнале ''/var/log/apache2/error.log'' ошибка
 +
 +<code>PHP Warning: require(): open_basedir restriction in effect. File() is not within the allowed path(s);</code>
 +
 +или
 +
 +<code>PHP Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s);</code>
 +
 +eAccelerator 0.9.6.1
 +
 +**Решение**
 +
 +Открыть ''eaccelerator.c'', найти
 +
 +<code>if (php_check_open_basedir(realfilename TSRMLS_CC)) {</code>
 +
 +Заменить на
 +
 +<code>if (php_check_open_basedir(p->realfilename TSRMLS_CC)) {</code>
 +
 +<code>
 +phpize
 +./configure
 +make
 +make test
 +make install
 +</code>
 +
 +<code>
 +service apache2 restart
 +service httpd restart
 +</code>
 +
 +Также есть версия, что достаточно указать дополнительный ключ при сборке ''--without-eaccelerator-use-inode''
 +
 +==== Class 'IntlDateFormatter' not found ====
 +
 +[[http://php.net/manual/en/intl.installation.php|http://php.net/manual/en/intl.installation.php]]
 +
 +<code>
 +yum install php-intl
 +apt-get install php5-intl
 +</code>
 +
 +===== Ссылки =====
 +
 +  * [[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 сессий]]