Загрузка данных
 
Логин:   Пароль:      
Регистрация   Забыли пароль?

15 горячих:

рейтинг     сила
:) 1,19 :( 0,4

Tracker

Профиль
   Блог  RSS
Всяко разно это не заразно.

TrackerXAMPP и Python

Ранее я описал как настроить в XAMPP PHP и виртуальные хосты, а так же как сконфигурировать Perl.
Сейчас настроим Python в XAMPP.
Для того чтобы настроить Python в XAMPP надо:

1. Скопировать файл mod_python.so в каталог modules(чаще всего /lampp/modules).

Откуда скопировать mod_python.so?

Для Ubuntu достаточно установить sudo apt-get install libapache2-mod-python

После чего можно найти файл командой find /usr/ -name mod_python.so

У меня файл находился в каталоге /usr/lib/apache2/modules/mod_python.so

sudo cp /usr/lib/apache2/modules/mod_python.so /opt/lampp/modules/

2. Добавляем в файл /lampp/etc/httpd.conf следующие строки

LoadModule python_module modules/mod_python.so

3. Добавляем в файл lampp/etc/extra/httpd-vhosts.conf следующие строки:

Строки добавляются внутри блока описания виртуального хоста.

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

4. Создаем тестовый файл test.py.

def index(req):
return «Test successful»;


Примечание:
Есть три типа PythonHandler:
— mod_python.psp — дает возможность встраивать код Python в код HTML страницы
— mod_python.publisher — работа скрипта через расширение mod_python
— mod_python.cgihandler — работа скрипта через механизм CGI

Проверку версии Python и mod_python можно быстро используя в XAMPP PHP функцию phpinfo().

Версию и расположение Python можно проверить командами в терминале:
python -V
locate python

Источники
A Brief Introduction to Apache's mod_python Module
Tracker 9 октября 2009 11:06 комментариев: 0
:) 0 :(

TrackerXAMPP и Perl

Ранее я описал как настроить в XAMPP PHP и виртуальные хосты.
Для того чтобы настроить в XAMPP правльную работу с CGI скриптами надо:

1. Создать каталог cgi-bin

2. Создать файл .htaccess внутри каталога cgi-bin и записать в него следующие:
Options +ExecCGI

Альтернативный метод, написать в файле конфигурации виртуального хоста следующие:
<Directory /usr/local/apache/htdocs/somedir>
Options +ExecCGI

Если вы хотите запускать скрипты из корневого каталога сайта добавьте ExecCGI в Options.

3. Указываем в файле конфигурации виртуального хоста(обычно для XAMPP /opt/lampp/etc/extra/httpd-vhosts.conf) где
сервер должен искать скрипты
ScriptAlias /cgi-bin/ <здесь ваш путь к каталогу cgi-bin>

4. Для того чтобы скрипт мог быть выполнен необходимо установить бит запуска:
chmod a+x <здесь имя вашего файла>

5. Не забываем, что cgi скрипт должен выдать серверу тип содержимого, а так же
правильный путь к интерпретатору. Пример скрипта:

<code class="cgi">
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
print "$key --> $ENV{$key}<br>";
}
</code>


6. Если что-то не получается всегда смотрим в лог сервера.

