Все публикации

Создание поддомена +11
Mod Rewrite

в корневой директории создаем .htaccess с содержанием:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+)\.вашсайт\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.вашсайт\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/subdomains
RewriteRule ^(.*) %{HTTP_HOST}$1
RewriteRule ^(.*)\.вашсайт\.com(.*) /subdomains/$1$2
RewriteRule ^subdomains\.(.*) /subdomains/$1
и файл httpd.conf с содержанием:

<Directory /domains/вашсайт.com/html>
Options FollowSymLinks
AllowOverride All
</Directory>
<VirtualHost вашсайт.com>
ServerAdmin admin@вашсайт.com
ServerAlias *вашсайт.com
Virtual DocumentRoot /domains/вашсайт.com/html/%1
ServerName вашсайт.com
ErrorLog logs/вашсайт.com-error_log
CustomLog logs/вашсайт.com-access_log common
</VirtualHost>
В корне создаем папку subdomains
Пример:
хотим получить поддомен umax.вашсайт.com
1 - идем в subdomains и создаем там папку umax
2 - всё!

Работа по каталогам +9
Mod Rewrite

Часто хостинговые провайдеры накладывают ограничение на количество уикальных сайтов, и зачастую под это ограничение попадают и поддомены. Данное ограничение можно обойти средствами .htaccess. Например мы хотим направить поддомен forum.yourdomain.net на директорию ~/forum для этого необходимо направить нужные поддомены на папку с остновным сайтом и создать вложенную директорию например forum

RewriteEngine on
RewriteCond %{HTTP_HOST} ^forum\.yuordomain\.net$ [NC]
RewriteCond %{REQUEST_URI} !^/forum/$ [NC]
RewriteRule (.*) /forum/$1 [L]

Перенос домена +4
Mod Rewrite

Сайт перенесен с одного домена на другой с domain.com на domain2.com

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [R=301,1]
RewriteRule ^(.*)$ http://www.domain2.com/$1

Редирект при ошибке +2
Mod Rewrite

Перенаправление несуществующих URL на другой веб-сервер

RewriteEngine on
RewriteBase   /
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$1 

Остановка сайта в работе и его индексация +7
Mod Rewrite

Необходимо запрос любой страницы сайта отправлять на одну (будет написано что сайт временно ен доступен), но в то же время нужно оставить его открытым для поисковых машин. То есть для клиентов сайт закрыт, а для индексации - открыт.

RewriteEngine on
RewriteBase   /
RewriteCond %{HTTP_USER_AGENT} !^yandex.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^googlebot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^gaisbot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^rambler.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^aport.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^metacrawler.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^msnbot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^crawler.* [NC,OR]
RewriteRule ^/$ - [L,R]

Работа сайта по времени 0
Mod Rewrite

Указание доступа к сайту по времени
RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} > 900
RewriteCond %{TIME_HOUR}%{TIME_MIN} < 1800
RewriteRule .* - [ F ]

Запрет боту Google +4
Mod Rewrite

Жесткий запрет посещений нашего веб-сайта для робота поисковой системы Google

RewriteEngine on
RewriteCond %{USER_AGENT} Googlebot
RewriteRule .* - [F]
# Другой вариант возвращает вместо ошибки 403 ( FORBIDDEN ) ошибку 404 ( NOT _ FOUND ) 
RewriteCond %{USER_AGENT} Googlebot
RewriteRule .* - [R=404]

Динамическое подключение функций +10
ООП

Когда функций очень много их неудобно хранить все в одном файле, да и зачем подключать километр кода когда нужно воспользоваться всего лишь парой функций, собственно решение:

Cоздаем в корне папку fun в которой будут хранится наши функции, по одному файлу на каждую, имя файла должно соответствовать имени функции, для примера создадим файл test.php с функцией test

<?php
function test($val1, $val2, $val3){
	return $val1.$val2.$val3;
}
?>

Теперь класс который будет подключать наши функции
<?php
class fun{
	function __call($function, $value) {
		include_once $_SERVER['DOCUMENT_ROOT'].'/fun/'.$function.'.php';
		return call_user_func_array($function, $value);
	}
}
?>

