Сен 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

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

Теги:
Сен 19

Изучаем PHP, Часть 1: Страница регистрации, формы и взаимодействие с базой данных
Изучаем PHP, Часть 2: Загрузка файлов на сервер и использование XML для хранения информации о файлах
Изучаем PHP, Часть3: Аутентификация, работа с потоками данных, объекты и исключения

Техническая библиотека

Теги:
Сен 18

http://zendframework.com/manual/ru/coding-standard.html

Теги:
Сен 18

Установка
Скачать
После помещения библиотеки в папку с расширениями в php.ini надо написать

zend_extension = <путь-к-php>\ext\php_xdebug.dll

Далее ставим плагин для firefox – Xdebug Helper, настройка всего инструментария – в базе знаний Google
Работа с Xdebug под Eclipse
ещё про установку и настройку xdebug,
Профилирование с Xdebug на habrahabr.
Самое основное – параметр в php.ini

xdebug.profiler_enable_trigger=On

В итоге у меня получилось (php5.3)

zend_extension = путь-к-php53\ext\php_xdebug.dll
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.idekey=default

;xdebug.dump_once = On
;xdebug.dump_globals = On
;xdebug.dump_undefined = On
;xdebug.dump.REQUEST = *
;xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

xdebug.profiler_enable=Off
xdebug.profiler_output_dir="c:\traces"
xdebug.profiler_enable_trigger=On
xdebug.profiler_output_name="cachegrind.out.%R-%t"

Теперь достаточно передать в GET-параметре ?XDEBUG_PROFILE (вот как раз тут полезен XdebugHelper – там это можно включить для определённого сайта).
много ссылок на полезные статьи.
Инструмент для анализа логов Xdebug от создателя.

Дебаг проекта через NetBeans совместно с XdebugHelper:
запустить отладчик в NetBeans и затем нажать кнопку «run» (это NetBeans заставит слушать Xdebug), а затем открыть сайт с активированным на нём XdebugHelper’ом.

Теги:
Сен 18

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

путь-к-php\pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com

Теперь можно установить PHPUnit

путь-к-php\pear install phpunit/PHPUnit

При этом может поругаться на версию PEAR. Надо обновить – см. заметку по установке PEAR.
Если не получилось установить с помощью PEAR.
После этого нужно писать тесты.
Подойдёт что-то вроде

ModelAdv.php

<?
//инициализация - можно вынести в отдельный файл
$_SERVER['HTTP_HOST'] = 'my_project';
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['QUERY_STRING'] = '';
//возникают ошибки, т.к. не все серверные переменные установлены
ini_set('display_errors','off');
error_reporting(E_ERROR);
require_once ('S:/wamp/www/moikompas/htdocs/init.php');
ini_set('display_errors','on');
error_reporting(E_ALL);

ini_set('include_path', ini_get('include_path') . ';путь-к-проекту;путь-к-PEAR;.');

require_once 'PHPUnit/Framework.php';

echo "--started--\n";

//--инициализация
/*
//это для тестирования контроллера - для задания всех его свойств
cfg::init('/groups/test/');

//здесь идёт передача управления контроллеру.
//вывод нам не нужен
ob_start();
require_once ('htdocs/index.php');
ob_clean();*/

//загружаем тестируемый класс (если нет автозагрузки)
load::c('adv');

//собственно сами тесты
class AdvTest extends PHPUnit_Framework_TestCase
{
	public function test_renderOpenxBannerOnPage()
	{
		$params =
			array
			(
				array
				(//всё правильно
					'in' 	=> array ('category' => 'biznes', 'place' => 'modules_top'),
					'out' 	=> array ('zoneid' => 74, 'n' => 'a1ebea39')
				),
				array
				(//всё правильно - вернуть умолчание
					'in' 	=> array ('category' => 'biznes', 'place' => 'modules_middle'),
					'out' 	=> array ('zoneid' => 2, 'n' => 'a159618f')
				),
				array
				(//неверная категория - вернуть умолчание
					'in' 	=> array ('category' => 'biznes1', 'place' => 'modules_top'),
					'out' 	=> array ('zoneid' => 73, 'n' => 'ae343b6d')
				),
				array
				(//неверное место показа - вернуть ''
					'in' 	=> array ('category' => 'biznes', 'place' => 'modules_to'),
					'out' 	=> ''
				),
				array
				(//неверная категория и место показа - вернуть ''
					'in' 	=> array ('category' => 'biznes12', 'place' => 'modules_to'),
					'out' 	=> ''
				),
			);
		foreach ($params as $par)
		{
			$out = adv::renderOpenxBannerOnPage($par['in']['category'], $par['in']['place'], true);
			$this->assertEquals($out, $par['out']);
		}
	}
	public function test_renderOpenxBannerByParams()
	{
		$params =
			array
			(
				array
				(//всё правильно
					'in' 	=> array ('bannerpage' => 'compas', 'place' => 'top', 'category' => 'biznes'),
					'out' 	=> array ('zoneid' => 45, 'n' => 'ae7d79d4')
				),
				array
				(//всё правильно
					'in' 	=> array ('bannerpage' => 'compas', 'place' => 'right', 'category' => 'razvlecheniya'),
					'out' 	=> array ('zoneid' => 29, 'n' => 'a14675ed')
				),
				array
				(//всё правильно
					'in' 	=> array ('bannerpage' => 'index', 'place' => 'right', 'category' => null),
					'out' 	=> array ('zoneid' => 7, 'n' => 'a2a070c5')
				),
				array
				(//всё правильно - вернуть умолчание
					'in' 	=> array ('bannerpage' => 'index', 'place' => 'top', 'category' => 'biznes'),
					'out' 	=> array ('zoneid' => 5, 'n' => 'abff2e70')
				),
				array
				(//страница компаса, неверная категория - вернуть умолчание
					'in' 	=> array ('bannerpage' => 'compas', 'place' => 'top', 'category' => ''),
					'out' 	=> array ('zoneid' => 44, 'n' => 'abf29464')
				),
				array
				(//неверное место показа - вернуть ''
					'in' 	=> array ('bannerpage' => 'index', 'place' => '', 'category' => 'biznes'),
					'out' 	=> ''
				),
			);
		foreach ($params as $par)
		{
			$out = adv::renderOpenxBannerByParams($par['in']['bannerpage'], $par['in']['place'], $par['in']['category'], true);
			//var_dump($out);
			$this->assertEquals($par['out'], $out);
		}
	}
}
?>

