Дек 17

На офсайте нажимаем на «Get FirePHP».
Далее скачиваем серверную часть.
Потом её каким-нибудь образом встраиваем в проект. К примеру (коллега такое сделал):

	public static function fb()
	{
		if (!ob_get_level()) {
			ob_start();
		}

		$instance = FirePHP::getInstance( true );

		$args = func_get_args();
		return call_user_func_array( array( $instance, 'fb' ), $args );
	}

Собственно всё – после этого в консоли будет удобный вывод всяких массивов и т.п. (например, при обращении к <>::fb( array(1,2,3) ) )

Теги:
Ноя 12

Бывает, что в проекте при возникновении ошибки формируется и отправляется e-mail при помощи обычного php-шного mail().
При этом хочется получать это сообщение при разработке на своей локальной машине с Windows.
Вот программа под названием «Test Mail Server Tool»:
TestMailServerToolSetup.
Её нужно запустить, после чего все мэйлы будут перенаправляться на программу отправки мэйлов (к примеру, Thunderbird).

Вот статья о том, как настроить Sendmail-заглушку для Linux. Всё сводится к скрипту

#!/bin/sh
prefix="/var/mail/sendmail/new"
numPath="/var/mail/sendmail"

if [ ! -f $numPath/num ]; then
echo "0" > $numPath/num
fi
num=`cat $numPath/num`
num=$(($num + 1))
echo $num > $numPath/num 

name="$prefix/letter_$num.txt"
while read line
do
echo $line >> $name
done
chmod 777 $name
/bin/true

и прописыванию в php.ini sendmail_path = /usr/bin/fake_sendmail.sh.

Теги:
Окт 31

В общем-то это ссылки по теме:
ссылка на статью на сайте лиссяры: Веб сервер на много коннектов и высокую нагрузку (nginx+php-fpm+mysql);
очень всё банально и просто – из портов без настройки: http://habrahabr.ru/blogs/server_side_optimization/67152/;
очень хорошая статья про настройку этого дела: http://habrahabr.ru/blogs/server_side_optimization/70167/
В каждой из статей куча ссылок на другие.
Ссылки по настройке NginX – http://www.job-blog.bullgare.ru/2009/10/настройка-nginx-ссылки/

Теги:
Окт 25

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

array('#name' => '', '#value' => '', '#attrs' => array(), '#type' => '')

Причём входные массивы могут быть различными:
«простой тег»

array('tag' => 'value')

«сложный тег»

array('#name' => 'tag', '#value' => 'value')

и массив тегов

array('tag' => array(array('nested_tag' => array('nested' => 'value1')), array('nested_tag' =>'value2')))

Причём они могут вкладываться друг в друга для генерации сложных XML-структур.
Без tdd, ясное дело, не обошлось.
В итоге имеем класс для генерации подобных массивов с тестами к нему.
Все файлы в приложении (код самого класса, тесты)

Ну и полный код с примером использования:
full_example

Теги:
Окт 06

Навеяно http://habrahabr.ru/blogs/webdev/70903/ – много чего идеологически взято оттуда.
Но код там написан неудобно для меня, поэтому написал свой класс (3 класса) для фильтрации пользовательского контента.

Делает следующее: вырезает все неразрешённые теги, в разрешённых при этом удаляет все неразрешённые атрибуты.
После этого для всех ссылок на сторонние сайты проставляет атрибут target=»_blank». После этого проверяет все атрибуты всех тегов, где может встречаться ссылка (img src, к примеру) и если протокола нет среди разрешённых (используется parse_url), добавляется http://.
Работает небыстро.
Использовать при публиковании.
TagsStripper – здесь все классы
index – пример использования
TestTagsStripper – тесты

Теги:
Сен 29

http://www.phppodcasts.com/

Теги:
Сен 25

Если на сервере стоит версия php >= 5.0 (а сложно представить другое;)), то удобнее всего пользоваться классом SimpleXML.
Здесь я опишу работу с ним.

Создание объекта

2 основных способа – через конструктор и через factory-функцию simplexml_load_string.
Второй способ лучше тем, что при ошибке создания объекта вернёт false.
Правда, при этом будет выдавать E_WARNING, что не очень приятно.
Но есть способ побороться с этим – использовать функцию http://www.php.net/manual/en/function.libxml-use-internal-errors.php, которая запрещает вывод ошибок при парсинге XML-данных и позволяет приложению управляться с ними самому.
Соответственно, создание объекта SimpleXML можно реализовать так:

