Программирование на PHP. Избавляемся от рутинных операций с помощью Phing

Владимир | | Phing, PHP, Web разработка.

Логотип статьи о Phing

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

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

Принцип работы следующий. Вы создаете xml файл, в который записываете необходимые группы действия (о синтаксисе этого файла немного ниже), после этого вы сможете выполнить любую группу действий всего одной командой. Т.е., по большому счету, phing можно считать «продвинутой» версией командных файлов.

Примечание. Проект Phing основан на Apache Ant о котором я уже писал. Синтаксис файлов практически одинаков, основная разница заключается в том, что ant ориентирован в первую очередь на Java, а phing – на PHP.

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

Прежде всего, разберемся, в каких случаях нет смысла применять Phing. Принцип очень простой. Чем больше и сложнее проект, тем больше выигрыш от использования Phing. Т.е. если ваш проект содержит больше одного-двух десятков файлов, вам имеет смысл подумать об использовании этого инструмента.

Переходим к установке. Phing распространяется в двух вариантах. В виде PEAR пакета и как отдельный дистрибутив.

Для первого варианта установка сводится к выполнению двух команд:
pear channel-discover pear.phing.info
pear install phing/phing

А второй – достаточно подробно описан в документации, и останавливаться на нем я не буду.

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

Для этого примера я взял проект с такой структурой:

public_html
	index.php
	js/
	css/
	system/
		application/
		............

Как видите, проект довольно простой, содержит две папки с таблицами стилей и JavaScript файлами, а в папке system – находится фреймворк CodeIgniter и php скрипты самого приложения (папка application).

Допустим, мы хотим передать кому-то архив с этим web приложением. Естественно, архив несложно создать вручную, всего пара кликов мышкой. Но подождите, если мы не хотим включать в него файлы фреймворка, то нам придется вручную сортировать файлы для архива.

Попробуем автоматизировать эту работу с помощью Phing.

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

<?xml version="1.0" encoding="UTF-8"?>
<project name="PhingTesting" default="packSrc" basedir=".">
	<target name="prepare">
		<mkdir dir="archive"></mkdir>
	</target>
	<target name="packSrc" depends="prepare"></target>
</project>

Разберем, что здесь написано.

Первая строка – обычный заголовок xml файла. Сразу за ней мы добавили тег project, внутри которого будут находиться все задачи данного проекта. Этот тег имеет три атрибута:
name – имя проекта;
default – имя задачи, которая будет выполняться по-умолчанию;
basedir – корневая папка проекта.

Внутри тега project может находиться любое количество тегов target, которые соответствуют конкретным задачам. Наша первая задача (строки 3-5) называется prepare и содержит всего одну операцию (task) – mkdir, которая создает папку.

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

Теперь выполняем команду

phing prepare

Примечание. Название файла может быть любым, но если оно отличается от build.xml его придется указывать явно (например, phing my_file.xml prepare).

Теперь переходим к созданию архива.

<target name="packSrc" depends="prepare">
	<zip destfile="archive/my_project.zip" basedir="public_html"></zip>
</target>

Для этого мы создадим еще одну задачу — packSrc. Кстати, обратите внимание на ее атрибут depends. В нем можно перечислить задачи, которые должны быть выполнены раньше текущей. В данном случае в этом атрибуте мы указали задачу prepare, т.е. теперь нам не нужно запускать ее вручную.

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

На данный момент в архив будет добавляться весь проект целиком. Исправляем ситуацию.

<zip destfile="archive/my_project.zip">
	<fileset dir="public_html">
		<include name="index.php"></include>
		<include name="css/**"></include>
		<include name="js/**"></include>
		<include name="system/application/**"></include>
	</fileset>
</zip>

Как видите, мы добавили вложенный тег fileset, который предназначен для создания набора файлов. Добавление и удаление конкретных файлов и папок в набор выполняется тегами include и exclude, в атрибуте name которых указывают конкретное имя.

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

Кроме того, с помощью Phing можно запускать тесты, создавать документацию (PHPdocumentor), переименовывать файлы и папки, менять их содержимое, «заливать» файлы на сервер и выполнять множество других операций. К тому же вы всегда сможете расширить функциональность любой из стандартных задач Phing или написать свою собственную.

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