Ссылки на дополнительный материал
Dynamic Content with CGI
A Beginner's Introduction to Perl Web Programming
Метки: XAMPP Apache Perl
Tracker 30 сентября 2009 11:12 комментариев: 0
:) 0 :(

TrackerАрхивирование и разархивирование в ZF

Вместе с Zend Framework версии 1.10 появиалась возможность использовать архивирование и разархивирование информации.

Новые компоненты Zend_Filter_Compress и Zend_Filter_Decompress обеспечивают унифицированный API для нескольких форматов архивирования.
Доступны следующие форматы: BZ2, GZ, LZF, RAR, TAR and ZIP.

Работать можно не только со строками, но так же с файлами и целыми каталогами.
Каждый формат архивирования обеспечивается отдельным адаптером. Наиболее легкий путь для обеспечения поддержки нового формата архивирования это добавить новый адаптер.

Немного примеров.
Для архивирования строки с помощью BZ2 необходим следующий код:
<code class="php">
$filter = new Zend_Filter_Compress('bz2');
$input = "Uncompressed content";
$output = $filter->filter($input);
</code>


$output содержит архивированные данные.
Для обратной операции, чтобы получить оригинальную ситроку используется следующий код:

<code class="php">$filter = new Zend_Filter_Decompress('bz2');
$result = $filter->filter($output);
</code>


Как видно из примеров, архивирование и разархивирование очень простой процесс.

Архивирование и разархивирование файлов столь же простой процесс как и архивирование строки.
Дайте вместо строки название файла и укажите адаптеру где сохранить архив.

<code class="php">$filter = new Zend_Filter_Compress(array(
'adapter' => 'bz2'
'options' => array(
'archive' => 'myarchive.bz2'
)
);
$result = $filter->filter('\\path\to\myfile.ext');
</code>


Файл с именем le myfile.ext будет заархивирован и сохранен в myarchive.bz2.
Так же можно архивировать целые каталоги, но будьте внимательны когда вы работаете с базовым каталогом на сервере. Ваш сервер будет на долгое время под нагрузкой.

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

Перед вами пример элемента textarea где вносятся комментарии к книгам. Для экономии места возможно присоединить фильтр к элементу и сохранить архивированную строку в БД. В случае необходимости показать содержимое комментария из БД прежде будет необходимо разархивировать строку.

<code class="php">$element = new Zend_Form_Element_TextArea('myarea');
$element->addFilter('Compress', array('zip'));
</code>


Есть множество моментов когда архивирование и разархивирование информации является эффективным методом решение задачи. Для этих целей логично использовать Zend_Filter_Compress.

Удачи!

Источник
Compression and Decompression for ZF
Tracker 24 сентября 2009 12:21 комментариев: 0
:) 0 :(

СтатьиPHP 5.3 - Функциональный, часть 1 - Что такое анонимные функции и Замыканя?

Одно из наиболее восхитительных нововведений в PHP 5.3 это в первую очередь анонимные функции. Возможно вы слышали о них как о замыканиях или лямбда вражениях. There's a lot of meaning behind these terms so let's straighten it all out.

Какие есть различия между Анонимными функциями, Лямбдами и Замыканиями?

Как вы увидите понятия «Анонимные функции», «Лямбды» и «Замыкания» крутятся вокруг новых возможностей PHP 5.3. Даже URL php.net/closures направляет к php.net/manual/functions.anonymous.php. Разница между понятиями «лямбда» и «анонимная функция» не существует. Для любых намерений и целей эти два слова есть одна и таже концепция основанная на базе лямбда замыканий. Языки с анонимными функциями рассматривают функцию как тип, такой же как целый тип или логический. Анонимные функции могут выступать в качестве аргумента функции или даже могут быть возвращены как результат.

Уточним это на примере:
<code class="php">
<? php
$lambda = function() {
echo «I am an anonymous function,
aka a lambda!

»;
};
$anonymousFunction = $lambda;
$anonymousFunction();
// Output: I am an anonymous function, aka a lambda!

function nCallsTo($n, $function) {
for($i = 0; $i < $n; $i++) {
$function();
}
return function() { echo «I am also an anonymous function!

»; };
}

$anotherAnon = nCallsTo(3, $anonymousFunction);
// Output:
// I am an anonymous function, aka a lambda!
// I am an anonymous function, aka a lambda!
// I am an anonymous function, aka a lambda!

$anotherAnon();
// Output: I am also an anonymous function!
?>
</code>

Отметим как мы не присвоили имя функции, мы присвоили функцию как значение переменной так же как строку или любой другой примитив. Затем мы присвоили ее другой переменной. Функция сейчас значение, она не имеет имени, отсюда термин «анонимная функция». Затем мы создали функция с именем nCallsTo которая получает два аргумента, $n — количество раз которое мы должны вызвать анонимную функцию $function.

Анонимные функции открывают дверь для разработки с использованием функций высшего порядка в PHP. nCallsTo это функция высшего порядка по двум причинам: 1)она берет функцию как аргумент, и 2) она возвращает функцию как значение. Функции высшего порядка открывают дверь для таких методов работы как map/reduce которые заслуживают внимания сами по себе. Основной смысл лямбда и анонимных функций, это функции которые могут быть значениями.

Если анономные функции это значения, тогда как PHP рассматривает их тип?

Разберемся в этом:

<code class="php"><? php 
$lambda = function() { echo «anonymous function»; };
echo gettype($lambda). '

';
// Output: object
echo get_class($lambda). '

';
// Output: Closure
?> </code>


О замыканиях в PHP 5.3

Что такое замыкание? Это не совсем правильное определение. На самом деле мы не имели замыканя дажа тогда, когда PHP присвоил всем анонимным функциям тип Замыкание. Тем не менее мы не получили пока еще замыканя, давайте посмотрим на одно из них:

<? php
function letMeSeeAClosure() {
$aLocalNum = 10;
return function() use (&$aLocalNum) { return ++$aLocalNum; };
}
$aClosure = letMeSeeAClosure();
echo $aClosure();
// Output: 11
echo $aClosure();
// Output: 12
$anotherClosure = letMeSeeAClosure();
echo $anotherClosure();
// Output: 11
echo $aClosure();
// Output: 13
echo $aLocalNum;
// Notice: Undefined Variable: aLocalNum

?>

