Accélerer et optimiser son intallation PHP avec eAccelerator

Posté par seiyar81 le 12 février 2010 | Laisser un commentaire (0)

Quand on doit gérer un serveur Web, on doit s’occuper avant tout de la sécurité de l’installation, de sa stabilité, etc mais il ne faut pas pour autant négliger les performances. Car oui l’utilisateur final ne se préoccupe pas vraiment de savoir si le serveur risque de tomber à la moindre attaque, et si l’application est trop longue à répondre il ira voir ailleurs s’il peut ou alors va commencer à s’énerver.

J’ai déjà présenté quelques modules pour accélérer Apache, mais aujourd’hui je vais expliquer comment installer très simplement un système de cache d’opcode : eAccelerator.
Avant cela quelques explications.

Qu’est-ce que l’opcode ?

Comme vous le savez tous sûrement, PHP n’est pas un langage compilé, mais interprété. C’est à dire qu’à chaque exécution le code est parcouru puis PHP génère ce qu’on appelle l’opcode qui est en réalité un code compréhensible par la machine qui pourra donc l’exécuter.
Ce processus peut très vite devenir lourd pour la machine dès lors que l’application fait face à un nombre important de clients et les temps de réponses n’en sont que plus long.

Quelles solutions ?

C’est pourquoi on va s’intéresser aux systèmes de cache d’opcode. Ces derniers améliore grandement les performances de PHP en plaçant dans un système de cache ces fameux opcodes.
Il existe plusieurs solutions dont voici une courte liste (non exhaustive) :

  • IonCube: http://www.ioncube.com/sa_encoder.php
  • Zend Platform: http://www.zend.com/en/products/platform/
  • XCache: http://xcache.lighttpd.net/
  • APC: http://pecl.php.net/packages/APC
  • EAccelerator: http://www.eaccelerator.net/

Nous nous intéresserons ici à eAccelerator.
Attention toutefois, eAccelerator ne fonctionne pas si PHP est CGI, il est seulement utilisable avec mod_php ou PHP en FastCGI.

On commence par récupérer la dernière version :

cd /usr/src
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
tar -xf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6

Ensuite il nous faut compiler les sources, donc dans le dossier entrez les commandes suivantes :

phpize
./configure
make

Si le programme phpize n’est pas trouvé, il faut le télécharger :

sudo apt-get install php5-dev

Si tout s’est bien passé, on lance l’installation :

make install

Il nous faut maintenant configurer PHP pour qu’il charge l’extension, on modifie donc le fichier /etc/php5/conf.d/eaccelerator.ini :

zend_extension="/usr/lib/php4/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

Enfin on créé le dossier dans lequel eAccelerator va stocker son cache :

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator

Enfin on vérifie que tout fonctionne bien :

/etc/init.d/apache2 reload
php5 -v
...
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
...

Et voilà votre installation de PHP est maintenant plus rapide et plus stable.
J’expliquerais prochainement comment mettre en place très simplement un reverse proxy afin de soulager le serveur Web.

Catégorie: Apache, Développement Web, PHP | Laisser un commentaire (0)

Zend Framework : Détails de la version 1.10.0

Posté par seiyar81 le 3 février 2010 | Laisser un commentaire (0)

Sortie depuis quelques jours la toute dernière version du framework apporte son lot de nouveautés. Ainsi la documentation a été réorganisée de façon a être plus accessible et plus claire, avec un « Quick Start« , une section « Reference Guide » qui permet de découvrir le framework et d’apprendre à programmer avec.

De plus la documentation est maintenant propulsée par le même moteur que Php.net : PhD. Le rendu de la documentation est ainsi simplifié pour les différentes versions du framework.
La page de téléchargement a également été revue est propose maintenant directement le téléchargement de différent packages : Zend Framewrok + Zend Server CE, Zend Framework Complet, Zend Framework Minimal, Documentation etc.

Enfin pour ce qui est des nouveautés on notera :

  • Zend_Barcode : création de code barre
  • Zend_Cache_Manager : gestion avancée du cache
  • Zend_Feed_Writer : génération de flux RSS et Atom
  • Zend_Oauth : authentification avec Oauth
  • Nouveaux Zend_Service : Zend_Service_LiveDocx, Zend_Service_WindowsAzure, Zend_Service_DeveloperGarden
  • Zend_Markup : faciliter l’intégration et l’édition de langages types BBCode et Textile
  • Plusieurs améliorations sur diverses classes et sur le Zend_Tool

Aller, direction la page de téléchargement !

Catégorie: Développement Web, PHP, Zend Framework | Laisser un commentaire (0)

Zend Framework : Authentification avec Zend_Auth_Adapter_DbTable

Posté par seiyar81 le 27 janvier 2010 | Laisser un commentaire (12)

Aujourd’hui je vais expliquer comment réaliser simplement avec le Zend Framework une authentification avec la classe Zend_Auth_Adapter_DbTable.

