SlideShare a Scribd company logo
Building and deploying PHP applications
               with Phing

                Michiel Rook

            PHP UK Conference 2012
About me


  • Freelance PHP & Java contractor / consultant

  • PHP since ’99

  • Phing project lead

  • http://www.linkedin.com/in/michieltcs

  • @michieltcs




                                    Building and deploying PHP applications with Phing
This Talk


  • Why use a build tool

  • What is Phing

  • Usage

  • Various examples

  • Extending Phing




                           Building and deploying PHP applications with Phing
Why Use A Build Tool?
Why Use A Build Tool




                                 Repetition
              http://www.flickr.com/photos/andrewmalone/5162632817/




                                           Building and deploying PHP applications with Phing
Repetition


  • We are human

  • We get bored

  • We forget things

  • We make mistakes




                       Building and deploying PHP applications with Phing
Repetition


  • Version control

  • (Unit) Testing

  • Configuring

  • Packaging

  • Uploading

  • DB changes

  • ...




                      Building and deploying PHP applications with Phing
Repetition


  • Version control

  • (Unit) Testing

  • Configuring

  • Packaging

  • Uploading

  • DB changes

  • ...

  • Boring!




                      Building and deploying PHP applications with Phing
Why Use A Build Tool




                                 Automate!
               http://www.flickr.com/photos/patrick_h/6209981673/




                                          Building and deploying PHP applications with Phing
Automate!


  • Developers, testers, administrators...

  • Easier handover to new team members

  • Improves quality

  • Reduces errors

  • Saves time

  • Consolidate scripts, reduce technical debt




                                       Building and deploying PHP applications with Phing
What Is Phing




                http://www.flickr.com/photos/canucksfan604/5471322484/


                                             Building and deploying PHP applications with Phing
What Is Phing


  • PHing Is Not GNU make; it’s a PHP project build system or build tool
    based on Apache Ant.

  • Originally developed by Binarycloud

  • Ported to PHP5 by Hans Lellelid

  • 2004: my first commit

  • 2009: lead




                                      Building and deploying PHP applications with Phing
What Can Phing Do


  • Scripting using XML build files

  • Human readable

  • Mostly cross-platform

  • Minimal dependencies

  • Interface to various popular (PHP) tools




                                      Building and deploying PHP applications with Phing
What Can Phing Do


  • Scripting using XML build files

  • Human readable

  • Mostly cross-platform

  • Minimal dependencies

  • Interface to various popular (PHP) tools

  • ”Good glue”




                                      Building and deploying PHP applications with Phing
What Can Phing Do




                    Building and deploying PHP applications with Phing
Why Use Phing


  • Ant?

  • Rich set of tasks

  • Integration with PHP specific tools

  • Allows you to stay in the PHP infrastructure

  • Easy to extend

  • Embed PHP code directly in the build file




                                      Building and deploying PHP applications with Phing
The Basics
Installing Phing

  • PEAR installation

    $ pear channel-discover pear.phing.info
    $ pear install [--alldeps] phing/phing

  • Optionally, install the documentation package

    $ pear install phing/phingdocs




                                     Building and deploying PHP applications with Phing
Build Files


  • Phing uses XML build files

  • Contain standard elements

       • Task: code that performs a specific function (svn checkout,
         mkdir, etc.)
       • Target: groups of tasks, can optionally depend on other targets
       • Project: root node, contains multiple targets




                                      Building and deploying PHP applications with Phing
Example Build File

  <project name="Example" default="world">
      <target name="hello">
          <echo>Hello</echo>
      </target>

      <target name="world" depends="hello">
          <echo>World!</echo>
      </target>
  </project>

   Buildfile: /home/michiel/phing/simple.xml

   Example > hello:

        [echo] Hello

   Example > world:

        [echo] World!

   BUILD FINISHED



                                      Building and deploying PHP applications with Phing
Properties

  • Simple key-value files (.ini)

  ## build.properties
  version=1.0

  • Can be expanded by using ${key} in the build file

  $ phing -propertyfile build.properties ...

  <project name="Example" default="default">
      <target name="default">
          <property file="build.properties" />

          <echo>${version}</echo>
      </target>
  </project>




                                    Building and deploying PHP applications with Phing
Filesets

  • Constructs a group of files to process

  • Supported by most tasks

   <fileset dir="./application" includes="**"/>

   <fileset dir="./application">
       <include name="**/*.php" />
       <exclude name="**/*Test.php" />
   </fileset>

  • References: define once, use many

   <fileset dir="./application" includes="**" id="files"/>

   <fileset refid="files"/>




                                     Building and deploying PHP applications with Phing
Filesets

  • Selectors allow fine-grained matching on certain attributes

  • contains, date, file name & size, ...

   <fileset dir="${dist}">
       <and>
           <filename name="**"/>
           <date datetime="01/01/2011" when="before"/>
       </and>
   </fileset>




                                       Building and deploying PHP applications with Phing