Переварите это хотя бы минуту. Не прада ли, занятная штука? $aLocalNum локальная переменная определенная в простратстве функции letMeSeeAClosure. С использованием нового синтаксиса переменная $aLocalNum ограничена или связанна созданием замыканя. Это дает возможность возвращать Замыкание удерживая связьс $aLocalNum даже после выхода $aLocalNum из лексической области видимости когда функция вернула результат. Уведомление об ошибке возникает при попытке обращения к $aLocalNum непосредственно из-за пределов видимости функции.

В кратце, термины, «Лямбда» или «анонимная функция» относятся к той же концепции: функции, которые являются значениями. Замыкания относятся к родственному, но разному понятию: время жизни переменной, что является «замкнутой над», или в PHP 5.3 использованной путем замыкания, ограничено или продлено замыканием. Анонимные функции которые построены с использованием ключевых слов, также замкнуты. как уже упоминалось, в php 5.3, анонимные функции введены как замкнутые и имеют три слова. В части высокго порядка дает понимание того, что php 5.3 теперь включает в себя языковые особенности для анонимных функций и замыканий.

Источник
Functional PHP 5.3 Part I — What are Anonymous Functions and Closures?
Tracker 20 августа 2009 14:53 комментариев: 0
:) 0 :(

Tracker15 регулярных выражений PHP для веб разработчиков

Регулярные выражения

Для многих новичков регулярные выражения кажутся тяжелыми для изучения и использования. На самом деле, они гораздо менее жесткие чем вы думаете. Прежде чем погружаться в глубь регулярных выражений с полезным и повторно используемым кодом, давайте быстро посмотрим основы:


Синтаксис регулярных выражений

foo Строка «foo»
^foo «foo» в начале строки
foo$ «foo» в конце строки
^foo$ «foo» когда он один на строку
[abc] a, b, или c
[a-z] Любые символы в нижнем регистре
[^A-Z] Любые символы не в верхнем регистре
(gif|jpg) Совпадение или «gif или „jpg“
[a-z]+ Один или несколько символов в нижнем регистре.
[0-9.-] Любая цифра, точка или знак минус
^[a-zA-Z0-9_]{1,}$ Любое слово, по крайней мере, одна буква, число или _
([wx])([yz]) wy, wz, xy, или xz
[^A-Za-z0-9] Любой символ (не буква и не цифра)
([A-Z]{3}|[0-9]{4}) Совпадение из трех букв или четырех цифр


Регулярные функции PHP

preg_match() Функция preg_match() ищет строку по шаблону, возвращает true если шаблон найден или false в противном случае.
preg_match_all() Функция preg_match_all() соответствует всем вхождения шаблона в строку.
preg_replace() Функция preg_replace() работает так же, как ereg_replace(), за исключением того, что регулярные выражения могут быть использованы в шаблоне и замене входных параметров.
preg_split() Функция preg_split() работает точно так же, как и функция split(), за исключением того, что регулярные выражения в качестве входного параметра шаблона.
preg_grep() Функция preg_grep() ищет все элементы в input_array, возвращает все элементы которые совпали с шаблоном регулярного выражения.
preg_ quote() Цитировать регулярное выражение символов.

Проверка доменного имени
Проверка содержимого строки на правильное доменное имя

<code class="php">$url = „<a href="http://komunitasweb.com/">komunitasweb.com/</a>“;
if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i', $url)) {
echo „Your url is ok.“;
} else {
echo „Wrong url.“;
}
</code>


Подстветка слов в тексте
Это очень полезное регулярное выражение находит специфические слова в тексте и подсвечивает их.
Чрезвычайно полезно для результатов поиска.

<code class="php">$text = „Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor“;
$text = preg_replace(»/b(regex)b/i«, '1', $text);
echo $text;</code>


Подсветка результатов поиска в блогах WordPress
Как я только что сказал предыдущий кусок кода очень полезен для результатов поиска, вот один из примеров как использовать его в блогах WordPress.
Откройте файл search.php и найдите функцию the_title(). Замените ее на следующие:

<code class="php">echo $title;</code>


Теперь, после того как изменена строка, добавьте следующий код:

<code class="php"><? php
$title = get_the_title();
$keys= explode(» «,$s);
$title = preg_replace('/('.implode('|', $keys) .')/iu',
'<strong>\0</strong>',
$title);
?></code>


Сохраниет файл search.php и откройте style.css. Добавьте следующую строку:
strong.search-excerpt { background: yellow; }

Получить все изображения из HTML документа.
Если вы постоянно ломали голову о том чтобы иметь возможность получить все изображения на веб-странице, это должно быть для вас. Вы должны легко создать загрузчик изображения используя мощь cURL.

<code class="php">$images = array();
preg_match_all('/(img|src)=(»|')[^«'>]+/i', $data, $media);
unset($data);
$data=preg_replace('/(img|src)(»|'|=«|=')(.*)/i',»$3«,$media[0]);
foreach($data as $url)
{
$info = pathinfo($url);
if (isset($info['extension']))
{
if (($info['extension'] == 'jpg') ||
($info['extension'] == 'jpeg') ||
($info['extension'] == 'gif') ||
($info['extension'] == 'png'))
array_push($images, $url);
}
}
</code>


