Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-settings.php on line 472

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-settings.php on line 487

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-settings.php on line 494

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-settings.php on line 530

Strict Standards: Declaration of Walker_Page::start_lvl() should be compatible with Walker::start_lvl(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 594

Strict Standards: Declaration of Walker_Page::end_lvl() should be compatible with Walker::end_lvl(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 594

Strict Standards: Declaration of Walker_Page::start_el() should be compatible with Walker::start_el(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 594

Strict Standards: Declaration of Walker_Page::end_el() should be compatible with Walker::end_el(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 594

Strict Standards: Declaration of Walker_PageDropdown::start_el() should be compatible with Walker::start_el(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 611

Strict Standards: Declaration of Walker_Category::start_lvl() should be compatible with Walker::start_lvl(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 705

Strict Standards: Declaration of Walker_Category::end_lvl() should be compatible with Walker::end_lvl(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 705

Strict Standards: Declaration of Walker_Category::start_el() should be compatible with Walker::start_el(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 705

Strict Standards: Declaration of Walker_Category::end_el() should be compatible with Walker::end_el(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 705

Strict Standards: Declaration of Walker_CategoryDropdown::start_el() should be compatible with Walker::start_el(&$output) in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/classes.php on line 728

Strict Standards: Redefining already defined constructor for class wpdb in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/wp-db.php on line 306

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/cache.php on line 103

Strict Standards: Redefining already defined constructor for class WP_Object_Cache in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/cache.php on line 425

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/query.php on line 21

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/theme.php on line 623

Strict Standards: Redefining already defined constructor for class WP_Dependencies in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/class.wp-dependencies.php on line 15

Strict Standards: call_user_func_array() expects parameter 1 to be a valid callback, non-static method Wordics::myWordics_init() should not be called statically in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/plugin.php on line 311
Développement et arts numériques » php
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/kses.php on line 947

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/sdb/8/f/dev.art/wordpress/wp-includes/kses.php on line 948

Archive

Posts Tagged ‘php’

Lien entre DOM et simpleXml

juin 20th, 2009

Présentation

En Php, il existe une librairie majeure pour la manipulation d’un objet xml, celle-ci s’appelle le DOM (DOMxml en php4).

Cette libraire reprends les spécifications du DOM fourni par le W3C, en ajoutant différentes ressources intéressantes comme la classe DOMDocumentFragment qui permet d’ajouter une chaine de caractères directement dans un document, des extensions permettant d’importer et d’exporter un noeud ou un document entier vers d’autres librairies.
D’autres librairies existent nous nous intéresserons à simpleXML, qui permet de simplifier (;)) un certain nombre d’opérations.
Nous verrons dans cet article quelles relations peuvent être effectuées entre ces librairies et quels bénéfices elles apportent.

Avantage et inconvénient des DOMDocuments

Un DOMDocument est un objet complexe qui nécessite une utilisation très rigoureuse, il est par exemple très difficile de récupérer une page web sans générer avertissements et erreurs. La chaine importée pour le créer doit être absolument formater suivant les standards.
La manipulation est par contre aiser et toutes les fonctions habituelles de parcours (nextSibling, firstChild, parentNode…), de modification (insertBefore, insertAfter, removeChild,…) sont implantées.

Avantage et inconvénient de simpleXML

SimpleXML, quand à elle est une bibliothèque simplifiée, le nombre de fonction est restreint et clair, la création simplifié, l’export aussi. La chaine conserve un formatage même après manipulation. Et chose agréable les conventions php, parcours de tableau, impression temporaire à l’aide de print_r,… sont conservées.
A l’inverse du DOM, les fonctions de manipulations sont malheureusement absentes, les modifications difficiles.

Une utilisation conjointe

Dans un soucis de simplicité et d’efficacité nous pouvons donc utiliser simpleXML pour le chargement et l’export, les lectures, et les ajouts simples. Pour des manipulations plus précises nous utiliserons le DOM, les méthodes et propriétés qui y sont associés.
En voici un exemple sur une insertion d’un noeud :

$xml=simplexml_load_file ("fichier1.xml");
$xml2=simplexml_load_file ("fichier2.xml");
$items=$xml2->channel->item;
foreach($items as $item){
    //Importation, création de l'arbre de base et placement sur le noeud cible
    $nodeFirstItem = dom_import_simplexml($xml->channel->item[0]);
    //ownerDocument représente le document de type DOMDocument créé
    //à la ligne précédente. true spécifie que les fils sont eux aussi importés
    $importNode=$nodeFirstItem->
        ownerDocument->importNode(dom_import_simplexml($item),true);
    //Manipulation de l'arbre par insertion
    $nodeFirstItem->parentNode->insertBefore($importNode, $nodeFirstItem);
}

Dans cette exemple nous supposerons que les fichiers fichier1 et fichier2 contenaient respectivement

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>All About Everything</title>
    <link>http://www.example.com/podcasts/everything/index.html</link>
    <item>
      <title>Shake Shake Shake Your Spices</title>
      <guid>http://example.com/podcasts/archive/aae20050643.m4a</guid>
    </item>
  </channel>
</rss>

et

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>All About World</title>
    <item>
      <title>Your Spices</title>
      <guid>http://example.com/podcasts/archive/aae20050615.m4a</guid>
    </item>
    <item>
      <title>Another Shake</title>
      <guid>http://example.com/podcasts/archive/aae20050620.m4a</guid>
    </item>
    </channel>
</rss>

L’avantage de cette technique est que les modifications apporter au DOMDocument sont transmises sans aucune fonction supplémentaires à l’objet simpleXML.
Une exemple en suppression de noeud :

$xml=simplexml_load_file("fichier2.xml");
$delNode = dom_import_simplexml($xml-&gt;channel-&gt;item[1]);
$delNode-&gt;parentNode-&gt;removeChild($delNode);

Conclusion

De mon point de vue, la meilleure solution serait une création de classes enfants aux classes du dom, facilitant les manipulations les plus courantes. Cette solution bien que propre et certainement plus saine qu’une utilisation conjointe de deux classes demanderait un temps de développement important.
Ces bibliothèques étant standards, elles sont maintenus par le PHP Group. Cela garantit une évolution suivie et constante tant au niveau des performances que de l’interopérabilité. De plus le temps étant une variable inaltérable, du moins sur notre chère planète bleu, nombre de projet devront conserver une utilisation des bibliothèques standards et il sera souhaitable de recourir aux techniques énoncées plus haut.
Libre à vous de choisir, et bon développement

Author: Nicolas de Marqué Categories: Développement, Web Tags: , ,

Le chargement multiple en PHP

avril 22nd, 2009

La fonction File_get_contents

Afin de charger des pages, la fonction file_get_contents est la plus souvent utilisée. Son avantage est d’être simple, elle ne demande aucune ouverture de flux, permet une récupération directe des données en format texte et tout aussi bien fonctionnel sur un flux distant que local.

Un exemple de code avec file_get_contents

$text_page1=file_get_contents("http://www.unsite.net/unepage.html");
$text_fichier=file_get_contents("/unchemin/unfichier.ext");
$text_ftp=file_get_contents("ftp://nom:passe@unsiteftp/unchemin/unfichier");

Chargement multiple

La problématique

Cependant, l’utilisation de file_get_contents montre sa limite dès que l’on cherche à charger plus de 3 ou 4 fichiers. En effet, le chargement de fichiers doit être réalisé suivant un mode file réalisant chaque chargement l’un après l’autre. Les chargement de fichier distant étant réalisé sur des temps calculable en dixième de secondes, le chargement pourra facilement atteindre la seconde dès 3 à 5 fichiers et la minute à partir de 50 fichiers.
Plusieurs difficultés majeures se présentent donc :

  • un utilisateur n’attendrait pas un résultat devant son navigateur si longtemps
  • la plupart des serveur php public, présente un temps d’execution limité pour chaque script php autour de 45 secondes
  • le temps d’exécution est environ proportionnel au nombre de fichier

La solution multicurl

Curl est un gestionnaire de session distante. La librairie licurl créée par Daniel Stenberg est créé pour se connecter à différents services comme telnet, http, ftp ou nombre d’autres protocole. l’avantage dans notre cas est qu’elle permet de lancer plusieurs processus en parallèle et en tache de fond. Le désavantage est que cet ensemble nécessite une mise en place plus complexe.

Un exemple de code avec curl

/*** Initialisation des connections */
$urls=array("http://google.com", "http://voila.fr",
 "http://altavista.com", "http://kartoo.com");
$i=0;
$multiCurl= curl_multi_init();
foreach($urls as $url){
	$curls[$i] = curl_init();
	curl_setopt($curls[$i], CURLOPT_URL, $url);
	curl_setopt($curls[$i], CURLOPT_HEADER, 0);
	curl_setopt($curls[$i], CURLOPT_RETURNTRANSFER, true);
	curl_multi_add_handle($multiCurl,$curls[$i]);
	$i+=1;
}
/*** Exécute le gestionnaire de connexion */
$running=null;
do {
	curl_multi_exec($multiCurl,$running);
} while ($running > 0);
for($j=0; $j<$i; $j++){
	$page[]=curl_multi_getcontent($curls[$j]);
	curl_multi_remove_handle($multiCurl, $curls[$j]);
}
/*** Ferme les gestionnaires */
curl_multi_close($multiCurl);

La solution popen

Une dernière solution est l’utilisation de popen. Son grand avantage et tout à la fois son inconvénient majeur est la possibilité d’utiliser cette fonction pour toutes les commandes du système accessible à l’interpréteur php. En effet, nombre de serveur ne laisse accessible que peu de fonctions. D’autre part, la mise en place est relativement archaïque et ressemble à l’ouverture fermeture de fichier présente en C.

Un exemple de code avec popen

$urls=array("http://google.com"; "http://voila.fr";
 "http://altavista.com"; "http://kartoo.com");
 
# Lancement des traitement en parallèle
foreach($urls as url){
        $f[]=popen("wget ".$url);
}
 
# Lecture des résultats
for($i=0; $i<count($urls); $i++){
        $str = fgets($f[$i]);
        fclose($f[$i]);
}
Author: Nicolas de Marqué Categories: Web, php Tags: , ,

Récupérer flux de sortie en php

juillet 4th, 2008

Fonctions très utiles pour qui veux mélanger php et html sans avoir peur de perdre la coloration syntaxique ou les possibilités d’auto complétion permises par les éditeurs modernes. Vous éditer un fichier html comportant quelques balises php pour les variables à afficher, et vous le trater à partir d’une fonction similaire à celle-ci :

Exemple :

function affich($vars, $url_du_fichier_a_inclure){
    //rend disponible les variables dans la fonction
    foreach($vars as $n=>$v)$$n=$v;
    //Stoppe le flux de sortie et le bufferise
    ob_start();
    include("url_du_fichier_a_inclure");
    //Sauvegarde du tampon dans une variable
    $buffer = ob_get_flush();
    ob_end_clean ()
?>
Author: Nicolas de Marqué - Fromentin Categories: Web, html, php Tags: ,

Bench php

juillet 4th, 2008

Pour se rappeler des bonnes pratiques voir sur phpbench.com

Les benchs proposés permettent de comparer les méthodes suivantes :

  • Boucle de lecture:foreach() vs. for() vs. while(list() = each())
  • Boucle compteuse: For-loop test
  • Coucle de Modification: foreach() vs. for vs. while(list() = each())
  • Using the & -ref-operator…as a so called “alias”
  • Using the =&-ref-operator $obj = $someClass->f() vs. $obj =& $someClass->f()
  • Sortie chaines : echo vs. print
  • Using the =&-ref-operator $obj = new SomeClass() vs. $obj =& new SomeClass()
  • Structure de control : switch/case/default vs. if/elseif/else
  • Boucle compteuse : For vs. While
  • Test du type de variable : isSet() vs. empty() vs. is_array()
  • Type de guillement : double (”) vs. single (’) quotes
Author: Nicolas de Marqué Categories: Web, php Tags: ,