Теперь воспользуемся нашей функцией "test"
<?php
$fun = new fun;
echo $fun->test('тра ','та ', 'та ');
//Выведет тра та та
?>

Вот и всё, проще же подключить всего один маленький класс вместо километра кода и вызывать функции $fun->ИмяФункцииКоторуюНужноВызвать(параметры);
И ещё, не мешало бы создать файл в той же папке fun с описанием каждой функции это поможет и вам и тем кто будет потом работать с вашим скриптом

Тест производительности

Провел тест, создал 1к функций
<?php
function function0($msg)
{
    $eng = array("_", "YA", "Ya", "ya", "yee",
        "YEE", "YO", "yo", "Yo", "ZH", "zh", "Zh",
        "Z", "z", "CH", "ch", "Ch", "SH", "sh",
        "Sh", "YE", "ye", "Ye", "YU", "yu", "Yu",
        "JA", "ja", "Ja", "A", "a", "B", "b", "V",
        "v", "G", "g", "D", "d", "E", "e", "I", "i",
        "J", "j", "K", "k", "L", "l", "M", "m", "N",
        "n", "O", "o", "P", "p", "R", "r", "S", "s",
        "T", "t", "U", "u", "F", "f", "H", "h", "W",
        "w", "x", "q", "Y", "y", "C", "c");
    $rus = array(" ", "Я", "Я", "я", "ые", "ЫЕ",
        "Ё", "ё", "Ё", "Ж", "ж", "Ж", "З", "з", "Ч",
        "ч", "Ch", "Ш", "ш", "Ш", "Э", "э", "Э", "Ю",
        "ю", "Ю", "Я", "я", "Я", "А", "а", "Б", "б",
        "В", "в", "Г", "г", "Д", "д", "Е", "е", "И",
        "и", "Й", "й", "К", "к", "Л", "л", "М", "м",
        "Н", "н", "О", "о", "П", "п", "Р", "р", "С",
        "с", "Т", "т", "У", "у", "Ф", "Ф", "Х", "х",
        "Щ", "щ", "ъ", "ь", "Ы", "ы", "Ц", "ц");
    return str_replace($eng, $rus, $msg);
}
//function1
//function2
//function3 итд
В каждом файле запустил 100 применений функций

test1.php - Тут все функции подключаются по старинке одним инклюдом
function0('abc');
function1('abc');
function2('abc'); итд

test2.php - Мой метод в котором происходит 100 инклюдов
$fun->function0('abc');
$fun->function1('abc');
$fun->function2('abc');
$fun->function3('abc'); итд



Первый запуск
/test1.php 0.230176925659/18261 кб
Последующие
/test1.php
0.206670999527/18262 кб //И стабильно Держится не падает ниже 2

Первый запуск
/test2.php 0.506945848465/1965 кб
Последующие
/test2.php 0.0756809711456/1965 кб //Держится стабильно

Хотя и первый запуск немного проигрывает в скорости, но вот в количестве занятой оперативки выигрывает на 90%
А в последующих запусках он вообще лидирует во всем
Что лучше, по моему очевидно smile

Модификаторы шаблонов PCRE +5
Регулярные выражения

Ниже перечислены все доступные на сегодняшний день модификаторы. Имя, взятое в круглые скобки, указывает внутреннее PCRE имя для данного модификатора.

i (PCRE_CASELESS)
Если этот модификатор используется, символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.

m (PCRE_MULTILINE)
По умолчанию PCRE обрабатывает данные как однострочную символьную строку (даже если она содержит разделители строк). Метасимвол начала строки '^' соответствует только началу обрабатываемого текста, в то время как метасимвол "конец строки" '$' соответствует концу текста, либо позиции перед завершающим текст переводом строки (в случае, если модификатор D не установлен). В Perl ситуация полностью аналогична. Если этот модификатор используется, метасимволы "начало строки" и "конец строки" также соответствуют позициям перед произвольным символом перевода и строки и, соответственно, после. Это соответствует Perl-модификатору \m. В случае, если обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит метасимволов '^' или '$', данный модификатор не имеет никакого эффекта.