Удалить повторяющиеся слова (не чувствительна к регистру)
Часто встречаются повторяющиеся слова? Это отличное регулярное выражение будет вам в помощь.

<code class="php">$text = preg_replace(»/s(w+s)1/i«, „$1“, $text);</code>


Удаление дублирующие знаки препинания
То же, что и выше, но со знаками препинания. Прощай повторяющиеся запятые!

<code class="php">
$text = preg_replace(»/.+/i«, „.“, $text);
</code>


Совпадение XML / HTML тегов
Эта простая функция получает два аргумента. Первый, это тег который надо найти, а второй аргумент это переменная содержащая XML или HTML. Еще раз, это может быть очень мощным инструментом вместе с cURL.

<code class="php">
function get_tag( $tag, $xml ) {
$tag = preg_quote($tag);
preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}',
$xml,
$matches,
PREG_PATTERN_ORDER);

return $matches[1];
}
</code>


Совпадение XML / HTML тегов с точным значение атрибута
Эта функция очень похожа на предыдущую, но она позволяет сравнить атрибут с точки зрения конкретного свойства. Например, можно легко сравнить.

<code class="php">function get_tag( $attr, $value, $xml, $tag=null ) {
if( is_null($tag) )
$tag = '\w+';
else
$tag = preg_quote($tag);

$attr = preg_quote($attr);
$value = preg_quote($value);

$tag_regex = „/<(“.$tag.»)[^>]*$attr\s*=\s*«.
„(['\“])$value\\2[^>]*>(.*?)<\/\\1>/»

preg_match_all($tag_regex,
$xml,
$matches,
PREG_PATTERN_ORDER);

return $matches[3];
}
</code>


Сравнение шестнадцатеричного значения цвета
Еще один интересный инструмент для веб разработчика! Он дает возможность сравнить/проверить шестрадцатеричное значение цвета

<code class="php">$string = «#555555»;
if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) {
echo «example 6 successful.»;
}
</code>


Найти титул страницы
Этот удобный кусочек кода найдет и распечататет текст внутри тегов HTML-страницы.

<code class="php">$fp = fopen(«<a href="http://www.catswhocode.com/blog">www.catswhocode.com/blog</a>»,«r»);
while (! feof($fp) ){
$page .= fgets($fp, 4096);
}

$titre = eregi(«(.*)»,$page,$regs);
echo $regs[1];
fclose($fp);
</code>


Анализ лога Apache
Множество веб сайтов запущено на хорошо нам знакомом веб сервере Apache. Если ваш веб сервер тоже Apache, что на счет примененения PHP и регулярных выражение для анализа лога?
<code class="php">//Logs: Apache web server
//Successful hits to HTML files only. Useful for counting the number of page views.
'^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+«(?: GET|POST|HEAD) ((?#file)/[^ ?»]+?.html?)??((?#parameters)[^ ?«]+)? HTTP/[0-9.]+»s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+«((?#referrer)[^»]*)«s+»((?#user agent)[^«]*)»$'

//Logs: Apache web server
//404 errors only
'^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+«(?: GET|POST|HEAD) ((?#file)[^ ?»]+)??((?#parameters)[^ ?«]+)? HTTP/[0-9.]+»s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+«((?#referrer)[^»]*)«s+»((?#user agent)[^«]*)»$'
</code>


Замена двойных кавычек
Если вы любитель печатник вы возможно полюбите это регулярное выражение, которое дает вам возможность заменить нормальные двойные кавычки на smart quotes. Регулярное выражение подобное этому используется для содержимого WordPress.

<code class="php">preg_replace('B»b([^«x84x93x94rn]+)b»B', '?1?', $text);</code>



Сложная проверка пароля
Это регулярное выражение тестирует поступающие данные на содержание 6 или более символов и одной цифры, знака подчеркивания идефиса.

<code class="php">'A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z'
</code>


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

<code class="php"><? php if (have_posts()): ?>
<? php while (have_posts()): the_post(); ?>

<? php
$szPostContent = $post->post_content;
$szSearchPattern = '~<img [^>]* />~';

// Run preg_match_all to grab all the images and save the results in $aPics
preg_match_all( $szSearchPattern, $szPostContent, $aPics );

// Check to see if we have at least 1 image
$iNumberOfPics = count($aPics[0]);

if ( $iNumberOfPics > 0 ) {
// Now here you would do whatever you need to do with the images
// For this example the images are just displayed
for ( $i=0; $i < $iNumberOfPics; $i++ ) {
echo $aPics[0][$i];
};
};
</code>

endwhile;
endif;
?>

Автоматическая генерация улыбок
Другая функция используемая для WordPress, поможет автоматически заменит все символы улыбки на изображения

<code class="php">$texte='A text with a smiley :-)';
echo str_replace(':-)','<img src="http://smileys/souriant.png">',$texte);
</code>


Источник

15 PHP regular expressions for web developers


Комментарий
Мое IMHO. для начинающих.
Основная ошибка начинающих это попыкта составить очень сложное выражение.
Мой совет, не пытайтесь, лучше разбейте его на подвыражение и применяйте их как фильтр или сито в вашем коде, сочетая код с функциями регулярных выражений.
Когда лучше применить регулярное выражение?.
Мой опыт подсказвает, когда стандартных функций обработки строк становиться недостаточно и приходит мысль написать собственную функцию фильтрации строки. Вы ее напишете в любом случае, но выгледеть она будет понятнее и проще, а так же будет более универсальной.
Что такое создание регулярного выражения — это программирование детерменированного или не детерменнированого автомата, поэтому говорить о человеческой логике не приходится.
Мой совет почитать книгу Дж.Фридл „Регулярные выражения“, чтобы в голове устоялось.
Tracker 29 июля 2009 12:07 комментариев: 0
:) 0 :(

TrackerPHP/JS соревнование: Выиграй iPhone 3G S!

iPhone 3G S WIN
Многие из вас знают, недавно мы запустили две новые категории на ThemeForest это функции PHP и JavaScript компонентов. Чтобы увеличить наш выбор, мы подумали и решили, может быть весело если мы проведем небольшой конкурс на Nettuts +.
Как это работает? Предложение: Авторы трех лучших материалов к этим категориям, в период до 14 августа, получат призы, и экспозиции, любезно предоставленные CSSRockstars.com

ИСТОЧНИК
PHP/JS Competition: Win an iPhone 3G S!

З.Ы.
Всем кто не против скрестить шпаги в честном бою приглашаются на конкурс.
Этот конкурс провожу не я лично и не php.com.ua
Tracker 29 июля 2009 10:51 комментариев: 0
:) 0 :(

СтатьиДелаем жизнь лучше с SPL автозагрузчиком

Сколько из нас видели код подобный этому:

<code class="php"><?php
require '/path/to/lib/DatabaseI.php';
require '/path/to/lib/Database.php';
require '/path/to/lib/Authenticate.php';
require '/path/to/lib/User.php';
require '/path/to/lib/BlogEntry.php';
require '/path/to/lib/Comments.php';
require '/path/to/lib/TemplateLoader.php';
?></code>


… и конечно вы знаете почему…

Если вы хоть какое-то время были в деле, вы распознаете это потому, что едва ли не каждый PHP разработчик делал это по той или иной причине, до тех пор пока не узнал о SPL's функциях автозагрузки.

Это отличная особенность встроенная в PHP называется spl_autoload_register(). Это отличная функция позволяет нам определить callback функцию, которую можно затем использовать для автоматической загрузки.

Например:

<code class="php"><?php
set_include_path(realpath('/path/to/lib') . PATH_SEPARATOR . get_include_path());
function autoload($className)
{
require($className . '.php');
}

spl_autoload_register('autoload');
$Database = new Database();
?>
</code>


Вот оно! Вот все, что необходимо для определения своего собственного автозагрузчика. Этот автозагрузчик будет пытаться автоматически получить файлы, необходимые для подключения классов которые вы вызываете.

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

Теперь кто-то возможно думает: Подождите, мои классы организованы в библиотеки и размещены в собственных каталогах. Мне не нужно определить все те каталоги, да?

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

* Создание списка, когда приложение выполняется впервые, а также разрешить автозагрузчику реконструировать свой список если что-то не найдено, а потом грациозно упасть.
* Создание списка на лету и хранить его в памяти (memcached, APC и т.д.)
* Если есть жестко-закодированный список, бросать исключение, если вызывается класс вне этого списка.
* Применять правила именования PECL, а также использовать регулярные выражения или explode(), чтобы получить путь к файлу.

Поскольку функция spl_autoload_register() позволяет вам написать любую логику какая вам нравится, вы можете создать строгие или не очень правила, как вам больше нравится.

Таким образом spl_autoload_register() делает длинные операторы include или require не нужными!


Источник
Making Life Better With The SPL Autoloader
Метки: PHP SPL Autoloader
Tracker 28 июля 2009 15:47 комментариев: 0
:) 0 :(

TrackerПрактика функционального программирования - первый журнал о функциональном программировании

Tracker 21 июля 2009 22:12 комментариев: 0
:) 0 :(

СтатьиКак отлаживать PHP код в Vim и XDebug на Linux

Рассмотрим сценарий: У вас есть множество разработчиков зарегестрированных на Linux сервере на котором запущен Apache и PHP, для написания кода используется Vim. Для отладки кода используется error_log и команда echo. Это длиться вечность, это скучно и приводит к ошибкам из-за забытых отладочных переменных. Вы пристально и с завистью смотрите на .NET программистов с их фантастическим отладчиком(тихо посмеиваетесь, зная что с Vim в любом случае сделаете в 10 раз быстрее). Но вы осознаете, что есть лучший выход.

Вот он.

Вот как это работает. Вы кодируете в vim, нажимаете F5. Vim ждет соединения с PHP сервером.
Вы обновляете(в браузере) PHP страницу над которой работаете. Происходит попытка соединения с Vim — соединение удачно. Вы попадаете в отладочную сессию внутри Vim. Вы можете входить внутрь, ходить по ним и выходить из операторов, вычислять переменные, получать все переменные в контексте, устанавливать и получать все свойства, устанавливать и удалять точки остановки, все делать на лету. В заключение, некоторые реальные инструменты программирования.

Окружение: Vim

Сперва мы должны быть уверенны, что vim скомпилирован правильно.

Тип: версия Vim и проверка особенностей раздела. Если у вас есть +python и +signs, все хорошо. Пропустить текст ниже и перейдите к следующему разделу.
В противном случае, вам необходимо собрать Vim из исходников. В Linux, загрузите и распакуйте исходный код, и откройте src/feature.h. Вы должны закомментировать некоторый код вокруг +signs функции. В Vim 7.1, она выглядит так:

/*
* +signs Allow signs to be displayed to the left of text lines.
* Adds the «: sign» command.
*/
#if defined(FEAT_BIG) || defined(FEAT_SUN_WORKSHOP) \
|| defined(FEAT_NETBEANS_INTG)
# define FEAT_SIGNS
# if ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
&& defined(HAVE_X11_XPM_H)) \
|| defined(FEAT_GUI_GTK) \
|| (defined(WIN32) && defined(FEAT_GUI))
# define FEAT_SIGN_ICONS
# endif
#endif
Вы должны закомментировать оба if оператора и соответствующие endif, выгладит приблизительно так:
/*
* +signs Allow signs to be displayed to the left of text lines.
* Adds the «: sign» command.
*/
/*#if defined(FEAT_BIG) || defined(FEAT_SUN_WORKSHOP) \
|| defined(FEAT_NETBEANS_INTG)*/
# define FEAT_SIGNS
/*# if ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
&& defined(HAVE_X11_XPM_H)) \
|| defined(FEAT_GUI_GTK) \
|| (defined(WIN32) && defined(FEAT_GUI))*/
# define FEAT_SIGN_ICONS
/*# endif
#endif*/
затем перейти назад к корневому каталогу исходников и запустить команду:
./configure --enable-pythoninterp
На 64-bit системах или системах без python инсталяции вы должны добавить --with-python-config-dir=/usr/lib64/python2.3/config к конфигурационной строке. Если конфигурационный скрипт не может найти конфигурационный каталог он об этом сообщит, но если конфигурация ошибочна не явно — вы должны убедиться что все что касается python в порядке.
После конфигурирования сделайте следующие:
make && make install
для инсталяции вашего нового пропитониного vim.

