Intellicore Tech Talk 10 - Apache Web Server Internals
2013 01-08-php-maturite
1. PHP : l’âge de la maturité avec Symfony2 ?
Rémi Alvado
remi.alvado@gmail.com
remi.alvado
@remialvado
http://blog.shoppingadventure.fr/developers
2. Rappel des faits
Autre
Java 1% Unknown
4% 6%
ASP.Net
19 %
PHP
PHP 94 %
76 %
Répartition des technologies utilisées sur les 1M Répartition des technologies utilisées sur les
plus gros sites (source : W3Techs) CMS totalisant plus de 1% du marché chacun
(source : W3Techs)
2
3. Pr é - H i s t o i r e
PHP 1.0 : 1995
PHP 2.0 : 1997
PHP 3.0 : 1998
Premières briques d’un modèle objet
PHP 4.0 : 2000
Premier modèle objet « utilisable »
Introduction du Zend Engine
Command Line Interface
PHP 5.0 : 2004, PHP 5.1 : 2005 & PHP 5.2 : 2006
5.0 : Révision du modèle objet
5.1 : Amélioration des performances
5.2 : Introduction de PDO et JSON
3
4. Language
Namespaces & PSR-0
Equivalent à la notion de « package » de Java
Permet le chargement automatique des class
Annotations
Non intégré directement au langage
Implémenté par des librairies externes basées sur l’API Reflection
/**
Callable
* @Route(‘/{id}.html’, requirements={‘id’ = ‘d+’}, default={‘id’ = 1})
* @Method({‘GET’, ‘HEAD’})
Equivalent aux « closures » de nombreux langages
* @Template(‘blog/show.html.twig’)
*/
$nbTests = 0;
public function showAction($id) ([^"]*)’),
$steps->Given(‘/I have ordered
{ Futur de PHP
function($world, $arg1) use ($nbTests) {
} $nbTests++;
PHP 5.4 : Traits, built-in webserver, …
throw new BehatBehatExceptionPendingException();
}
); PHP 5.5 : générateurs, coroutines, accesseurs, …
4
5. Qualité de code
Composer
Equivalent à Maven pour la partie dépendance
Configuration extrêmement simple en JSON
{
PHPUnit / Hamcrest / Mockery
"require": {
"name": "kbrw/riak-bundle",
"type": "symfony-bundle",
”symfony/symfony": ”2.1.*”
} Support des assertions classiques, des annotations basiques,
"description": "Allows your application to intereact with Riak datastorage",
}
des mocks, de la couverture de code, d’une grande partie
"keywords": ["webservice","nosql","ODM"],
"homepage": "https://github.com/remialvado/RiakBundle",
des matchers Hamcrest, …
"license": "Apache",
$ curl –s https://getcomposer.org/installer | php
"authors": [
$ composer install
<?php {
Travis–CI / JMS Automatic Code review
require_once "name": "Remi Alvado",
'SomeClass.php';
"email": "remi.alvado@gmail.com"
}
Serveur de CI utilisé par de nombreux projets PHP
class StubTest extends PHPUnit_Framework_TestCase
{ ],
Réalisation d’audits automatiques sur le code source
"require": {
public function testOnConsecutiveCallsStub()
{ "php": ">=5.3.2”,
"guzzle/guzzle": "3.0.*",
$stub = $this->getMock('SomeClass');
Intégration aisée avec Git(hub)
"jms/serializer-bundle": "1.0.*"
$stub->expects($this->any())
} ->method('doSomething')
} ->will($this->onConsecutiveCalls(2, 3, 5, 7));
$this->assertEquals(2, $stub->doSomething());
assertThat($stub->doSomething(), is(3));
}
}
5
6. We b s e r v i c e
<?php
namespace BoilerplateSerializerBundle;
Guzzle
use JMSSerializerAnnotation as Ser;
Abstraction objet sur curl
/**
Fortement guidé par les principes REST
* @XmlRoot("book")
*/
class function searchBooks($query, $tags = array(), $rows = 10, $offset = 0, $sort = "desc")
publicBook
{ JMS Serializer
/**
$client = new Client(
Equivalent allégé à JAXB
* @SerType("string")
"http://localhost:9980/books/{q}{?rows,offset,sort,tags*}",
*/ array(
Fonctionne avec XML, JSON et YAML
protected $name; => $query,
"q"
"rows" => $rows,
/** "offset" => $offset,
Support des annotations Doctrine
* @SerType("DateTime")
"sort" => $sort,
* @SerXmlAttribute $tags
"tags" =>
* @SerSerializedName("publication")
)
*/
);
protected $publishedDate;
$client->setDefaultHeaders(['accept' => 'application/xml']);
} $request = $client->get();
echo $request->getUrl();
$response = $request->send();
<?xml version="1.0" encoding="UTF-8"?>
echo $response->getBody();
<book publication="2013-01-08 19:30:00">
} <!CDATA[PHP : l’âge de la maturité avec Symfony2 ?]]>
</book>
searchBooks("Star Wars", ['cat' => 'novel', 'country' => 'en-US']);
{"name":"PHP : l’âge de la maturité avec Symfony2 ?","publication":"2013-01-08 19:30:00"}
// http://localhost:9980/books/Star+Wars?rows=10&offset=0&sort=desc&cat=novel&country=en-US
// ...
6
7. Stockage
Doctrine / Propel
Equivalent d’Hibernate
Doctrine 1 / Propel => Active Record pattern
Génération de code à partir d’une configuration
PHPCR ODM
Basé sur Java Content Repository
Intégré dans Doctrine 2
Encore à l’état de prototype
RiakBundle
Communication avec Riak
Intégration complète à Symfony2
Utilisation de composer, Travis-CI, JMS Automated Code Review, …
7
8. Divers
Assetic : web assets
Twig : templating language
Sismo : micro Continuous Integration server
Silex : micro web framework
Pimple : micro Dependency Injector container
Geocoder
Goutte : web scraper
Monolog : gestion de logs
…
8