Mappers & Filters


  • Transform files during copy/move/...

  • Mappers

      • Change filename
      • Flatten directories

  • Filters

      • Strip comments, white space
      • Replace values
      • Perform XSLT transformation
      • Translation (i18n)




                                      Building and deploying PHP applications with Phing
Mappers & Filters

  <copy todir="${build}">
      <fileset refid="files"/>
      <mapper type="glob" from="*.txt" to="*.new.txt"/>
      <filterchain>
          <replaceregexp>
              <regexp pattern="rn" replace="n"/>
              <expandproperties/>
          </replaceregexp>
      </filterchain>
  </copy>




                                  Building and deploying PHP applications with Phing
Examples
Examples


  • Version control

  • Unit testing

  • Packaging

  • Deployment

  • Database migration

  • Continuous integration




                             Building and deploying PHP applications with Phing
Version Control

  • (CVS), SVN, Git

  <svncopy
     username="michiel"
     password="test"
     repositoryurl="svn://localhost/phing/trunk/"
     todir="svn://localhost/phing/tags/1.0"/>

  <svnexport
     repositoryurl="svn://localhost/project/trunk/"
     todir="/home/michiel/dev"/>

  <svnlastrevision
     repositoryurl="svn://localhost/project/trunk/"
     propertyname="lastrev"/>
  <echo>Last revision: ${lastrev}</echo>




                                  Building and deploying PHP applications with Phing
PHPUnit

  • Built-in support for most configuration options

  • Gathers code coverage information

  • Various output formats (JUnit / Clover)

  • Reporting (JUnit style)




                                      Building and deploying PHP applications with Phing
PHPUnit Example

  • Stop the build when a test fails

  <phpunit haltonfailure="true" haltonerror="true"
      bootstrap="my_bootstrap.php" printsummary="true">
      <batchtest>
          <fileset dir="src">
              <include name="**/*Test.php"/>
          </fileset>
      </batchtest>
  </phpunit>

   Buildfile: /home/michiel/phpunit/build.xml

   Demo > test:

     [phpunit] Total tests run: 1, Failures: 1, Errors: 0,
         Incomplete: 0, Skipped: 0, Time elapsed: 0.00591 s
   Execution of target "test" failed for the following reason:
   /home/michiel/phpunit/build.xml:3:44: Test FAILURE (testSayHello in
   class HelloWorldTest): Failed asserting that two strings are equal.




                                       Building and deploying PHP applications with Phing
PHPUnit Example

  • Determine which files to include in the coverage report

  <coverage-setup database="reports/coverage.db">
      <fileset dir="src">
          <include name="**/*.php"/>
          <exclude name="**/*Test.php"/>
      </fileset>
  </coverage-setup>

  • Gather code coverage and other data during the test run

  <phpunit codecoverage="true">
      <formatter type="xml" todir="reports"/>
      <batchtest>
          <fileset dir="src">
              <include name="**/*Test.php"/>
          </fileset>
      </batchtest>
  </phpunit>



                                     Building and deploying PHP applications with Phing
PHPUnit Example

  • Generate some reports

  <phpunitreport infile="reports/testsuites.xml"
      format="frames" todir="reports/tests"/>
  <coverage-report outfile="reports/coverage.xml">
      <report todir="reports/coverage" title="Demo"/>
  </coverage-report>




                                  Building and deploying PHP applications with Phing
Documentation

  • Phing currently integrates with popular documentation tools

      • DocBlox
      • PhpDocumentor
      • ApiGen

  • Also supports r(e)ST (reStructuredText)

  <docblox title="Phing API Documentation"
      output="docs" quiet="true">
      <fileset dir="../../classes">
          <include name="**/*.php"/>
      </fileset>
  </docblox>




                                     Building and deploying PHP applications with Phing
DocBlox




          Building and deploying PHP applications with Phing
Packaging

  • Create bundles or packages

  • Phing supports most popular formats: tar (pear), zip, phar

  <pearpkg name="demo" dir=".">
      <fileset refid="files"/>

      <option   name="outputdirectory" value="./build"/>
      <option   name="description">Test package</option>
      <option   name="version" value="0.1.0"/>
      <option   name="state" value="beta"/>

      <mapping name="maintainers">
          <element>
              <element key="handle" value="test"/>
              <element key="name" value="Test"/>
              <element key="email" value="test@test.nl"/>
              <element key="role" value="lead"/>
          </element>
      </mapping>
  </pearpkg>

                                      Building and deploying PHP applications with Phing
Packaging - TAR / ZIP

   <tar compression="gzip" destFile="package.tgz"
       basedir="build"/>

   <zip destfile="htmlfiles.zip">
       <fileset dir=".">
           <include name="**/*.html"/>
       </fileset>
   </zip>




                                   Building and deploying PHP applications with Phing
Packaging - PHAR

  <pharpackage
          compression="gzip"
          destfile="test.phar"
          stub="stub.php"
          basedir=".">
          <fileset dir="hello">
                  <include name="**/**" />
          </fileset>
          <metadata>
                  <element name="version" value="1.0" />
                  <element name="authors">
                          <element name="John Doe">
                                  <element name="e-mail"
                                  value="john@example.com" />
                          </element>
                  </element>
          </metadata>
  </pharpackage>




                                  Building and deploying PHP applications with Phing