Клиент: Debugger.vim (и Debugger.py)

Теперь vim готов, скачайтеDBGp клиентский скрипт. Распакуйте два файла (debugger.vim и debugger.py) в ваш vim plugin каталог (обычно ~/.vim/plugin) или домашний .vim каталог. В Vim 7.1 скомпилированном под Linux, по умолчанию загружаются все плагины находящиеся в каталоге /usr/local/share/vim/vim71/plugin/, таким образом вы можете положить два файла туда. Попытайтесь запустить vim — если нет ошибок, все будет хорошо. Если есть ошибки, дважды проверьте: версию, убедитесь для уверенности что там есть +python и +signs. Если они есть, оставьте ваш комментарий к статье с полученной ошибкой. Если нет, компиляция/инсталляция vim не работает — вернитесь назад и попробуйте заново.
Теперь ваши отладки клиент готов. Теперь давайте настроим сервер.

Сервер (движок): XDebug

Скачайте XDebug. Скачайте исходники и скомпилируйте .so файл, добавьте следующие строки в ваш php.ini:
[Zend]
zend_extension = /полный/путь/к/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_host = localhost
Откройте файл в вашем браузере который выводит <? php phpinfo(); ?> для того чтобы убедиться, что xdebug загружен.
xdebug phpinfo
Теперь, на вашем сайте my_project.com, перейдите на страницу my_project.com/index.php? XDEBUG_SESSION_START=1. Это установит кукисы в вашем браузере, время жизни которых истечет через 1 час, которые дадут команду PHP XDebug модулю произвести попытку соединения каждый раз, когда страница загружена, с отладчиком клиента который прослушивает порт 9000. В случае если невозможности соединения, оно будет держать соединение со страницей, нет другого способа оставить кукисы живыми(актуальными).

