lindev : administration linux , développement php

Aller au contenu | Aller au menu | Aller à la recherche

01 fév. 2010

couchDB par la pratique

C'est quoi couchDB

couchDB.png

CouchDB est un serveur de base de données orienté Document et accessible via une API REST HTTP/JSON.
Sans schéma, sans tables, ce qui offre une flexibilité sans limite de vos documents.

Comment , simplement car couchDB est une base qui n'est pas relationnel , il n'y a donc pas de structure qui fige les documents .

Comment l'utiliser

CouchDB utilise le protocole HTTP , avec des entêtes en GET , PUT , POST , DELETE , COPY.

Avec une possibilité d'activer l'authentification HTTP pour restreindre les accès selon vos souhaits
Pour vous simplifier la vie , j'ai développé une librairie qui réuni les méthodes indispensables pour utiliser une base couchDB , cette librairie vous permettra les action suivantes :

 * Création / suppression de bases
 * insertions de documents
 * suppressions .. 
 * copie
 * déplacements
 * réplication 
 * lecture
 * etc ..


Pour la documentation complète , voir le wiki .

oscar_couchDB

Nous allons quand même ici expliquer l'utilisation basic d'une base couchDB avec cette librairie

initialisation

Comme le précise la doc , il nous suffit d'inclure simplement la lib :

require_once 'Oscar_couchDB.php';

Nous allons ensuite récupérer une instance de la classe :

$Ocdb   =   Oscar_couchDB::getInstance();

Commençons par configurer l'accès au serveur principal , qui a comme adresse ip 10.0.0.220:

$Ocdb->set_host('10.0.0.220');
$Ocdb->set_port(5999);

Nous voilà fin prêt à attaquer ....

Commençons par créer notre table

if( ! $Ocdb->add("mabase") ){
   echo "Échec à la création de la base de données";
}

Une fois notre base crée , nous allons pouvoir la remplir avec des documents , pour créer un document , il faut de nouveau faire appel à la méthode add().

$doc = array("NOM"=>"Document A","TYPE"=>"texte");
 
$retour = $Ocdb->add("mabase","0001",$doc);
if(  $retour == false ){
    echo "Erreur à la création du document , erreur : $retour";
}else{
    echo "Document crée avec succès , <br>ID: ".$retour['id']."<br>REVISION: ".$retour['rev'].";
}

Comme vous l'aurez remarqué un document possède à sa création une révision , cela permet par exemple lors d'une modification non volontaire , de revenir en arrière .
Cependant , cela reste limité en temps , car si l'on compacte la base , seule la dernière révision est disponible .

Pour connaitre les révisions d'un document , vous pouvez faire appel à cette méthode :

$Ocdb->all_revs("mabase", "0001");

0001 étant l'id du document qui se doit d'être unique .

Et pour compacter la base pour un gain de place :

$Ocdb->compact_database('mabase');

Maintenant , comment récupérer notre enregistrement ?
Nous allons simplement utiliser la méthode get()

$mondocument = $Ocdb->get("mabase","0001");

Vous voilà avec un tableau $mondocument qui contient toutes les données que vous y avez entrées ainsi que son id et sa révision .

Pour lire une révision spécifique , il est possible de préciser celle-ci comme-ceci :

$mondocument = $Ocdb->get("mabase","0001",$revision);

Dans l'ordre des choses , nous allons supprimer ce document , voici la méthode :

$database = 'mabase';
$iddocument = '0001';
$revdoc = '1-872c3e4693b3e608148fb85b3f64df74';

$Ocdb->delete($database, $iddocument, $revdoc);

Ici la révision du document est obligatoire .



Voilà pour ces quelques exemples , il y a encore de nombreuses autres méthodes aussi simples les unes que les autres à utiliser , je vous laisse les découvrir via la documentation ici

replication

Il y a un point important , car c'est un avantage non négligeable de couchDB , la replication , qui est d'une simplicité étonnante .

Dans la librairie , il y a donc une méthode qui vous permet de répliquer vos données , de façon manuelle , mais aussi automatique , voici sa mise en place .

Commençons par paramétrer les coordonées des serveur A et B

$Ocdb->set_replication('10.0.0.220','10.0.0.221','5984','mabase','mabase_Repli');

Nous avons donc ici spécifié l'adresse du serveur source , suivi de celle du serveur cible , le port du serveur cible , la base de données source , et pour finir la base de données cible , qui n'est pas obligatoirement du même nom.

De plus si les base source/cible n'héxiste(s) pas , la librairie tentera de la/les créer .
Le réplication paramétrée , activons l'automatisme pour être certains que chaque action faite sur le serveur source soit immédiatement faite sur le serveur cible.

$Ocdb->auto_replique(TRUE);

Et voilà , plutôt simple non ?