Cette classe va grandement nous simplifier la vie puisqu’elle va comparer pour nous le couple username/password dans une table dont on lui fournira les champs.
Autrement dit, plus besoin de s’embêter à sélectionner et comparer les valeurs à la main.

Pour commencer nous allons créer notre model pour la table qui stocke nos utilisateurs. Imaginons qu’elle s’appelle ‘users‘.

<?php 

class Default_Model_DbTable_Users extends Zend_Db_Table
{
    protected $_name = 'users';

}

La classe est ici déclarée sans autres méthodes pour l’exemple mis vous pouvez très bien en ajouter. De plus j’ai nommé ma classe de telle sorte qu’elle est déclarée dans le fichier : ‘application/models/DbTable/Users.php‘. Libre à vous de faire autrement.

Ensuite vous pouvez créer un formulaire en héritant la classe Zend_Form :

<?php

class Default_Form_Login extends Zend_Form
{
    public function __construct($options = null)
    {
        parent::__construct($options);
        $this->setName('login_form');
        $this->setAction('/auth/login')
     	->setMethod('post');

        $login = new Zend_Form_Element_Text('login');
        $login->setLabel('Login : ')
        ->setRequired(true)
        ->addFilter('StripTags')
        ->addFilter('StringTrim')
        ->addValidator('NotEmpty');

        $password = new Zend_Form_Element_Password('password');
        $password->setLabel('Mot de passe : ')
        ->setRequired(true)
        ->addFilter('StripTags')
        ->addFilter('StringTrim')
        ->addValidator('NotEmpty');

        $submit = new Zend_Form_Element_Submit('Login');
        $submit->setAttrib('id', 'submitbutton');
        $submit->setValue('Login');

        $this->addElements(array($login, $password, $submit));
    }
}

De même, j’ai ici fait au plus simple. La classe est déclarée dans le fichier ‘application/forms/Login.php‘.
Il ne vous reste plus qu’a déclarer le formulaire dans le contrôleur gérant l’authentification. Par exemple :

<?php

class AuthController extends Zend_Controller_Action
{

    public function init()
    {
        $this->initView();
	$this->view->baseUrl = $this->_request->getBaseUrl();
    }

    public function loginAction()
    {
    	$this->view->title="Mon Site Web - Login";
        $form =  new Default_Form_Login();
        $this->view->form = $form;
    }

}

On affiche le formulaire dans notre fichier vue :


<?php
    echo $this->form;
    echo '<br />';
    echo $this->error;
?>

Voilà tout est en place pour nous permettre maintenant d’utiliser Zend_Auth_Adapter_DbTable.
On va donc ajouter dans l’action login de notre contrôleur :


    public function loginAction()
    {
        // Si l'utilisateur est déjà loggué on le redirige à l'accueil
    	if(Zend_Auth::getInstance()->hasIdentity()) $this->_redirect('/index');

    	$this->view->title="Mon Site Web - Login";

		$form = new Default_Form_Login();
		$this->view->form = $form;
                $formData = $_POST;

		if($this->getRequest()->isPost()) {
	            if ($form->isValid($formData)) {
					$f = new Zend_Filter_StripTags();
					$username = $f->filter($form->getValue('login'));
					$password = $f->filter($form->getValue('password'));

					$dbAdapter = Zend_Db_Table_Abstract::getDefaultAdapter();
					$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
					$authAdapter->setTableName('users');
					$authAdapter->setIdentityColumn('username');
					$authAdapter->setCredentialColumn('password');

					// On assigne les valeurs pour que l'authentification s'effectue
					$authAdapter->setIdentity($username);
					$authAdapter->setCredential(sha1($password)); // On a pris la précaution d'au moins chiffrer les mdp

					// On tente l'authentification
					$auth = Zend_Auth::getInstance();
					$result = $auth->authenticate($authAdapter);
                         // On test si tout s'est bien passé
	                if($result->isValid())
	                	{
	                		$data = $authAdapter->getResultRowObject(null, 'password');
					$auth->getStorage()->write($data);
					$this->_redirect('/admin');
	                	}
	                	else
	                	{
	                	$this->view->error = 'Mauvais login ou mauvais mot de passe.';
                    		$form->populate($formData);
	                	}
				    }
		    	else {
	                $this->view->error = 'Vous devez remplir tous les champs.';
                        $form->populate($formData);
		    	}
		}
    }

Et voilà ZF a automatiquement géré l’authentification pour nous. On peut maintenant accéder au données de l’utilisateur via Zend_Auth::getInstance()->getIdentity().
Ainsi si on veut afficher le nom de l’utilisateur :

<?php
     $auth = Zend_Auth::getInstance()->getIdentity();
     echo $auth->username;
?>

Et voilà, bientôt de nouveaux articles sur l’utilisation du Zend Framework.

Catégorie: Développement Web, PHP, Zend Framework | Laisser un commentaire (12)