Теперь вернитесь назад в vim и нажмите F5. Вы должны увидеть сообщение «waiting for a new connection on port 9000 for 5 seconds…» внизу экрана. Вы имеете 5 секунд для обновления PHP страницы. Это создаст соединение между отладчиком и клиентом. Теперь вы в отладчике. Следуйте инструкциям в окне помощи для хождения по коду. Нажмите F5 для запуска кода после точки остановки(которую вы можете установит комбинацией: Bp)
xdebug vim php

Но что если у меня множество разработчиков на одной машине?

Нет проблем. Установите g: debuggerPort в каждый .vimrc разработчиков чтобы клиенты слушали разные порты. Таким образом, если вы желаете чтобы один разработчик соединялся по 9001 порту вместо стандартного 9000-го, вы устанавливаете g: debuggerPort = 9001
Заставить сервер соединяться по различным портам немного сложнее. Вам надо установить модифицированные значения (xdebug.remote_port) в php.ini для каждого пользователя. Это отлично работает если вы используете VirtualHost’s в php_value xdebug.remote_port 9001.
Теперь перезапустите Apache и если вы используете VirtualHost и это vi пользователь, они должны удачно соединиться.

Об этом

Пожалуйста оставляйте любые вопросы или предложения которые у вас есть. Я надеюсь, это поможет некоторым из вас кто хочет отладочный инструмент, но не хочет оставлять редактирование в Vim. Так же, будьте уверены, сообщение о любом альтернативном методе или любом патче или улучшении к vim скрипту удаленного PHP отладчика будут включены сюда.