s (PCRE_DOTALL)
Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем символам, включая перевод строк. Без него - всем, за исключением переводов строк. Этот модификатор эквивалентен записи /s в Perl. Класс символов, построенный на отрицании, например [^a], всегда соответствует переводу строки, независимо от наличия этого модификатора.

x (PCRE_EXTENDED)
Если данный модификатор используется, неэкранированные пробелы, символы табуляции и пустой строки в шаблоне игнорируются, если они не являются частью символьного класса. Также игнорируются все символы между неэкранированным символом '#' (если он не является частью символьного класса) и символом перевода строки (включая сами символы '\n' и '#'). Это эквивалентно Perl-модификатору \x, и позволяет размещать комментарий в сложных шаблонах. Замечание: это касается только символьных данных. Пробельные символы не фигурируют в служебных символьных последовательностях, к примеру, в последовательности '(?(', открывающей условную подмаску.

e
Если данный модификатор используется, preg_replace() после выполнения стандартных подстановок в заменяемой строке интерпретирует ее как PHP-код и использует результат для замены искомой строки.

Только preg_replace() реагирует на данный модификатор; остальными функциями он игнорируется.

Замечание: Этот модификатор недоступен в PHP 3.

A (PCRE_ANCHORED)
Если данный модификатор используется, соответствие шаблону будет достигаться только в том случае, если он соответствует началу строки, в которой производится поиск. Того же эффекта можно достичь подходящей конструкцией с вложенным шаблоном, которая реализуема в Perl.

D (PCRE_DOLLAR_ENDONLY)
Если данный модификатор используется, метасимвол $ в шаблоне соответствует только окончанию обрабатываемых данных. Без этого модификатора метасимвол $ соответствует также позиции перед последним символом, в случае, если им является перевод строки (но не распространяется на любые другие переводы строк). Данный модификатор игнорируется, если используется модификатор m. В языке Perl аналогичный модификатор отсутствует.

S
В случае, если планируется многократно использовать шаблон, имеет смысл потратить немного больше времени на его анализ, чтобы уменьшить время его выполнения. В случае, если данный модификатор используется, проводится дополнительный анализ шаблона. В настоящем это имеет смысл только для фиксированных шаблонов, не содержащих переменных ссылок.

U (PCRE_UNGREEDY)
Этот модификатор инвертирует жадность квантификаторов, таким образом они по умолчанию не жадные. Но становятся жадными, если за ними следует символ '?'. Такая возможность не совместима с Perl. Модификатор U также может использоваться внутри шаблона, при помощи '?U' записи.

X (PCRE_EXTRA)
Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: любой обратный слеш в шаблоне, за которым следует символ, не имеющий специального значения, приводят к ошибке. Это обусловлено тем, что подобные комбинации зарезервированы для дальнейшего развития. По умолчанию же, как и в Perl, слеш со следующим за ним символом без специального значения трактуется как as опечатка. На сегодняшний день это все возможности, которые управляются данным модификатором

J (PCRE_INFO_JCHANGED)
Модификатор (?J) меняет значение опции PCRE_DUPNAMES - подшаблоны могут иметь одинковые имена.

u (PCRE_UTF8)
Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: шаблоны обрабатываются как UTF8 строки. Модификатор u доступен в PHP 4.1.0 и выше для Unix-платформ, и в PHP 4.2.3 и выше для Windows платформ. Валидность UTF8 в шаблоне проверяется начиная с PHP 4.3.5.

Фильтрация входных данных в PHP +9
Безопасность

Фильтрация входных данных — одна из самых важных вещей, которой надо уделять внимание при разработке веб-сайта. Опытным программистам это известно, а новички пусть запомнят одну очень важную вещь:

Данным, полученным от пользователя, доверять нельзя.

Что это значит? А это значит то, что если нам нужно, чтобы пользователь ввел число, это совсем не означает, что он введет именно число. Он может ввести что угодно. И поэтому нам необходимо проверить корректность введенных пользователем данных и оградить себя от возможных вследствие этого ошибок и улучшить безопасность наших скриптов.

Обычно для этого пользуются регулярными выражениями, но начиная с версии 5.2.0, в PHP есть специальные функции, которые выполняют эту работу.


