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)

François Lembrouille : Vendeur informatique

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

Le grand François Damien dans le rôle d’un vendeur informatique, à voir et à revoir.

Lien de la vidéo

Très drôle les gens qui font semblant de comprendre ce qu’il raconte.

Merci à Canal+ d’avoir mis la vidéo à notre disposition.

Catégorie: Geek, Internet | Laisser un commentaire (0)

Ixquick le moteur de recherche le plus sûr du net

Posté par seiyar81 le 4 février 2010 | Laisser un commentaire (1)

A l’heure où la protection des informations privées est bafouée par les plus grands du Web (suivez mon regard) sans que cela n’inquiète la grande majorité des utilisateurs, certains utilisateurs (moi y comprit) cherchent les meilleures solutions pour divulguer un minimum d’informations et surtout veulent être sûrs que ces informations ne seront pas conservées.

Ixquick est un moteur de recherche qui se pose comme l’alternative obligatoire à Google, Bing et consorts en matière de respect de la vie privée.
En effet Ixquick ne conserve aucune information concernant vos recherche, contrairement à ses concurrents et même si Bing a réduit la durée de conservation des IP à 6 mois elles sont tout de même conservées pendant cette période.

Mais Ixquick va plus loin, il est le premier navigateur à avoir reçu le logo European Privacy Seal le certifiant comme étant sûr par l’Union Européenne, c’est Viviane Reding elle-même qui le dit !

EPS

Il est possible d’utiliser le moteur de recherche via HTTPS (contrairement à Google, Bing ou Yahoo), ce qui plutôt agréable.

Enfin un service de proxy mandataire a été lancé le 28 Janvier. Pour l’utiliser c’est simple, à côté des résultats de la recherche se trouve un lien Proxy qui vous permet de récupérer la page via le proxy d’Ixquick. C’est donc le proxy qui récupère la page pour vous et vous la renvoit.
Le service fonctionne très bien, forcément c’est un peu plus long que de récupérer la page soi-même,
mais êtes-vous prêts à sacrifier votre vie privée pour quelques milli-secondes ?

Catégorie: Internet | Laisser un commentaire (1)

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)

Datatables : base de données, traduction et jQuery-UI

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

J’avais présenté ce fabuleux plugin pour jQuery qu’est Datatables et expliqué rapidement ce dont il est capable.
Aujourd’hui je vous propose une mise en situation, avec comme objectif l’interaction avec une base de données, une traduction en français (ou une autre langue parmi les 29 disponibles), la mise en forme avec l’aide jQuery-UI, et d’autres fonctionnalités.

Tout d’abord si vous ne possédez pas encore le plugin téléchargez-le ici.
Ensuite nous allons placer le code de notre tableau dans notre page, imaginons que l’on souhaite afficher des utilisateurs :

<table id="datatable" >
  <thead>
       <tr>
            <th>Nom</th>
            <th>Prénom</th>
            <th>Inscription</th>
            <th>Mail</th>
            <th></th>
        </tr>
  </thead>
 <tbody>
       <tr>
            <td colspan="4">Chargement des données...</td>
        </tr>
  </tbody>
</table>

Maintenant le code Javascript. Nous allond indiquer que l’on souhaite récupérer les données via un fichier côté serveur :

$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php"
	} );
} );

Le plugin ira donc récupérer le fichier get_data.php pour remplir le tableau. Les données renvoyées par le fichier php doivent être au format JSON.
Voici un exemple du contenu de get_data.php inspiré de la documentation de Datatables mais vous êtes libre de modifier le code pour utiliser PDO, ou une autre méthode d’accès à la base de données si vous utilisez un autre SGBD que MySQL.