[Примечание: Это первый пост в серии постов где мы будем создавать учебные пособия, инструменты которые мы создали, тех. комментарии, и так далее. Вы можете оформить подписку, а также оставить какие-либо замечания, отзывы и предложения ниже, так что мы могли бы с каждой статьей улучшать материал! Спасибо!]


Источник
Метки: PHP VIM XDebug
Tracker 20 июля 2009 13:50 комментариев: 0
:) 1 :(

СтатьиИспользование фильтров в PHP5

Вышла очередная статья на сайте www.devshed.com «Using Filters in PHP 5» в которой рассматривается пример использования PHP библиотеки фильтров.

Не вдаваясь в словесные подробности английского текста рассмотрим примеры использования фильтров в PHP.

Какие фильтры нам доступны?

Следующий пример выведет все фильтры доступные вам:

<code class="php"><?php

// пример использования функции 'filter_list()'
foreach(filter_list() as $id => $filter)
{
echo '<p> Filter Name: ' . $filter . ' ------------- Filter ID: ' . filter_id($filter) . '</p><hr />';
}
?></code>


Вывод будет похож на следующий:

Filter Name: int — Filter ID: 257
Filter Name: boolean — Filter ID: 258
Filter Name: float — Filter ID: 259
Filter Name: validate_regexp — Filter ID: 272
Filter Name: validate_url — Filter ID: 273
Filter Name: validate_email — Filter ID: 274
Filter Name: validate_ip — Filter ID: 275
Filter Name: string — Filter ID: 513
Filter Name: stripped — Filter ID: 513
Filter Name: encoded — Filter ID: 514
Filter Name: special_chars — Filter ID: 515
Filter Name: unsafe_raw — Filter ID: 516
Filter Name: email — Filter ID: 517
Filter Name: url — Filter ID: 518
Filter Name: number_int — Filter ID: 519
Filter Name: number_float — Filter ID: 520
Filter Name: magic_quotes — Filter ID: 521
Filter Name: callback — Filter ID: 1024


Теперь разберем примеры применения функций фильтров.

Пример 1
<code class="php"><?php
$input = '123456';
// Проверяем переменную $input на integer
echo filter_var($input, FILTER_VALIDATE_INT);
?></code>


Вывод: 123456

Комментарий:
В данном случае для PHP не имеет значение какой тип имеет аргумент числовой либо строчный, будьте внимательны.

Пример 2

<code class="php"><?php
$input = 123456;
// Проверяем переменную $input на integer
echo filter_var($input, FILTER_VALIDATE_INT);
?></code>


Вывод: 123456

Пример 3

<code class="php"><?php
$input = 1.2;
// Проверяем переменную $input на integer
echo filter_var($input, FILTER_VALIDATE_INT);
?></code>


Вывод: пусто

Комментарий: В данном случае функция filter_var вернет FALSE и по этому ничего не будет выведено на экран, легко убедится в этом использовав функцию var_dump();

Как контролировать вхождения значения в определенный диапазон?

Пример 4

<code class="php"><?php
$min = 1;
$max = 99;
$input = 101;
if(filter_var($input, FILTER_VALIDATE_INT, array("options" => array("min_range" => $min, "max_range"=> $max ))) === FALSE)
{
echo 'Ошибкак: Введеное значение должно быть между 1 и 99.';
}
else
{
echo 'Ввод корректен';
}
?></code>


Комментарий:
Аргументами функции filter_var могут быть не только флаги, но и массив options, а так же «callback» фильтр.
Так же можно задать список аргументов поступающих в функцию filter_var следующим образом:
$chek_rules = array('filter'=>FILTER_VALIDATE_INT, array(«options» => array(«min_range» => $min, «max_range»=> $max )));

Пример 5

<code class="php"><?php
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)); // проверка соответствие email правилам.
var_dump(filter_var('example.com', FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED));// проверяем соответствие URL правилам.
?>
</code>