Введение
Как было отмечено выше, начиная с версии 5.2.0 в PHP присутствуют специальные функции для фильтрации данных. Одна из таких функций - filter_var. Сначала нам необходимо убедиться, что нужные нам функции установлены и доступны. Для этого напишем простенький скрипт:

<?php
if(function_exists('filter_list')){
echo 'Cписок фильтров установлен!';
}else{
echo 'Ошибка: фильтры не найдены.';
}
?>
Если все в порядке и функции фильтров установлены, давайте продолжим. Взглянем на список установленных фильтров. Получить список фильтров можно уже известной нам функцией filter_list:
<?php
echo '<ul>'."\n";
$filters=filter_list();
foreach($filters as $filter){   
echo '<li>'.$filter.'</li>'."\n";
}
echo '</ul>'."\n";
?>
В результате выполнения этой программы мы получим список фильтров, которыми можем пользоваться.


Три способа фильтрации данных
Существует три основных способа фильтрации входных данных:


Validate (проверка) — позволяет проверить и убедиться в том, что введенные данные действительно являются тем, что ожидается. Флаги проверки имеют префикс FILTER_VALIDATE_
Sanitize (очистка) — “Очищает” входящие данные. Убирает, экранирует или кодирует недозволенные символы. Флаги очистки начинаются с FILTER_SANITIZE_
Flags (флаги) — с помощью флагов вы можете задавать различные варианты поведения фильтров. Флаги бывают как общими для всех фильтров, так и специфические флаги для конкретных фильтров. Обычно они начинаются с FILTER_FLAG_
filter_var($var, FLAG[, FLAGS])
Функция filter_var() принимает как минимум два параметра — имя переменной, которую вы собираетесь фильтровать и флаг. Давайте начнем с примера, который очень часто требуется: валидация (проверка) корректности e-mail адреса. Для этого мы будем использовать функцию filter_var() и флаг FILTER_VALIDATE_EMAIL.
<?
$email='fgdjkdgdfghdsdfj';
$valid_email=filter_var($email,FILTER_VALIDATE_EMAIL);
?>
Результат работы этой функции имеет логический тип(bool) и принимает значение true если строка успешно прошла через фильтр, и false в обратном случае:
<?
if($valid_email!== false){
echo 'E-mail адрес корректный';
}else{
echo 'Некорректный E-mail адрес';
}
?>
Так как fgdjkdgdfghdsdfj — это, конечно же, некорректный e-mail адрес, то фильтр вернет false. Все очень просто, не так ли? Всего лишь вызов одной функции вместо громоздкого регулярного выражения.


Константы фильтров (флаги)
Давайте для примера создадим несколько различных переменных, на которых и будем демонстрировать наши фильтры.
<?
$int = 432;   
$bool = true;   
$float = 432.43;   
$reg = "/^([a-zA-Z0-9 ]){4,16}$/";   
$url = "http://devolio.com/blog";   
$email = 'joey@devolio.com';   
$ipaddr = '127.0.0.1';   
$ipres = "192.168.0.*";   
$ipv6addr = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";   
$string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234 567890`~!@#$%^&*()-_=+[{]};:'\"<,>.?/|\\n\\r\\t";   
$int_octal = decoct(800.82);   
$int_hex = dechex(800.82);
?> 
Также обратите внимание, что переменная $string содержит символы табуляции и переносы строк, для того чтобы лучше было видно что именно фильтруется.

Ниже представлены константы фильтров, которые мы будем использовть. Кстати говоря, это не все фильтры, которые существуют.


Проверка типа переменной и валидация*
* Валидация дает уверенность в том, что вы получите именно то что надо, или вообще ничего.

FILTER_VALIDATE_INT — проверка на целое число.
<?
$valid_int = filter_var($int, FILTER_VALIDATE_INT);
if($valid_int !== false){
// проверка прошла успешно, $valid_int — целое число
}else{
// проверка не прошла
}
?>
FILTER_VALIDATE_FLOAT — проверка на число с плавающей точкой

FILTER_VALIDATE_BOOLEAN — проверка на булево число

FILTER_VALIDATE_URL — проверка на URL-адрес

FILTER_VALIDATE_EMAIL — уже знакомая нам проверка e-mail адреса

FILTER_VALIDATE_IP — проверка IP-адреса

FILTER_UNSAFE_RAW — проверка на небезопасный, "сырой" текст.


Очистка данных
Очистка данных позволяет убрать или закодировать символы в контексте ваших потребностей.

FILTER_SANITIZE_STRING — базовая очистка строки. Удаляет символы <>?
<?
$san_string = filter_var($string, FILTER_SANITIZE_STRING);
?> 
FILTER_SANITIZE_STRIPPED — базовая очистка строки. Удаляет символы <>?

FILTER_SANITIZE_ENCODED — кодирует символы `~!@#$%^&*()=+[{]};:'".?/| в %hex