Si le serveur cible n'est pas disponible , ce n'est pas grave , la réplication se faisant sur les logs binaire , il rattrapera automatiquement son retard lorsqu'il sera de nouveau disponible .
De plus , si le serveur source , tombe , vous pouvez attaquer directement sa réplication , en changeant les paramètres via set_replication , et lorsque le serveur sera de nouveau disponible , il se mettra automatiquement à jour , toujours grâce au logs binaires .

utile

Nous avons vue ici l'utilisation de quelques méthodes de la librairie Oscar_couchDB , mais il faut savoir que vous pouvez creer des vues en javascript qui vous permettent de faire des requêtes , filtres ect sur les documents en base , je vous donne un lien complet pour apprivoiser celà .
unixGarden

La librairie est disponible à plusieurs endroits :

 *  phpClasses
 *  dans les libs de mon fw fw-oscar.fr

27 oct. 2008

Introduction aux services web

C'est quoi un service web

Un service web , permet , à partir de votre propre programme (appli php par exemple ) d'effectuer une opération prise en charge par un serveur distant et qui distribue les informations à qui le souhaite ...

Exemple , je veux la météo sur lille , je vais demander au serveur X de me donner cette météo (température , levé et couché du soleil ect ..) pour la ville de lille .

Pour effectuer cela , nous allons utiliser le protocole soap .

Ce que je vais vous montrer

Le principe encore une fois , je ne vais pas aller dans le détail dans ce premier article .. par la suite pourquoi pas .. . Nous allons voir comment creer un service web distant , et nous allons nous connecter pour y récupérer les infos qu'il distribue.

Création du service

Nous allons creer notre service , ici , il s'agit de donner l'adresse ip du serveur distant qui propose un webservice ... rien de bien interessant , mais le but et de comprendre la mise en place d'un service web ...

Commençons donc à creer notre classe :

<?php
$wsdl	=	"sw.wsdl";

class sw{
	
	function affiche()
	{
		$info = "L'adresse ip du server distant est : $_SERVER[SERVER_ADDR]";
		return $info;
	}
}

$server	=	new SoapServer($wsdl);
$server->setClass("sw");
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
?>

Nous avons donc une classe sw avec la méthode affiche() qui retourne l'adresse ip du serveur .. le $wsdl dentifie le fichier wsdl qui vat permettre au client de savoir quelle fonctions sont disponibles , avec quels paramétres , et ce que chaque fonction va retourner ...

Nous n'allons pas entrer dans les détails pour la création du fichier wsdl , celui étant d'une complexité assez lourde si nous le faisons à la main .. Heureusement des utilitaires nous dispensent des ce travail .. a savoir , l'editeur ZendStudio (que j'utilise) , ou en gratuit , uml2php5 de dia expliqué dans un précédent billet ...

Voici donc ce fichier que j'ai nommé ws.wsdl :

<?xml version='1.0' encoding='UTF-8'?>

<!-- WSDL file generated by Zend Studio. -->

<definitions name="sw" targetNamespace="urn:sw" xmlns:typens="urn:sw" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
	<message name="affiche"/>
	<message name="afficheResponse">
		<part name="afficheReturn"/>
	</message>
	<portType name="swPortType">
		<operation name="affiche">
			<input message="typens:affiche"/>
			<output message="typens:afficheResponse"/>
		</operation>
	</portType>
	<binding name="swBinding" type="typens:swPortType">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="affiche">
			<soap:operation soapAction="urn:swAction"/>
			<input>
				<soap:body namespace="urn:sw" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output>
				<soap:body namespace="urn:sw" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
	</binding>
	<service name="swService">
		<port name="swPort" binding="typens:swBinding">
			<soap:address location="http://soap.lindev.fr/sw.php"/>
		</port>
	</service>
</definitions>

Notez bien ici , que la ligne importante est : http://soap.lindev.fr/sw.php qui correspond à l'adresse ou se trouve le script qui contient les fonction décrites dans le fichier wsdl ..

Voilà , je met donc les fichiers suivants :

  • sw.php
  • sw.wsdl

sur le serveur distant pour qu'ils soient accessibles à cette adresse :

http://soap.lindev.fr

Le client

Pour le client , c'est encore plus simple ..

<?php

$wsdl = "http://soap.lindev.fr/sw.wsdl";

$client	=	new SoapClient($wsdl);

echo $client->affiche();

?>

Nous commençons par définir ou se trouve le fichier du service web à contacter .. ici : http://soap.lindev.fr/sw.wsdl Pius l'on instancie SoapClient avec comme argument , l'adresse du fichier wsdl ...

Grace à l'instance de SoapClient , nous avons de nombreuses possibilitées .. comme avoir des infos sur le web service , les fonctions disponibles ect ...

Ici nous executons juste la méthode distante affiche() qui nous renvoie l'adresse ip du serveur ...

Et voilà nous avons creé un service web ... bon ok ce service est vraiment peut utile , mais le principe reste le même pour des requêtes plus complexes .

Si vous avez des questions , n'hésitez pas , en me contacter ..

Lien de ressources : fonctions SOAP