Strategies for Landing an Oracle DBA Job as a Fresher
Putting Phing to Work for You
1. Putting Phing to Work for You
Hans Lellelid
International PHP Conference
2007-11-05
2. Introduction
• My name is Hans Lellelid
• Developer & Manager at Applied Security,
Inc. (near Washington DC).
• PHP developer and OO evangelist.
• I ported Phing to PHP5 in 2004.
• I now manage the Phing project with
Michiel Rook.
Hans Lellelid: Putting Phing to Work for You 2
3. What is it?
• PHing Is Not Gnumake
• It is a project build tool.
• Original PHP4 version by Andreas Aderhold
• Written for PHP5
• Based on Apache Ant
• Cross-platform (i.e. Windows too)
• http://phing.info/
Hans Lellelid: Putting Phing to Work for You 3
4. Workshop Topics: Fundamentals
• Phing basics
• Creating a first build file
• Transforming directories and files
• Performing PDO tasks
• Gathering user input
• Building phpdoc
• Running unit tests
• Integrating with CI tools
Hans Lellelid: Putting Phing to Work for You 4
5. Workshop Topics: Extension
• Using PHP code in a build file
• Building a simple Task
• Writing more complex Task
• Creating a shared Type
• Custom filters
• Custom selectors
• Custom logger/listener
• Custom input handlers
Hans Lellelid: Putting Phing to Work for You 5
7. Install Phing
• Install via PEAR
– pear channel-discover pear.phing.info
– pear install phing/phing
• Install “traditional” package
– Available on Download page
• Install from SVN
– svn co http://svn.phing.info/trunk phing
Hans Lellelid: Putting Phing to Work for You 7
8. Following Along
• Install via PEAR
– pear install phing/phing
– Install “traditional” package
• Available on Download page
– Install from SVN
• svn co http://svn.phing.info/trunk phing
Hans Lellelid: Putting Phing to Work for You 8
9. The phing script
• A wrapper shell script for phing.php script.
• Sets default logger to use (dependent on
system)
• Typical usage: phing [target]
• Other useful options:
– Help (-h)
– Specify properties (-Dpropname=value)
– List targets (-l)
– Get more output (-verbose or -debug)
Hans Lellelid: Putting Phing to Work for You 9
10. Buildfiles
• Build files are XML
• Build files are composed of:
– Tasks: a “build-in” piece of code that a
specific function. E.g. <mkdir>
– Types: data structures that are used
commonly by tasks. E.g. <path>
– Targets: grouping of Tasks that perform a
more general function. E.g. Copy files to a
new directory.
– A Project: the root node for the build file.
Hans Lellelid: Putting Phing to Work for You 10
11. A simple build file
<project name=quot;samplequot; default=quot;mainquot;>
<property name=quot;verquot; value=quot;1.0.1quot;/>
<property file=quot;build.propertiesquot;/>
<target name=quot;mainquot;>
<mkdir dir=quot;./build/${ver}quot;>
<copy todir=quot;./build/${ver}quot;>
<fileset dir=quot;.quot;
includes=quot;*.txtquot; />
</copy>
</target>
</project>
Hans Lellelid: Putting Phing to Work for You 11
12. Javaisms
• Properties
– Properties are variables for build scripts.
– Like php.ini, but more flexible:
• tgz = ${pkg}-${ver}.tgz
– Can be set in build script or imported from
files.
• Dot-path notation for class names:
– path.to.Class = path/to/Class.php
– Represents directory and class name in a
single string.
Hans Lellelid: Putting Phing to Work for You 12
13. Control Structures
• depends, if, and unless attributes provide
control over target execution condition and
sequence.
• <if> task provides a more familiar (to
developers) control structure that can be
used within a target.
Hans Lellelid: Putting Phing to Work for You 13
15. Match a bunch of files
• The <fileset> type represents an
extremely powerful way to select a
group of files for processing
• Many built-in tasks support <fileset>
Hans Lellelid: Putting Phing to Work for You 15
16. Fileset Examples
<fileset dir=quot;./webappquot;
includes=quot;**/*.htmlquot;
excludes=quot;**/test-*quot;/>
<fileset dir=quot;./webappquot;>
<include name=quot;img/${theme}/*.jpgquot;/>
<include name=quot;tpl/${lang}/*.phtmlquot;/>
<exclude name=quot;**/*.bakquot;/>
<exclude name=quot;**/test/**quot;/>
</fileset>
Hans Lellelid: Putting Phing to Work for You 16
17. Fine-tuned Selection
• Selectors provide entirely new dimensions
for <fileset> file matching criteria.
• Some examples of selectors:
– Created before/after certain date
– Greater/less than specified size
– Type ('file' or 'dir')
– At specific depth in dir structure
– Having corresponding file in another dir.
Hans Lellelid: Putting Phing to Work for You 17
18. Selector examples
<fileset dir=quot;${htdocs.dir}quot;>
<includes name=”**/*.html”/>
<containsregexp
expression=quot;/prodd+.phpquot;/>
</fileset>
<fileset dir=quot;${dist}quot; includes=quot;**quot;>
<or>
<present targetdir=quot;${htdocs}quot;/>
<date datetime=quot;01/01/2007quot;
when=quot;beforequot;/>
</or>
</fileset>
Hans Lellelid: Putting Phing to Work for You 18
19. Filesystem Transformations
• The <mapper> element adds filesystem
transformation capabilities to supporting
tasks (e.g. <copy>, <move>).
• For example:
– Change all “.php” files to “.html”
– Remove dirs from filename
– Change all files to the same filename
• Custom mappers can be defined.
Hans Lellelid: Putting Phing to Work for You 19
20. Mapper examples
<copy todir=quot;/tmpquot;>
<mapper type=quot;globquot; from=quot;*.phpquot;
to=quot;*.php.bakquot; />
<fileset dir=quot;./appquot;
includes=quot;**/*.phpquot; />
</copy>
<copy todir=quot;${deploy.dir}quot;>
<mapper type=quot;regexpquot;
from=quot;^(.*)-(.*).conf.xmlquot;
to=quot;1.2.phpquot;/>
<fileset dir=quot;${config.src.dir}quot;
includes=quot;**/*.conf.xmlquot; />
</copy>
Hans Lellelid: Putting Phing to Work for You 20
21. Data Transformation
• The <filterchain> type adds data
filtering/transforming capabilities to
supporting tasks.
• Tasks that support <filterchain> include
<copy>, <move>, <append> + more
• For example:
– Strip comments from files
– Replace values in files (+ regexp)
– Perform XSLT transformation
• Easily add your own.
Hans Lellelid: Putting Phing to Work for You 21
22. Filtering examples
<copy todir=quot;${build}/htdocsquot;>
<fileset includes=quot;*.htmlquot;/>
<filterchain>
<replaceregexp>
<regexp pattern=quot;rnquot;
replace=quot;nquot;/>
</replaceregexp>
<tidyfilter encoding=quot;utf8quot;>
<config name=quot;indentquot;
value=quot;truequot;/>
</tidyfilter>
</filterchain>
</copy>
Hans Lellelid: Putting Phing to Work for You 22
24. PDO Task
• <pdo> task allows you to execute SQL
statements from
– The buildfile itself
– One or more files
• Transactions can be explicitly demarcated.
• Output can be formatted with a provided or
custom formatter.
Hans Lellelid: Putting Phing to Work for You 24
25. User Input
• The <propertyprompt> task provides an
basic, easy way to set a value from user
input.
• The <input> task provides a more feature
rich version.
– Special handling of yes/no, multiple choice
– Support for input validation
Hans Lellelid: Putting Phing to Work for You 25
26. Build API Docs
• The <phpdoc> task provides a wrapper for
the PhpDocumentor application.
• A few advantages over standalone phpdoc:
– Use properties from build script
– Use Phing features like filesets
Hans Lellelid: Putting Phing to Work for You 26
27. Unit Testing
• Phing has extensive support for PHPUnit
and SimpleTest unit testing frameworks
• PHPUnit tasks provide support for
– Batch testing using <fileset> to select all
the tests you wish to run.
– Output in XML (Junit-compatible) and Plain
text.
– Report generator creates XHTML reports
using XSLT
– Code coverage reports (requires Xdebug)
Hans Lellelid: Putting Phing to Work for You 27
28. Continuous Integration
• Code -> Commit -> Build -> Test ->
Report
• CI tools watch the repository and provide
automated building, testing, reporting.
• CruiseControl is probably the most well-
known.
• Xinc provides CI tool functionality written in
PHP.
• Xinc is built to use Phing
• CruiseControl also supports Phing
Hans Lellelid: Putting Phing to Work for You 28
30. Paths for Extension
• Embedding PHP in build file.
• Write your own class to provide any of the
functionality we have seen:
– Task
– Type
– Selector
– Filter
– Mapper
– Listener (logger)
– Input Handler
Hans Lellelid: Putting Phing to Work for You 30
31. Embedding PHP
• The <php> task allows you to evaluate a
PHP expression, function call, etc. and store
result in a property.
• The <adhoc> task allows you to embed
PHP directly. Useful for including setup
files.
<adhoc><![CDATA[
require_once 'propel/Propel.php';
Propel::init('bookstore-conf.php');
]]></adhoc>
Hans Lellelid: Putting Phing to Work for You 31
32. Writing a Task
• Extend Task
• Add setter methods for any params your
task accepts.
• Implement public function main()
• Abstract subclasses exist to make life
easier (e.g. MatchingTask)
Hans Lellelid: Putting Phing to Work for You 32
33. Sample Task
class SampleTask extends Task {
private $var;
public function setVar($v) {
$this->var = $v;
}
public function main() {
$this->log(quot;value: quot;.$this->var);
}
}
Hans Lellelid: Putting Phing to Work for You 33
34. More Complex Task
• Adding support for CDATA text.
• Adding support for Fileset, Filelist,
Filterchain child elements.
• Supporting nested arbitrary classes ...
Hans Lellelid: Putting Phing to Work for You 34
35. Data Types
• Classes that can be shared by different
tasks.
• Extend DataType
• Add setter methods for any params your
data type accepts/expects.
Hans Lellelid: Putting Phing to Work for You 35
36. Filters
• Extend BaseFilterReader or
BaseParamFilterReader and implement
ChainableReader.
• Implement read() and chain() methods.
– Read stream and return -1 when stream is
exhausted.
• If using params, you must initialize them
locally.
• Use <filterreader classname=”YourClass”>
in your build file.
Hans Lellelid: Putting Phing to Work for You 36
38. Mappers
• Implement FileNameMapper
• Implement main(filename), setFrom(str),
setTo(str)
• Use <mapper classname=”...”> in your
build file.
Hans Lellelid: Putting Phing to Work for You 38
39. Build Listeners
• Implement BuildListener (or
BuildLogger which expects streams)
• Register on the commandline using
-listener (or -logger) option.
Hans Lellelid: Putting Phing to Work for You 39
40. Input Handlers
• Implement InputHandler interface
– Implement the handleInput(InputRequest)
method.
• Register on the commandline using
-listener (or -inputhandler) option.
Hans Lellelid: Putting Phing to Work for You 40
41. Where next?
• Visit http://phing.info for downloads,
documentation, and issue tracking.
• Ask questions on the mailing lists.
– users@phing.tigris.org
– dev@phing.tigris.org
Hans Lellelid: Putting Phing to Work for You 41