FILTER_SANITIZE_SPECIAL_CHARS — кодирует специальные символы <>&" в &type;

FILTER_SANITIZE_EMAIL — убирает символы <>();:,\”

FILTER_SANITIZE_URL — оставляет только a-zA-Z0-9`~!@#$%^&*()-_=+[{]};:'"<,>.?/|

FILTER_SANITIZE_NUMBER_INT — оставляет только 1234567890-+

FILTER_SANITIZE_NUMBER_FLOAT — оставляет только 1234567890-+.

FILTER_SANITIZE_MAGIC_QUOTES — кодирует '”\, точно так же как и magic quotes


Флаги
Флаги — это дополнительные параметры фильтров. Большинство флагов предназначено для конкретных режимов проверки/очистки.

FILTER_FLAG_ALLOW_OCTAL (только для фильтров *_INT) — разрешает восьмеричные цифры для фильтров *_INT.
<?
$allow_octal = filter_var($int_octal, FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_ALLOW_OCTAL);
?>
FILTER_FLAG_ALLOW_HEX (*_INT filters only) — разрешает шестнадцатиричные цифры для фильтров *_INT.

FILTER_FLAG_STRIP_LOW — вырезает все символы, код которых меньше 32 (ASCII)

FILTER_FLAG_STRIP_HIGH — вырезает все символы с кодами больше 127 (ASCII)

FILTER_FLAG_ENCODE_LOW — кодирует все символы, код которых меньше 32 (ASCII)

FILTER_FLAG_ENCODE_HIGH — кодирует все символы с кодами больше 127 (ASCII)

FILTER_FLAG_NO_ENCODE_QUOTES — игнорирует символы ' и "

FILTER_FLAG_ALLOW_FRACTION (только для фильтров *_NUMBER_FLOAT) — разрешает только 1234567890-+.

FILTER_FLAG_ALLOW_THOUSAND (только для фильтров *_NUMBER_FLOAT) — разрешает только 1234567890-+,

FILTER_FLAG_ALLOW_SCIENTIFIC (только для фильтров *_NUMBER_FLOAT) — разрешает только eE1234567890-+

FILTER_FLAG_SCHEME_REQUIRED (только для VALIDATE_URL) — требует присутствия схемы URL (http://, ftp:// и т.д.)

FILTER_FLAG_HOST_REQUIRED (только для VALIDATE_URL) — требует присутствия URL-хоста

FILTER_FLAG_PATH_REQUIRED (только для VALIDATE_URL) — требует присутствия URL-пути

FILTER_FLAG_QUERY_REQUIRED (только для VALIDATE_URL) — требует присутствия URL строки запроса

FILTER_FLAG_IPV4 (только для VALIDATE_IP) — требует, чтобы IP-адрес был в формате IPV4

FILTER_FLAG_IPV6 (только для VALIDATE_IP) — требует, чтобы IP-адрес был в формате IPV6

FILTER_FLAG_NO_RES_RANGE (только для VALIDATE_IP) — требует, чтобы IP-адрес не был в диапазоне зарезервированных адресов

FILTER_FLAG_NO_PRIV_RANGE (только для VALIDATE_IP) — требует, чтобы IP-адрес не был в диапазоне локальных адресов

FILTER_NULL_ON_FAILURE — Возвращает null вместо пустой строки, если не проходит проверка или какой-нибудь флаг

Облако тегов / Авторы