Запускать из папки с исполняемыми файлами php (где php.exe):

phpunit.bat путь-к-папке-tests\ModelAdv.php

А дальше – поехало: tdd, xp.

Ссылки по теме:
документация по установке,
документация по написанию тестов,
phpUnderControl (зачем?)

Теги:
Сен 18

Установка PEAR под Windows

путь-к-php\go-pear.bat

лично у меня работать не захотело (php5.3), пока не изменил bat-файл на следующий:

@ECHO OFF
set PHP_BIN=php.exe
%PHP_BIN% -d output_buffering=0 -d phar.require_hash=0 PEAR\go-pear.phar
pause

после этого для установки переменных окружения (если это нужно):

путь-к-php\PEAR_ENV.reg

или добавить путь-к-php в переменную PATH.
Может понадобиться обновить PEAR:

путь-к-php\pear upgrade PEAR
Теги:
Сен 08

При разработке сайта под большую нагрузку нужно постоянно искать слабые места в коде. К примеру, при добавлении нового функционала на частопосещаемой странице появился кусок кода (функция, метод), который заметно замедляет работу проекта в целом. Нет пределов совершенству, и проект можно вылизывать до бесконечности, но на что стоит обратить внимание – подскажет профайлер кода. Лично я использую в работе APD (Advanced PHP Debugger). Во-первых, он хранится в репозитории модулей PHP, во-вторых, мне понравилось им пользоваться, в-третьих, у автора есть достаточно подробное описание в книге «Профессиональное программирование на PHP», в-четвёртых, простота использования. Из минусов – давно не обновлялся и, видимо, уже заброшен разработчиком.
Установка производится с помощью инсталлятора PEAR

#pear install apd

После чего в файл php.ini необходимо добавить установленное расширение и произвести настройку. (Приведу для примера параметры для Windows)

zend_extension = <Путь к установленному php>\ext\php_apd.dll
apd.dumpdir = c:\apd_traces\ ; здесь будут храниться промежуточные файлы трассировок
apd.statement_trace = 1

Если вызвать phpinfo(), должен появиться раздел с параметрами APD.
Использование.
Активизируется трассировка путём включения в нужный php-файл вызова функции

apd_set_pprof_trace('c:\TEMP\apd_traces');

Протоколируется следующие события:

  • вход в функцию
  • выход из функции
  • использование инструкций include и require

.
При этом ведутся 3 счётчика:

  • Real Time – прошедшее реальное время
  • User Time – время, затраченное на пользовательский код
  • System Time – время, затраченное на системные вызовы

.
После того, как файлы созданы (т.е. скрипт отработал), можно, к примеру, закомментировать строку вызова

apd_set_pprof_trace('c:\TEMP\apd_traces');

(она больше не нужна).
При установке APD из репозитория в папке
<Путь к php>\PEAR\Console\ появится файл pprofp.
Далее можно создать файл, к примеру, run.bat:

php.exe pprofp -r c:\TEMP\apd_traces\pprof.00288.53 > c:\TEMP\apd_out_rmT.txt

где c:\TEMP\apd_traces\pprof.00288.53 – это промежуточный файл трассировок, созданный при выполнении скрипта, а c:\TEMP\apd_out_rmT.txt будет создан и будет содержать полезную информацию в удобной форме.
Можно, конечно, создать и более «умный» батник, котороый бы принимал имя промежуточного файла параметром, но статья не об этом.
В итоге в файле увидим время выполнения функций и количество вызовов, что в дальнейшем должно помочь писать более «быстрый» код.

Теги:
Сен 06

при переустановке windows можно обойтись без переустановки apache, mysql и php
Continue reading »

Теги:
preload preload preload