<?php
  /* MySQL connection */
	$gaSql['user']       = "username";
	$gaSql['password']   = "password";
	$gaSql['db']         = "mydb";
	$gaSql['server']     = "localhost";
	$gaSql['type']       = "mysql";

	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
		die( 'Could not open connection to server' );

	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or
		die( 'Could not select database '. $gaSql['db'] );

	/* Paging */
	$sLimit = "";
	if ( isset( $_GET['iDisplayStart'] ) )
	{
		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
			mysql_real_escape_string( $_GET['iDisplayLength'] );
	}

	/* Ordering */
	if ( isset( $_GET['iSortCol_0'] ) )
	{
		$sOrder = "ORDER BY  ";
		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
		{
			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
			 	".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
		}
		$sOrder = substr_replace( $sOrder, "", -2 );
	}

	/* Filtrage - Remplace le filtrage côté client, peut donc être long si la base de données est importante
	 */
	$sWhere = "";
	if ( $_GET['sSearch'] != "" )
	{
		$sWhere = "WHERE nom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
		                "prenom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
		                "inscription = '".mysql_real_escape_string( $_GET['sSearch'] )."' OR ".
		                "mail = '".mysql_real_escape_string( $_GET['sSearch'] )."'";
	}

	$sQuery = "SELECT id, nom, prenom, inscription, mail FROM users $sWhere $sOrder $sLimit";
	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());

	$sQuery = "SELECT FOUND_ROWS()";

	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
	$iFilteredTotal = $aResultFilterTotal[0];

	$sQuery = "SELECT COUNT(id)	FROM users";
	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultTotal = mysql_fetch_array($rResultTotal);
	$iTotal = $aResultTotal[0];

	$sOutput = '{';
	$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', ';
	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
	$sOutput .= '"aaData": [ ';
	while ( $aRow = mysql_fetch_array( $rResult ) )
	{
		$sOutput .= "[";
		$sOutput .= '"'.addslashes($aRow['nom']).'",';
		$sOutput .= '"'.addslashes($aRow['prenom']).'",';
		$sOutput .= '"'.addslashes(date(H:i d/m/Y'', $aRow['inscription'])).'",';
		$sOutput .= '"'.addslashes($aRow['mail']).'"';
		$sOutput .= '"Détails"';
		$sOutput .= "],";
	}
	$sOutput = substr_replace( $sOutput, "", -1 );
	$sOutput .= '] }';

	echo $sOutput;

	function fnColumnToField( $i )
	{
		if ( $i == 0 )
			return "nom";
		else if ( $i == 1 )
			return "prenom";
		else if ( $i == 2 )
			return "inscription";
		else if ( $i == 3 )
			return "mail";
	}
?>

Et voilà notre tableau se remplit automatiquement avec les données renvoyées par le fichier get_data.php.
La méthode utilisée dans l’exemple pour renvoyer les données au format JSON est un peu barbare, utiliser json-encode sur un array serait à mon humble avis plus approprié, à vous de voir.

  intval($_GET['sEcho']),
				  'iTotalRecords'=>$iTotal,
				  'iTotalDisplayRecords'=>$iFilteredTotal);
 $aaData = array();        

	while ( $aRow = mysql_fetch_array( $rResult ) )
	{
            $tmp = array();
	    $tmp[] = addslashes($aRow['nom']);
		$tmp[] = addslashes($aRow['prenom']);
		$tmp[] = date(H:i d/m/Y'', $aRow['inscription']);
		$tmp[] = addslashes($aRow['mail']);
		$tmp[] = '<a href="user.php?id='.$aRow['id'].'">Détails</a>';

		$aaData[] = $tmp;
	}
   $sOutput['aaData'] = $aaData;

   echo json_encode($sOutput);

Je n’ai pas testé le code mais cela devrait fonctionner.

Bon tout ça c’est bien beau mais on aimerait bien avoir une traduction en français plutôt que d’avoir Show 10 entries, Search ect, car même si on comprend ça fait tâche.
Et bien le plugin nous offre la possibilité de traduire le plugin dans pas moins de 29 langues dont l’anglais, l’allemand, l’espagnol, le portugais, le chinois etc.
Pour mettre en place la traduction il n’y a rien de plus simple, on va rajouter une option dans la déclaration de notre tableau :

$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php",
                "oLanguage": { "sUrl": "datatable_fr.txt" }
	} );
} );

Il suffit ensuite de placer la traduction correspondante dans le fichier datatable_fr.txt. La liste des codes à placer est disponible ici.
Vous pouvez modifier les traductions ou bien créer les vôtres très simplement. Pour éviter un appel du fichier sur le serveur vous pouvez également faire comme ceci :

$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php",
                "oLanguage": { "sProcessing":   "Traitement en cours...",
                   "sLengthMenu":   "Afficher _MENU_ éléments",
	           "sZeroRecords":  "Aucun élément à afficher",
	           "sInfo": "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
	           "sInfoEmpty": "Affichage de l'élement 0 à 0 sur 0 éléments",
	           "sInfoFiltered": "(filtré de _MAX_ éléments au total)",
	           "sInfoPostFix":  "",
	           "sSearch":       "Rechercher:",
	           "sUrl":          "",
	           "oPaginate": {
		        "sFirst":    "Premier",
		        "sPrevious": "Précédent",
		        "sNext":     "Suivant",
		        "sLast":     "Dernier"
	               }
                }
	} );
} );

Enfin on aimerait styliser notre tableau et donc utiliser la puissance de jQuery-UI. Pour cela rien de plus simple, il suffit de posséder les fichiers de jQuery-UI (.js, .css et les images) et de les avoir inclus. Comme pour la traduction une simple ligne suffit :

       ...
       "bJQueryUI": true,
       ...

Vous pouvez voir encore plus d’exemple sur cette page.

Catégorie: Développement Web, Javascript | Laisser un commentaire (12)