Putting it all together - deployments
Copying to a server

  • SSH

  <scp username="john" password="smith"
      host="webserver" todir="/www/htdocs/project/">
      <fileset dir="test">
          <include name="*.html"/>
      </fileset>
  </scp>

  • FTP

  <ftpdeploy
      host="server01"
      username="john"
      password="smit"
      dir="/var/www">
      <fileset dir=".">
          <include name="*.html"/>
      </fileset>
  </ftpdeploy>

                                     Building and deploying PHP applications with Phing
Symbolic links

  • All releases stored in ”backup” directory

  • Symlink application directory to latest release (similar to Capistrano)

  • Allows for easy (code) rollbacks

  <svnlastrevision repositoryurl="${deploy.svn}"
      property="deploy.rev"/>

  <svnexport repositoryurl="${deploy.svn}"
      todir="/www/releases/build-${deploy.rev}"/>

  <symlink target="/www/releases/build-${deploy.rev}"
      link="/www/current"/>

  • Also on a remote server

  <ssh host="webserver" command="ln -s
      /www/releases/build-${deploy.rev} /www/current"/>



                                       Building and deploying PHP applications with Phing
Multiple servers / targets

  • Several deployment targets: testing, staging, production, ...

  • Keep one property file per target

  • Select property file based on input

   <input propertyname="env"
           validargs="testing,staging,production">
   Enter environment name
   </input>

   <property file="${env}.properties"/>

   <ssh host="${deploy.host}" command="..."/>




                                       Building and deploying PHP applications with Phing
Database Migration

  • Set of delta SQL files (1-create-post.sql)

  • Tracks current version of your db in changelog table

  • Generates do and undo SQL files

  CREATE TABLE changelog (
    change_number BIGINT NOT NULL,
    delta_set     VARCHAR(10) NOT NULL,
    start_dt      TIMESTAMP NOT NULL,
    complete_dt   TIMESTAMP NULL,
    applied_by    VARCHAR(100) NOT NULL,
    description   VARCHAR(500) NOT NULL
  )




                                      Building and deploying PHP applications with Phing
Database Migration

  • Delta scripts with do (up) & undo (down) parts

  --//

  CREATE TABLE ‘post‘ (
      ‘title‘ VARCHAR(255),
      ‘time_created‘ DATETIME,
      ‘content‘ MEDIUMTEXT
  );

  --//@UNDO

  DROP TABLE ‘post‘;

  --//




                                     Building and deploying PHP applications with Phing
Database Migration

  <dbdeploy
      url="sqlite:test.db"
      dir="deltas"
      outputfile="deploy.sql"
      undooutputfile="undo.sql"/>

  <pdosqlexec
      src="deploy.sql"
      url="sqlite:test.db"/>

   Buildfile: /home/michiel/dbdeploy/build.xml

   Demo > migrate:

    [dbdeploy] Getting applied changed numbers from DB:
        mysql:host=localhost;dbname=demo
    [dbdeploy] Current db revision: 0
    [dbdeploy] Checkall:
   [pdosqlexec] Executing file: /home/michiel/dbdeploy/deploy.sql
   [pdosqlexec] 3 of 3 SQL statements executed successfully

   BUILD FINISHED


                                      Building and deploying PHP applications with Phing
Database Migration

  -- Fragment begins: 1 --
  INSERT INTO changelog
      (change_number, delta_set, start_dt, applied_by, description)
      VALUES (1, ’Main’, NOW(), ’dbdeploy’,
      ’1-create_initial_schema.sql’);
  --//

  CREATE TABLE ‘post‘ (
      ‘title‘ VARCHAR(255),
      ‘time_created‘ DATETIME,
      ‘content‘ MEDIUMTEXT
  );

  UPDATE changelog
      SET complete_dt = NOW()
      WHERE change_number = 1
      AND delta_set = ’Main’;
  -- Fragment ends: 1 --




                                  Building and deploying PHP applications with Phing
Database Migration

  -- Fragment begins: 1 --

  DROP TABLE ‘post‘;

  --//

  DELETE FROM changelog
                              WHERE change_number = 1
                              AND delta_set = ’Main’;
  -- Fragment ends: 1 --




                             Building and deploying PHP applications with Phing
Phing & Jenkins


  • Continuous integration

  • Phing plugin

  • Build periodically or after each commit

  • Verify and test the build

  • Deploy results




                                      Building and deploying PHP applications with Phing
Phing & Jenkins




                  Building and deploying PHP applications with Phing
Phing & Jenkins




                  Building and deploying PHP applications with Phing
Phing & Jenkins




                  Building and deploying PHP applications with Phing
Demonstration
Extending Phing
Extending Phing


  • Numerous extension points

      • Tasks
      • Types
      • Selectors
      • Filters
      • Mappers
      • Loggers
      • ...




                                Building and deploying PHP applications with Phing