<?php
    public static function parse2Obj($xmlString)
    {
        libxml_use_internal_errors(true);
        $xmlObj = @simplexml_load_string($xmlString);//на всякий случай;)
        if ($xmlObj === false)
            return false;
        return $xmlObj;
    }

Дальнейшая работа с данными

Далее нужно обработать полученные данные.
Здесь всё достаточно просто: каждый из XML-нодов представляет теперь объект класса SimpleXML.
Т.е. к любому узлу можно обратиться примерно так:

$xml->movie[0]->plot;

При этом если используются спецсимволы в «имени свойства», то можно сделать так:

$xml->movie->{'great-lines'}->line;

Для нескольких дочерних элементов можно использовать циклы

foreach ($xml->movie as $movie)
{
   echo $movie->plot, '<br />';
}

При этом, правда, есть нюансы – к примеру, неправильно отрабатывает count($xml->movie).
Для нормальной работы необходимо использовать метод children (странное название):

$t = $xml->movie->children();
foreach ($t as $movie)
{
   echo $movie->plot, '<br />;
}
Теги:
Сен 24

cURL — это свободная кроссплатформенная служебная программа командной строки для передачи файлов по различным протоколам с синтаксом URL.

Использование cURL в php

При использовании под Windows лучше для надёжности скопировать файлы libeay32.dll и ssleay32.dll из папки с php в system32.
Представляет собой (не знаю, как всё устроено внутри, но как выглядит «наружу») объект, который инициализируется factory-функцией, после чего можно при помощи своеобразных сеттеров установить необходимые свойства, а потом запустить выполнение.
Использование:

$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);
fclose($fp);

Т.е. все сводится к вызову curl_init, нескольким вызовам curl_setopt, затем curl_exec и curl_close.
Разберём эти функции подробнее (полный список – здесь):

curl_init

resource curl_init  ([ string $url = NULL  ] )

Инициализирует новую сессию и возвращает её дескриптор («создаёт объект»).
Опционально можно передать урл, тогда будет установлено свойство CURLOPT_URL (можно установить и позже).

curl_setopt

bool curl_setopt  ( resource $ch  , int $option  , mixed $value  )

Основная функция. Устанавливает «свойство» для указанного первым параметром «объекта».
resource $ch – дескриптор cURL-сессии
int $option – опция («свойство») (задаётся не целым числом, а предопределёнными константами)
mixed $value – значение.
Самое интересное здесь – эти самые предопределённые константы, в них вся сложность. Все они перечислены на официальном сайте, хоть и не по алфавиту немного.

curl_exec

mixed curl_exec  ( resource $ch  )

Выполняет cURL-запрос.
Возвращает обычно true/false, но если установлен параметр CURLOPT_RETURNTRANSFER, то при успешном выполнении вернёт ответ.

curl_close

void curl_close  ( resource $ch  )

Закрывает cURL-сессию и освобождает все ресурсы, в том числе и переданный $ch.

Вспомогательные функции:

curl_errno

int curl_errno  ( resource $ch  )

Возвращает номер ошибки или 0, если всё прошло хорошо.

curl_error

string curl_error  ( resource $ch  )

Возвращает описание ошибки или », если всё прошло хорошо.

curl_getinfo

mixed curl_getinfo  ( resource $ch  [, int $opt = 0  ] )

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

Пример

$ch = curl_init();
//задаём url
curl_setopt($ch, CURLOPT_URL, "http://mysite:90/myuri");
//подделываем юзер-агента
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; 3305; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
//переходить по редиректам, инициируемым сервером, пока не будет достигнуто CURLOPT_MAXREDIRS (если есть)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//устанавливаем HTTP-заголовки (приходится устанавливать все, т.к. функция затирает дефолтные)
$headers = array
	(
		"Host: mysite:90",
		"Referer:  http://mysite:90/anotherurl",
		"Accept: */*",
		"Accept-Charset: utf-8,windows-1251,*",
		"Accept-Language: ru"
	);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//не включать заголовки ответа сервера в вывод
curl_setopt($ch, CURLOPT_HEADER, false);
//вернуть ответ сервера в виде строки
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (curl_errno($ch))
{
	//обработка ошибки, используя curl_error()
}
curl_close($ch);

*Формат строк для массива HTTP-заголовков – такой же, как и в функции header()

Теги:
Сен 23

Функция header в php используется для посылки HTTP-заголовков (почитать на w3.org).
Continue reading »

Теги:
Сен 20

Статья по установке
что такое Cygwin
что такое php-fpm
Забавно то, что при ребилде php постоянно вылазили ошибки с доступом.
Как потом случайно удалось выяснить, дело было в Avira AntiVir.

Теги:
preload preload preload