RU EN

PHPMD. Инструмент разработчика

 

Полезно периодически запускать MessDetector для отслеживания текущего состояния проекта.

Установка:

# Обновляем ранее установленные пакеты
pear update-channels
pear upgrade
# Установка phpmd
pear channel-discover pear.phpmd.org
pear channel-discover pear.pdepend.org
pear install --alldeps phpmd/PHP_PMD

Запуск скрипта:

phpmd ./ html codesize,unusedcode,naming > report.html
phpmd ./ xml codesize,unusedcode,naming > report.xml

Подробнее о правилах здесь.

Комментариев: 0
02.11.2012 22:38


Использование strace для отладки скриптов

 

Полезная Linux утилитка strace может помочь в отладке php-скриптов:

Определить какой конфиг использует программа:

strace php 2>&1 | grep php.ini
strace -e open php 2>&1 | grep php.ini

Почему программа не открывает файл:

strace -e open,access 2>&1 | grep your-filename

Узнать что делает процесс в данный момент, например при высоком cpu usage:

strace -p 15427
strace -p 15427 -o dump.txt

Какой именно системный вызов процесса занимает ресурсы CPU:

strace -c -p 11084

Почему невозможно подключиться к серверу:

strace -e poll,select,connect,recvfrom,sendto nc www.news.com 80

Информацию по дескрипторам можно посмотреть тут:

ls -la /proc/<pid>/fd/

Информацию по сетевым файлам можно посмотреть так:

lsof -i -a -p $<pid>
Комментариев: 0
12.05.2012 13:04


CodeSniffer

 

PEAR расширение CodeSniffer отличный способ для проверки соответствия кода проекта определённому стандарту. Устанавливается следующим образом:

pear install PHP_CodeSniffer
# Если PHP был установлен по нестандартному пути:
sudo ln -s /usr/local/php/bin/phpcs /usr/local/bin/phpcs

Конечно, такой способ установки требует, чтобы PHP был собран сключом --with-pear. После установки можно для удобства прописать следующий алиас в ~/.bashrc:

alias phpcs='phpcs --standard=PEAR --encoding=utf-8'

Для того, чтобы создать свой стиль, нужно создать в папке

/usr/local/php/lib/php/PHP/CodeSniffer/Standards

папку с названием совоего стиля, например MegaStyle :). В этой папке создать файл ruleset.xml. Например, чтобы создать стиль содержащий PEAR-стандарты, но добавить uppercase ключевые слова, TODO предупреждения и убрать стандарты комментирования нужно прописать:

<?xml version="1.0"?>
<ruleset name="MegaStyle">
 <description>A custom coding standard</description>

 <!-- Include the whole PEAR standard except LowerCaseConstant and FileComment -->
 <rule ref="PEAR">
  <exclude name="Generic.PHP.LowerCaseConstant"/>
  <exclude name="PEAR.Commenting.FileComment"/>
 </rule>

 <!-- Include some additional sniffs from the Generic standard -->
 <rule ref="Generic.PHP.UpperCaseConstant"/>
 <rule ref="Generic.Commenting.Todo"/>

</ruleset>
Комментариев: 0
17.01.2012 06:59


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

 

Кратко:

^      Начало регулярного выражения
$      Конец регулярного выражения
\A     Начало строки
\z     Конец строки
.      Один любой символ
\s     Один пустой символ (пробел, таб, символ перевода строки)
\S     Любой непустой символ
\d     Любая цифра
\D     Любая не цифра
\w     Любая буква и нижнее подчёркивание
\W     Не буква и не нижнее подчёркивание
\b     Граница слова (\bHello\b - совпадение с 'Hello')
(...)  Подвыражение (Subpattern)
(a|b)  a или b
?      Ноль или одно повторение чего-либо
*      Ноль и более
+      Один и более
{3}    3 повторения
{3,}   3 и более повторения
{3,6}  3-6 повторений

Ограничители (Delimiters)

При использовании PCRE (Perl Compatible Regular Expressions) в функциях, необходимо чтобы выражение было заключено в ограничители. Ими могут быть любые небуквенно-цифровые символы, не обратные слэши и не пустые символы (whitespace). Наиболее часто в качестве ограничителей используют прямой слэш '/', знак хэша '#' или тильду '~'. Например:

/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%

Если необходимо использовать символ ограничителя в выражении, он должен быть экранирован обратным слэшем:

'/http:\/\//'
'#http://#'