Sample Task

  • Extends from Task

  • Contains main() method and optionally init()

  • Setter method for each attribute in the build file

  class SampleTask extends Task
  {
      private $var;

      public function setVar($v)
      {
          $this->var = $v;
      }

      public function main()
      {
          $this->log("value: " . $this->var);
      }
  }


                                       Building and deploying PHP applications with Phing
Sample Task

  • Use taskdef to make Phing aware of your new task

  <project name="Example" default="default">
      <taskdef name="sample"
          classpath="/dev/src"
          classname="tasks.my.SampleTask" />

      <target name="default">
          <sample var="Hello World" />
      </target>
  </project>




                                   Building and deploying PHP applications with Phing
Ad Hoc Extension

  • Define a task within your build file

  <target name="main">
      <adhoc-task name="foo"><![CDATA[
      class FooTest extends Task {
          private $bar;

           function setBar($bar) {
               $this->bar = $bar;
           }

           function main() {
               $this->log("In FooTest: " . $this->bar);
           }
      }
      ]]></adhoc-task>
      <foo bar="TEST"/>
  </target>




                                         Building and deploying PHP applications with Phing
Future Improvements


  • More tasks & support

  • Better performance

  • PHAR package (including popular dependencies)

  • More documentation

  • Increased test coverage

  • IDE support




                                  Building and deploying PHP applications with Phing
Future Improvements


  • More tasks & support

  • Better performance

  • PHAR package (including popular dependencies)

  • More documentation

  • Increased test coverage

  • IDE support

  • Pull requests! :-)




                                  Building and deploying PHP applications with Phing
Helpful Links


  • http://pear.php.net/

  • http://www.docblox-project.org/

  • http://www.dbdeploy.com/

  • http://www.jenkins-ci.org/

  • http://www.phing.info/docs/guide/stable/

  • http://github.com/phingofficial/phing




                               Building and deploying PHP applications with Phing
Questions?




             http://joind.in/4954

             http://www.phing.info

                #phing (freenode)

                  @phingofficial

                   Thank you!




                          Building and deploying PHP applications with Phing
Ad

Recommended

Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
Michiel Rook
 
Php technical presentation
Php technical presentation
dharmendra kumar dhakar
 
HTML Semantic Elements
HTML Semantic Elements
Reema
 
Introduction to PHP
Introduction to PHP
Jussi Pohjolainen
 
Php ppt
Php ppt
Sanmuga Nathan
 
PHP-MySQL Database Connectivity Using XAMPP Server
PHP-MySQL Database Connectivity Using XAMPP Server
Rajiv Bhatia
 
What is context? How to use context in Odoo by weblearns
What is context? How to use context in Odoo by weblearns
Web Learns
 
01 Php Introduction
01 Php Introduction
Geshan Manandhar
 
Chuong 3 windows forms
Chuong 3 windows forms
Harees Seni
 
Binder: Android IPC
Binder: Android IPC
Shaul Rosenzwieg
 
Php tutorial
Php tutorial
Computer Hardware & Trouble shooting
 
Django Interview Questions and Answers
Django Interview Questions and Answers
Python Devloper
 
Web 5 | JavaScript Events
Web 5 | JavaScript Events
Mohammad Imam Hossain
 
Setting up your development environment
Setting up your development environment
Nicole Ryan
 
Low Level View of Android System Architecture
Low Level View of Android System Architecture
National Cheng Kung University
 
Php
Php
Ajaigururaj R
 
Basic Details of HTML and CSS.pdf
Basic Details of HTML and CSS.pdf
Kalyani Government Engineering College
 
Php mysql
Php mysql
Shehrevar Davierwala
 
Datos
Datos
jmonetti
 
Php tutorial(w3schools)
Php tutorial(w3schools)
Arjun Shanka
 
Xampp Ppt
Xampp Ppt
guestb4b8d8e
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
Tiago Marchetti Dolphine
 
Timings of Init : Android Ramdisks for the Practical Hacker
Timings of Init : Android Ramdisks for the Practical Hacker
Stacy Devino
 
PHP Basics
PHP Basics
Saraswathi Murugan
 
Quản lý mã nguồn với GIT
Quản lý mã nguồn với GIT
ZendVN
 
Chuong vb.net
Chuong vb.net
kienbom
 
Odoo (Build module, Security, ORM)
Odoo (Build module, Security, ORM)
sroo galal
 
XSLT. Basic.
XSLT. Basic.
Alexander Kirillov
 
Deploying PHP applications with Phing
Deploying PHP applications with Phing
Michiel Rook
 
Automating Web Application Deployment
Automating Web Application Deployment
Mathew Byrne
 

More Related Content

What's hot (20)

Chuong 3 windows forms
Chuong 3 windows forms
Harees Seni
 
Binder: Android IPC
Binder: Android IPC
Shaul Rosenzwieg
 
Php tutorial
Php tutorial
Computer Hardware & Trouble shooting
 
Django Interview Questions and Answers
Django Interview Questions and Answers
Python Devloper
 
Web 5 | JavaScript Events
Web 5 | JavaScript Events
Mohammad Imam Hossain
 
Setting up your development environment
Setting up your development environment
Nicole Ryan
 