Типы фильтров
Фильтры делятся на три группы:

Проверочные фильтры:FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE, FILTER_VALIDATE_EMAIL, FILTER_VALIDATE_FLOAT, FILTER_VALIDATE_INT, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE, FILTER_VALIDATE_REGEXP, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED.

Санитарные фильтры:FILTER_SANITIZE_EMAIL, FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_MAGIC_QUOTES, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_SANITIZE_NUMBER_INT, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_SANITIZE_STRIPPED, FILTER_SANITIZE_URL, FILTER_UNSAFE_RAW.

Другие фильтры:FILTER_CALLBACK


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

Пример 6

<code class="php"><?php
error_reporting(E_ALL | E_STRICT);
/* data actually came from POST
$_POST = array(
'product_id' => 'libgd<script>',
'component' => '10',
'versions' => '2.0.33',
'testscalar' => array('2', '23', '10', '12'),
'testarray' => '2',
);
*/

$args = array(
'product_id' => FILTER_SANITIZE_ENCODED,
'component' => array('filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
'options' => array('min_range' => 1, 'max_range' => 10)
),
'versions' => FILTER_SANITIZE_ENCODED,
'doesnotexist' => FILTER_VALIDATE_INT,
'testscalar' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
),
'testarray' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
)

);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);
echo "\n";
?></code>


Вывод:

array(6) {
[«product_id»]=>
array(1) {
[0]=>
string(17) «libgd%3Cscript%3E»
}
[«component»]=>
array(1) {
[0]=>
int(10)
}
[«versions»]=>
array(1) {
[0]=>
string(6) «2.0.33»
}
[«doesnotexist»]=>
NULL
[«testscalar»]=>
bool(false)
[«testarray»]=>
array(1) {
[0]=>
int(2)
}
}


Комментарий: Если вы пытаетесь получить данные формы с одинаковым именем вы должны использовать флаг
'flags' => FILTER_REQUIRE_ARRAY`.

К примеру:
<code class="html"><form>
<input name="t1[]" value="Some string One" />
<input name="t1[]" value="Another String Two" />
</form></code>


Определение вашего фильтра должно выглядеть следующим образом:
<code class="php">$args = array(
't1' => array(
'name' => 't1',
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_REQUIRE_ARRAY)
);</code>



Пример 7

<code class="php"><?php
function toDash($x){
return str_replace("_","-",$x);
}

echo filter_var("asdf_123",FILTER_CALLBACK,array("options"=>"toDash"));
// returns 'asdf-123'
?></code>


Комментарий: Особенностью фильтра FILTER_CALLBACK является указание callback функции в качистве значения массива options.

Использует Zend Framework фильтры?
Нет, если вы посмотрите в исходники классов ZF вы найдете следующие

/opt/lampp/ZendFramework/library/Zend/Validate/Int.php
Zend_Locale_Format:: isInteger

/opt/lampp/ZendFramework/library/Zend/Locale/Forma.php
<code class="php">  

/**
* Returns the first found number from an string
* Parsing depends on given locale (grouping and decimal)
*
* Examples for input:
* ' 2345.4356,1234' = 23455456.1234
* '+23,3452.123' = 233452.123
* ' 12343 ' = 12343
* '-9456km' = -9456
* '0' = 0
* '(-){0,1}(\d+(\.){0,1})*(\,){0,1})\d+'
* '١١٠ Tests' = 110 call: getNumber($string, 'Arab');
*
* @param string $input Input string to parse for numbers
* @param array $options Options: locale, precision. See {@link setOptions()} for details.
* @return string Returns the extracted number
* @throws Zend_Locale_Exception
*/
public static function getNumber($input, array $options = array()) {

..............

// Get correct signs for this locale
$symbols = Zend_Locale_Data::getList($options['locale'],'symbols');

// Parse input locale aware
$regex = '/([' . $symbols['minus'] . '-]){0,1}(\d+(\\' . $symbols['group'] . '){0,1})*(\\' .
$symbols['decimal'] . '){0,1}\d+/';
preg_match($regex, $input, $found);

..............
</code>


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

Жду ваших комментариев по поводу ZF?
Метки: PHP 5 filters
Tracker 20 июля 2009 10:49 комментариев: 0
:) 0 :(
© 2008 | О сайте | Инструкции | Обратная связь
© Powered by BigStreet

Работа с БД:
 Время - 0.0199
 Запросов - 13
Работа с кэшем:
 Время - 0.0038
 Записей - 1
 Прочтений - 4
Общее время:
 0.1273