Функция preg_quote() может быть использована чтобы экранировать строку для внедрения её в выражение. Можно использовать второй необязательный параметр для экранирования конкретного символа:

<?php
$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // returns \$40 for a g3\/400
?>

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

/[a-z]/i

PCRE спецсимволы:

Любые из этих символов при использовании в регулярных выражениях в шаблонах соответствия, должны быть экранированы:

\ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Подмаски (Subpatterns):

Подмаски заключаются в круглые скобки и могут быть вложенными. Выделение части выражения в качестве подмаски делает 2 вещи:

  1. Определяет набор альтернатив. Например, подмаска cat(aract|erpillar|) соответствует одному из слов "cat", "cataract" и "caterpillar". Без заключения в скобки она бы соответствовала словам "cataract", "erpillar" или пустой строке.

  2. Подмаска становится захватываемым и возвращается в качестве соответствующего аргумента в PCRE функциях. Нумеруются захватываемые подмаски слева направо начиная с 1.

Например, строка "the red king", сопоставляемая подмаске ((red|white) (king|queen)), вернёт в качестве аргументов слова "red king", "red" и "king", которые будут пронумерованы 1, 2 и 3 соответственно.

Когда от подмаски не требуется функционала захвата подстрок, после открывающей круглой скобки ставится символ "?:". Такая подмаски исключается из нумерации захватываемых подмасок. Например, если строка "the white queen" сопоставляется с подмаской the ((?:red|white) (king|queen)), возвращаемые захваченные подстроки будут "white queen" и "queen" и будут пронумерованы 1 и 2 соответственно. Максимальное количество захватываемых подмасок в выражении - 99. Максимальное кол-во всех подмасок (захватываемых и нет) - 200.

Между знаками "?" и ":" в не захватываемой подмаске можно использовать дополнительные опции. Следующие два шаблона:

(?i:saturday|sunday)
(?:(?i)saturday|sunday)

соответствуют одинаковому набору строк. Так как альтернативы обрабатываются слева направо и опции действуют до конца подмаски, опция, установленная в первой части влияет на последующие. Поэтому приведённые выше шаблоны соответствуют как "SUNDAY", так и "Saturday".

Также можно использовать именованные подмаски с помощью синтаксиса (?P<name>pattern). Эта подмаска будет индексирована в массиве совпадений кроме обычного числового индекса, еще и по имени name. В PHP 5.2.2 было добавлено два альтернативных синтаксиса: (?<name>pattern) и (?'name'pattern).

Иногда бывает необходимо иметь несколько совпадений, исключающих друг друга. Обычно, каждое такое совпадение получает свой собственный номер, даже если шаблон позволяет совпасть только одному из них. Синтаксис (?| позволяет обойти это поведение и убрать дублирующиеся номера. Рассмотрим следующее регулярное выражение, сопоставленное со строкой Sunday:

(?:(Sat)ur|(Sun))day

Здесь Sun сохраняется в ссылке 2, тогда как ссылка 1 пуста. Если же совпадет Sat, то она будет помещена в ссылку 1, а ссылка 2 вообще не будет существовать. Использование (?| в шаблоне решает эту проблему:

(?|(Sat)ur|(Sun))day

В этом шаблоне обе подмаски Sun и Sat будут сохранены под номером 1.

Оригинальная документация.

Комментариев: 0
16.12.2011 05:48


Solarized PHP-подсветка

 

Наткнулся в интернете на сайт со страничкой, посвящённой по мнению автора ( Ethan Schoonover ) оптимальной цветовой гамме для восприятия человеком текста. Как сам автор описывает историю создания этой цветовой схемы:

"Летним днём я люблю почитать вне дома. Но не прямо на солнце, где слишком ярко, а где-нибудь в теньке, под деревом. Затенённая бумага приятно контрастирует с четким текстом. Если точно замерить цвета затенённой бумаги и текста на ней, то контраст будет значительно меньше, чем между белой бумагой и черным текстом. Чтение черного текста на белом фоне вашего монитора по контрасту близок к чтению при прямом солнечном свете и очень утомляет глаза. Цветовая гамма "Solarized" уменьшает контраст, но в отличие от других низко-контрастных схем сохраняет контрастирующие оттенки (базирующиеся на полутонах и соотношениях цветового круга) для удобства восприятия подсветки текста."

Идея мне кажется интересной. Взял на вооружение.

Комментариев: 0
28.09.2011 22:32