Low Level View of Android System Architecture
Low Level View of Android System Architecture
National Cheng Kung University
 
Php
Php
Ajaigururaj R
 
Basic Details of HTML and CSS.pdf
Basic Details of HTML and CSS.pdf
Kalyani Government Engineering College
 
Php mysql
Php mysql
Shehrevar Davierwala
 
Datos
Datos
jmonetti
 
Php tutorial(w3schools)
Php tutorial(w3schools)
Arjun Shanka
 
Xampp Ppt
Xampp Ppt
guestb4b8d8e
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
Tiago Marchetti Dolphine
 
Timings of Init : Android Ramdisks for the Practical Hacker
Timings of Init : Android Ramdisks for the Practical Hacker
Stacy Devino
 
PHP Basics
PHP Basics
Saraswathi Murugan
 
Quản lý mã nguồn với GIT
Quản lý mã nguồn với GIT
ZendVN
 
Chuong vb.net
Chuong vb.net
kienbom
 
Odoo (Build module, Security, ORM)
Odoo (Build module, Security, ORM)
sroo galal
 
XSLT. Basic.
XSLT. Basic.
Alexander Kirillov
 

Similar to Building and deploying PHP applications with Phing (20)

Deploying PHP applications with Phing
Deploying PHP applications with Phing
Michiel Rook
 
Automating Web Application Deployment
Automating Web Application Deployment
Mathew Byrne
 
Getting Started With Jenkins And Drupal
Getting Started With Jenkins And Drupal
Philip Norton
 
Desktop Apps with PHP and Titanium
Desktop Apps with PHP and Titanium
Ben Ramsey
 
Building and Deploying PHP apps with Phing
Building and Deploying PHP apps with Phing
Michiel Rook
 
Putting "Phings" together - how to automate your life
Putting "Phings" together - how to automate your life
Boyan Borisov
 
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Michael Lihs
 
Unit testing symfony plugins with php unit
Unit testing symfony plugins with php unit
Christian Schaefer
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment - Confoo 2011
Bachkoutou Toutou
 
Build Your First SharePoint Framework Webpart
Build Your First SharePoint Framework Webpart
Eric Overfield
 
Tutorial Módulo 1 de Introdução com Flask
Tutorial Módulo 1 de Introdução com Flask
Vinícius Marques
 
Introduction to PHP - SDPHP
Introduction to PHP - SDPHP
Eric Johnson
 
Improving qa on php projects
Improving qa on php projects
Michelangelo van Dam
 
Professional PHP: an open-source alternative for enterprise development [Antw...
Professional PHP: an open-source alternative for enterprise development [Antw...
Combell NV
 
Continuous feature-development
Continuous feature-development
nhm taveer hossain khan
 
Php
Php
Ajay Kumar
 
CodeIgniter - PHP MVC Framework by silicongulf.com
CodeIgniter - PHP MVC Framework by silicongulf.com
Christopher Cubos
 
Web development with Python
Web development with Python
Raman Balyan
 
Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...
Max Romanovsky
 
Symfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim Romanovsky
php-user-group-minsk
 
Deploying PHP applications with Phing
Deploying PHP applications with Phing
Michiel Rook
 
Automating Web Application Deployment
Automating Web Application Deployment
Mathew Byrne
 
Getting Started With Jenkins And Drupal
Getting Started With Jenkins And Drupal
Philip Norton
 
Desktop Apps with PHP and Titanium
Desktop Apps with PHP and Titanium
Ben Ramsey
 
Building and Deploying PHP apps with Phing
Building and Deploying PHP apps with Phing
Michiel Rook
 
Putting "Phings" together - how to automate your life
Putting "Phings" together - how to automate your life
Boyan Borisov
 
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Michael Lihs
 
Unit testing symfony plugins with php unit
Unit testing symfony plugins with php unit
Christian Schaefer
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment - Confoo 2011
Bachkoutou Toutou
 
Build Your First SharePoint Framework Webpart
Build Your First SharePoint Framework Webpart
Eric Overfield
 
Tutorial Módulo 1 de Introdução com Flask
Tutorial Módulo 1 de Introdução com Flask
Vinícius Marques
 
Introduction to PHP - SDPHP
Introduction to PHP - SDPHP
Eric Johnson
 
Professional PHP: an open-source alternative for enterprise development [Antw...
Professional PHP: an open-source alternative for enterprise development [Antw...
Combell NV
 
CodeIgniter - PHP MVC Framework by silicongulf.com
CodeIgniter - PHP MVC Framework by silicongulf.com
Christopher Cubos
 
Web development with Python
Web development with Python
Raman Balyan
 
Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...
Max Romanovsky
 
Symfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim Romanovsky
php-user-group-minsk
 
Ad

Recently uploaded (20)

FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Kubernetes Security Act Now Before It’s Too Late
Kubernetes Security Act Now Before It’s Too Late
Michael Furman
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
Edge AI and Vision Alliance
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Kubernetes Security Act Now Before It’s Too Late
Kubernetes Security Act Now Before It’s Too Late
Michael Furman
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
Edge AI and Vision Alliance
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Ad

Building and deploying PHP applications with Phing

  • 1. Building and deploying PHP applications with Phing Michiel Rook PHP UK Conference 2012
  • 2. About me • Freelance PHP & Java contractor / consultant • PHP since ’99 • Phing project lead • http://www.linkedin.com/in/michieltcs • @michieltcs Building and deploying PHP applications with Phing
  • 3. This Talk • Why use a build tool • What is Phing • Usage • Various examples • Extending Phing Building and deploying PHP applications with Phing
  • 4. Why Use A Build Tool?
  • 5. Why Use A Build Tool Repetition http://www.flickr.com/photos/andrewmalone/5162632817/ Building and deploying PHP applications with Phing
  • 6. Repetition • We are human • We get bored • We forget things • We make mistakes Building and deploying PHP applications with Phing
  • 7. Repetition • Version control • (Unit) Testing • Configuring • Packaging • Uploading • DB changes • ... Building and deploying PHP applications with Phing
  • 8. Repetition • Version control • (Unit) Testing • Configuring • Packaging • Uploading • DB changes • ... • Boring! Building and deploying PHP applications with Phing
  • 9. Why Use A Build Tool Automate! http://www.flickr.com/photos/patrick_h/6209981673/ Building and deploying PHP applications with Phing
  • 10. Automate! • Developers, testers, administrators... • Easier handover to new team members • Improves quality • Reduces errors • Saves time • Consolidate scripts, reduce technical debt Building and deploying PHP applications with Phing
  • 11. What Is Phing http://www.flickr.com/photos/canucksfan604/5471322484/ Building and deploying PHP applications with Phing
  • 12. What Is Phing • PHing Is Not GNU make; it’s a PHP project build system or build tool based on Apache Ant. • Originally developed by Binarycloud • Ported to PHP5 by Hans Lellelid • 2004: my first commit • 2009: lead Building and deploying PHP applications with Phing
  • 13. What Can Phing Do • Scripting using XML build files • Human readable • Mostly cross-platform • Minimal dependencies • Interface to various popular (PHP) tools Building and deploying PHP applications with Phing
  • 14. What Can Phing Do • Scripting using XML build files • Human readable • Mostly cross-platform • Minimal dependencies • Interface to various popular (PHP) tools • ”Good glue” Building and deploying PHP applications with Phing
  • 15. What Can Phing Do Building and deploying PHP applications with Phing
  • 16. Why Use Phing • Ant? • Rich set of tasks • Integration with PHP specific tools • Allows you to stay in the PHP infrastructure • Easy to extend • Embed PHP code directly in the build file Building and deploying PHP applications with Phing
  • 18. Installing Phing • PEAR installation $ pear channel-discover pear.phing.info $ pear install [--alldeps] phing/phing • Optionally, install the documentation package $ pear install phing/phingdocs Building and deploying PHP applications with Phing
  • 19. Build Files • Phing uses XML build files • Contain standard elements • Task: code that performs a specific function (svn checkout, mkdir, etc.) • Target: groups of tasks, can optionally depend on other targets • Project: root node, contains multiple targets Building and deploying PHP applications with Phing
  • 20. Example Build File <project name="Example" default="world"> <target name="hello"> <echo>Hello</echo> </target> <target name="world" depends="hello"> <echo>World!</echo> </target> </project> Buildfile: /home/michiel/phing/simple.xml Example > hello: [echo] Hello Example > world: [echo] World! BUILD FINISHED Building and deploying PHP applications with Phing
  • 21. Properties • Simple key-value files (.ini) ## build.properties version=1.0 • Can be expanded by using ${key} in the build file $ phing -propertyfile build.properties ... <project name="Example" default="default"> <target name="default"> <property file="build.properties" /> <echo>${version}</echo> </target> </project> Building and deploying PHP applications with Phing
  • 22. Filesets • Constructs a group of files to process • Supported by most tasks <fileset dir="./application" includes="**"/> <fileset dir="./application"> <include name="**/*.php" /> <exclude name="**/*Test.php" /> </fileset> • References: define once, use many <fileset dir="./application" includes="**" id="files"/> <fileset refid="files"/> Building and deploying PHP applications with Phing
  • 23. Filesets • Selectors allow fine-grained matching on certain attributes • contains, date, file name & size, ... <fileset dir="${dist}"> <and> <filename name="**"/> <date datetime="01/01/2011" when="before"/> </and> </fileset> Building and deploying PHP applications with Phing
  • 24. Mappers & Filters • Transform files during copy/move/... • Mappers • Change filename • Flatten directories • Filters • Strip comments, white space • Replace values • Perform XSLT transformation • Translation (i18n) Building and deploying PHP applications with Phing
  • 25. Mappers & Filters <copy todir="${build}"> <fileset refid="files"/> <mapper type="glob" from="*.txt" to="*.new.txt"/> <filterchain> <replaceregexp> <regexp pattern="rn" replace="n"/> <expandproperties/> </replaceregexp> </filterchain> </copy> Building and deploying PHP applications with Phing
  • 27. Examples • Version control • Unit testing • Packaging • Deployment • Database migration • Continuous integration Building and deploying PHP applications with Phing
  • 28. Version Control • (CVS), SVN, Git <svncopy username="michiel" password="test" repositoryurl="svn://localhost/phing/trunk/" todir="svn://localhost/phing/tags/1.0"/> <svnexport repositoryurl="svn://localhost/project/trunk/" todir="/home/michiel/dev"/> <svnlastrevision repositoryurl="svn://localhost/project/trunk/" propertyname="lastrev"/> <echo>Last revision: ${lastrev}</echo> Building and deploying PHP applications with Phing
  • 29. PHPUnit • Built-in support for most configuration options • Gathers code coverage information • Various output formats (JUnit / Clover) • Reporting (JUnit style) Building and deploying PHP applications with Phing
  • 30. PHPUnit Example • Stop the build when a test fails <phpunit haltonfailure="true" haltonerror="true" bootstrap="my_bootstrap.php" printsummary="true"> <batchtest> <fileset dir="src"> <include name="**/*Test.php"/> </fileset> </batchtest> </phpunit> Buildfile: /home/michiel/phpunit/build.xml Demo > test: [phpunit] Total tests run: 1, Failures: 1, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.00591 s Execution of target "test" failed for the following reason: /home/michiel/phpunit/build.xml:3:44: Test FAILURE (testSayHello in class HelloWorldTest): Failed asserting that two strings are equal. Building and deploying PHP applications with Phing
  • 31. PHPUnit Example • Determine which files to include in the coverage report <coverage-setup database="reports/coverage.db"> <fileset dir="src"> <include name="**/*.php"/> <exclude name="**/*Test.php"/> </fileset> </coverage-setup> • Gather code coverage and other data during the test run <phpunit codecoverage="true"> <formatter type="xml" todir="reports"/> <batchtest> <fileset dir="src"> <include name="**/*Test.php"/> </fileset> </batchtest> </phpunit> Building and deploying PHP applications with Phing
  • 32. PHPUnit Example • Generate some reports <phpunitreport infile="reports/testsuites.xml" format="frames" todir="reports/tests"/> <coverage-report outfile="reports/coverage.xml"> <report todir="reports/coverage" title="Demo"/> </coverage-report> Building and deploying PHP applications with Phing
  • 33. Documentation • Phing currently integrates with popular documentation tools • DocBlox • PhpDocumentor • ApiGen • Also supports r(e)ST (reStructuredText) <docblox title="Phing API Documentation" output="docs" quiet="true"> <fileset dir="../../classes"> <include name="**/*.php"/> </fileset> </docblox> Building and deploying PHP applications with Phing
  • 34. DocBlox Building and deploying PHP applications with Phing
  • 35. Packaging • Create bundles or packages • Phing supports most popular formats: tar (pear), zip, phar <pearpkg name="demo" dir="."> <fileset refid="files"/> <option name="outputdirectory" value="./build"/> <option name="description">Test package</option> <option name="version" value="0.1.0"/> <option name="state" value="beta"/> <mapping name="maintainers"> <element> <element key="handle" value="test"/> <element key="name" value="Test"/> <element key="email" value="[email protected]"/> <element key="role" value="lead"/> </element> </mapping> </pearpkg> Building and deploying PHP applications with Phing
  • 36. Packaging - TAR / ZIP <tar compression="gzip" destFile="package.tgz" basedir="build"/> <zip destfile="htmlfiles.zip"> <fileset dir="."> <include name="**/*.html"/> </fileset> </zip> Building and deploying PHP applications with Phing
  • 37. Packaging - PHAR <pharpackage compression="gzip" destfile="test.phar" stub="stub.php" basedir="."> <fileset dir="hello"> <include name="**/**" /> </fileset> <metadata> <element name="version" value="1.0" /> <element name="authors"> <element name="John Doe"> <element name="e-mail" value="[email protected]" /> </element> </element> </metadata> </pharpackage> Building and deploying PHP applications with Phing
  • 38. Putting it all together - deployments
  • 39. Copying to a server • SSH <scp username="john" password="smith" host="webserver" todir="/www/htdocs/project/"> <fileset dir="test"> <include name="*.html"/> </fileset> </scp> • FTP <ftpdeploy host="server01" username="john" password="smit" dir="/var/www"> <fileset dir="."> <include name="*.html"/> </fileset> </ftpdeploy> Building and deploying PHP applications with Phing
  • 40. Symbolic links • All releases stored in ”backup” directory • Symlink application directory to latest release (similar to Capistrano) • Allows for easy (code) rollbacks <svnlastrevision repositoryurl="${deploy.svn}" property="deploy.rev"/> <svnexport repositoryurl="${deploy.svn}" todir="/www/releases/build-${deploy.rev}"/> <symlink target="/www/releases/build-${deploy.rev}" link="/www/current"/> • Also on a remote server <ssh host="webserver" command="ln -s /www/releases/build-${deploy.rev} /www/current"/> Building and deploying PHP applications with Phing
  • 41. Multiple servers / targets • Several deployment targets: testing, staging, production, ... • Keep one property file per target • Select property file based on input <input propertyname="env" validargs="testing,staging,production"> Enter environment name </input> <property file="${env}.properties"/> <ssh host="${deploy.host}" command="..."/> Building and deploying PHP applications with Phing
  • 42. Database Migration • Set of delta SQL files (1-create-post.sql) • Tracks current version of your db in changelog table • Generates do and undo SQL files CREATE TABLE changelog ( change_number BIGINT NOT NULL, delta_set VARCHAR(10) NOT NULL, start_dt TIMESTAMP NOT NULL, complete_dt TIMESTAMP NULL, applied_by VARCHAR(100) NOT NULL, description VARCHAR(500) NOT NULL ) Building and deploying PHP applications with Phing
  • 43. Database Migration • Delta scripts with do (up) & undo (down) parts --// CREATE TABLE ‘post‘ ( ‘title‘ VARCHAR(255), ‘time_created‘ DATETIME, ‘content‘ MEDIUMTEXT ); --//@UNDO DROP TABLE ‘post‘; --// Building and deploying PHP applications with Phing
  • 44. Database Migration <dbdeploy url="sqlite:test.db" dir="deltas" outputfile="deploy.sql" undooutputfile="undo.sql"/> <pdosqlexec src="deploy.sql" url="sqlite:test.db"/> Buildfile: /home/michiel/dbdeploy/build.xml Demo > migrate: [dbdeploy] Getting applied changed numbers from DB: mysql:host=localhost;dbname=demo [dbdeploy] Current db revision: 0 [dbdeploy] Checkall: [pdosqlexec] Executing file: /home/michiel/dbdeploy/deploy.sql [pdosqlexec] 3 of 3 SQL statements executed successfully BUILD FINISHED Building and deploying PHP applications with Phing
  • 45. Database Migration -- Fragment begins: 1 -- INSERT INTO changelog (change_number, delta_set, start_dt, applied_by, description) VALUES (1, ’Main’, NOW(), ’dbdeploy’, ’1-create_initial_schema.sql’); --// CREATE TABLE ‘post‘ ( ‘title‘ VARCHAR(255), ‘time_created‘ DATETIME, ‘content‘ MEDIUMTEXT ); UPDATE changelog SET complete_dt = NOW() WHERE change_number = 1 AND delta_set = ’Main’; -- Fragment ends: 1 -- Building and deploying PHP applications with Phing
  • 46. Database Migration -- Fragment begins: 1 -- DROP TABLE ‘post‘; --// DELETE FROM changelog WHERE change_number = 1 AND delta_set = ’Main’; -- Fragment ends: 1 -- Building and deploying PHP applications with Phing
  • 47. Phing & Jenkins • Continuous integration • Phing plugin • Build periodically or after each commit • Verify and test the build • Deploy results Building and deploying PHP applications with Phing
  • 48. Phing & Jenkins Building and deploying PHP applications with Phing
  • 49. Phing & Jenkins Building and deploying PHP applications with Phing
  • 50. Phing & Jenkins Building and deploying PHP applications with Phing
  • 53. Extending Phing • Numerous extension points • Tasks • Types • Selectors • Filters • Mappers • Loggers • ... Building and deploying PHP applications with Phing
  • 54. Sample Task • Extends from Task • Contains main() method and optionally init() • Setter method for each attribute in the build file class SampleTask extends Task { private $var; public function setVar($v) { $this->var = $v; } public function main() { $this->log("value: " . $this->var); } } Building and deploying PHP applications with Phing
  • 55. Sample Task • Use taskdef to make Phing aware of your new task <project name="Example" default="default"> <taskdef name="sample" classpath="/dev/src" classname="tasks.my.SampleTask" /> <target name="default"> <sample var="Hello World" /> </target> </project> Building and deploying PHP applications with Phing
  • 56. Ad Hoc Extension • Define a task within your build file <target name="main"> <adhoc-task name="foo"><![CDATA[ class FooTest extends Task { private $bar; function setBar($bar) { $this->bar = $bar; } function main() { $this->log("In FooTest: " . $this->bar); } } ]]></adhoc-task> <foo bar="TEST"/> </target> Building and deploying PHP applications with Phing
  • 57. Future Improvements • More tasks & support • Better performance • PHAR package (including popular dependencies) • More documentation • Increased test coverage • IDE support Building and deploying PHP applications with Phing
  • 58. Future Improvements • More tasks & support • Better performance • PHAR package (including popular dependencies) • More documentation • Increased test coverage • IDE support • Pull requests! :-) Building and deploying PHP applications with Phing
  • 59. Helpful Links • http://pear.php.net/ • http://www.docblox-project.org/ • http://www.dbdeploy.com/ • http://www.jenkins-ci.org/ • http://www.phing.info/docs/guide/stable/ • http://github.com/phingofficial/phing Building and deploying PHP applications with Phing
  • 60. Questions? http://joind.in/4954 http://www.phing.info #phing (freenode) @phingofficial Thank you! Building and deploying PHP applications with Phing