Archives par mot-clé : PHP

Comment importer une grosse base de données

Publié dans SQL | Un commentaire

Ce billet aurait aussi pu se nommer « Vive la ligne de commandes ! ».
Je pense arriver au bout de mes peines avec ma grosse tables de 3 millions de tuples (qui n’en fait d’ailleurs toujours pas 3 millions, alors j’espère que ça tiendra le coup quand tous les tuples seront là), et j’ai notamment pas mal galéré pour la transférer d’une base de données à une autre. (local -> serveur de développement) Si on utilise PHP, ou PhpMyAdmin, pour transférer sa BDD, on se retrouve vite avec de très long temps d’attente et avec une machine qui rame jusqu’à la mort. Quelques idées pour survivre entier à ce calvaire :
sql

  • Préférer le transfert à l’aide de fichiers. Car le copier/coller de requêtes fonctionnent pour de petites tables, mais ça fait très vite ramer votre machine de course pour de grosses tables. Il suffit d’exporter les tables de son choix via PhpMyAdmin (à l’accueil d’une base > exporter : pour exporter les tables de son choix. A l’accueil d’une table > exporter : pour exporter directement la table en question), puis dans les importer via PhpMyAdmin, ou en ligne de commandes. Il vaut mieux éviter de cocher la case « Insertion Complète » qui créé une seule requête INSERT INTO table (val1, val2) VALUES ('blabla', 'bloublou'), ('blibli', 'bleble'), ..., ('blublu', 'bloblo'); ce qui peut être un peu trop lourd. Mieux vaut créer autant de requêtes qu’il y a d’insertions dans ce cas. (le mieux serait de faire une requête pour une trentaine d’insertions, c’est vraiment plus rapide, mais cela oblige à coder tout ça soit même. Edit: apparemment, il faut choisir « Insertions Etentdues ».)
  • Préférer l’utilisation des lignes de commandes. Pour plusieurs raisons : plus de problèmes avec les timeout de MySQL ou de PHP puisqu’on effectue une commande à la fois. (sauf si on commande est trop lourde. Dans le cas d’une insertion complète par exemple), on contrôle réellement tout ce qui se passe en temps réel et on peut réellement tout arrêter en temps réel. (suffit de fermer le terminal quoi !), on ne passe par aucun intermédiaire et c’est donc vraiment plus rapide.

Continuer la lecture

Documentation d’un module toolbar en PHP objet

Publié dans Projets | Laisser un commentaire

Je parle ici d’une toolbar, ou BBcodeBar, permettant d’utiliser facilement du BBcode (du BNcode pour être précis) lorsque l’on écrit un article ou que l’on poste sur un forum, un commentaire… (que sais-je encore !) Bref, quelque chose qui ressemble à ça :
Exemple de toolbar
Voilà déjà pas mal de temps que j’utilise la même toolbar sur mes sites Internet. C’est une toolbar que j’ai créé et qui est basé sur une mod conçue à l’origine pour le système de forum FluxBB (ex-PunBB) par Vin100. A chaque fois, je la modifie et je galère pour l’intégrer correctement au site du momenet, et surtout je me retape tout le travail dès que je dois modifier quelque chose. Voilà pourquoi depuis quelques jours, quand l’envie me prend, je développe une version PHP objet de cette toolbar de façon à la rendre plus portable, plus paramétrable et aussi plus performante. J’approche désormais de la fin, et donc de la première publication d’une version 1. Voici donc un premier jet de documentation, entre autre, pour vérifier que rien n’a été oublié.

But

  • Créer une toolbar permettant d’utiliser facilement du BBcode (user friendly)
  • Créer un système de gestion de toolbars complet et paramètrable : génération de plusieurs toolbars, paramétrage du contenu des toolbars, désactivable ou désinstalable en 1 clic (surtout coder friendly)
  • Mettre en pratique mes connaissances en PHP objet, et améliorer celles en Javascript

Continuer la lecture

Tout ce qu’il faut savoir pour crawler tranquilement

Publié dans PHP | Laisser un commentaire

Ah, avant toute chose qu’est-ce que j’entends par le mot « crawler » ? On pourrait appeler ça « scrapper », « looter », voir même « pirater ». En fait l’idée est de créer un petit programme dont le but va être de récupérer des informations sur un site Web qui se trouve en ligne (ou pas). Exactement comme fait le GoogleBot ou les autres robots de moteurs de recherche. Et comme font aussi les robots qui cherchent des adresses e-mails pour faire du spam… Bref, on voit qu’il peut y avoir un petit problème éthique derrière le scrolling, mais c’est une discipline qui peut être tout à fait noble et utile autant pour le crawleur que pour le crawlé. Mais je ne vais pas faire de débat philosophique, plutôt parler technique.
Durant le stage que j’effectue actuellement, j’ai pas mal l’occasion de crawler des sites Web, voici donc un résumé de fonctions ou de techniques qui peuvent être utiles.

Le crawling en résumé

L’idée principale est de faire automatiquement rapidement ce que l’on aurait dû faire à la main en mettant beaucoup de temps. Pour cela, on fait une petite étude des urls du site que l’on souhaite crawler. Par exemple, si c’est une liste d’article, les pages de chaque article auront peut-être un url avec quelque chose du genre : article.php?id=1452112. A partir de la :

 $url = 'article.php?id={id}'; for($i=1; $i<=$nbArticle; $i++) {
	$urlAScroller = str_replace('{id}', $i, $url);
	$content = file_get_contents($urlAScroller);
	// Regex et explode sur $content pour récupérer les informations souhaitées }

Continuer la lecture

Une fonction regex bien utile : preg_match_all

Publié dans PHP | 2 commentaires

J’avais utilisé cette fonction il y quelques temps et je n’arrivais à mettre la main dessus. preg_match_all() est très pratique lorsque l’on souhaite récupèrer plusieurs données d’un seul coup. Que fait-elle en gros ? On lui fournit un pattern (comme pour une regex classique, c’est le patron de ce que l’on cherche), une chaine de caractères dans laquelle effectuer la recherche, un array dans lequel on mettra les données et des options si besoin.

  • Dans la case 0 de l’array de retour, on aura un array avec toutes les chaines de caractères correspondant au pattern. (ce qui correspond au $0)
  • Dans la case 1 de l’array de retour, on aura un array avec tous les $1 de chaque chaines de caractères correspondant au pattern.
  • Dans la case 2, de l’array de retour, on aura un array avec tous les $2, … et ainsi de suite.

Exemple

Dans ma variable $content, j’ai le contenu suivant :

Nom : Duck, Prénom : Donald;
Nom : Mouse, Prénom : Mickey;
Nom : Duck, Prénom : Daisy;

Pour récupèrer les noms et prénoms de chacun des personnages, je peux donc utiliser la regex suivante :

preg_match_all('!Nom : ([^,]+), Prénom : ([^,]+);\n!isU', $content, $out, PREG_PATTERN_ORDER);

Affichons l’array de retour à l’arrache pour voir le résultat :

echo '<pre>'; print_r($out); echo '<pre><br />';

On voit bien que l’on un array avec des sous array content $0, $1, etc. On peut donc afficher noms et prénoms (ou les enregistrer dans une base de données si l’on préfère) de la manière suivante :

$nb = count($out[0]); for($i=0; $i<$nb; $i++) { 
	echo 'Patron : '.$out[0][$i].'<br />'; 
	echo $out[1][$i].' '; 
	echo $out[2][$i].'<br />';
}

Tout ceci nous évite d’utiliser plein de preg_replace() couplés avec un petit explode(). Quand c’est possible, c’est tout de même bien plus simple avec preg_match_all(). Bon, comme ça, je suis sûr de ne plus oublier cette petite fonction bien pratique.

Classes abstraites et finales

Publié dans PHP objet | 2 commentaires

Les notions de classes abstraites et classes finales permettent de sécuriser notre programmation PHP, dans le sens qu’elles permettent d’éviter qu’un programmeur, reprenant notre code, n’en contourne la logique et s’égare ainsi sur une fausse piste.
En effet :

  • Class abstraite : class qui ne peut être instanciée, il est donc OBLIGATOIRE de créer une class héritante de cette class pour s’en servir. Utile lorsque l’on créé une class générique qui ne servira qu’à créer des sous class et non à être instanciée. Une telle class ne contient donc pas de __construct() puisqu’elle n’est pas instanciée. Mot clef : abstract.
  • Class finale : class qui NE PEUT PLUS avoir de sous-class, c’est-à-dire de class héritante. Les méthodes de cette class ne pourront être surchargées (réécrites, redéfinies). Mot clef : final. De la même manière, on peut aussi déclarer des méthodes abstraites et finales.
  • Méthode abstraite : méthode qui doit OBLIGATOIREMENT être surchargée (réécrite, ou redéfinie). Une class contenant une méthode abstraite doit aussi être abstraite. Mot clef : abstract.
  • Méthode finale : méthode qui NE PEUT ÊTRE surchargée (réécrite, redéfinie). Une class finale s’applique sur toutes les méthodes ou attributs de la classe, alors qu’ici on ne touche qu’à une seule méthode. Mot clef : final. Pour bien comprendre ces 2 notions et en saisir mieux l’intérêt voici plusieurs exemples, un pour chaque cas.

Class et méthodes abstraites

 abstract class Site {
	protected $type;
	protected $name;
	public function getType()
	{
		return $this->type;
	}
	public function getName()
	{
		return $this->name;
	}
}
$monSite = new Site();
echo $monSite->getType(); // Erreur : on tente d'instancier une classe abstraite

Continuer la lecture

Cahier des charges : Doodle like en PHP objet

Publié dans Projets | 2 commentaires

Bon, il me semble que j’ai fait un bon tour de la théorie au sujet du PHP objet (j’ai encore au moins 2 billets théoriques à écrire), et je l’applique déjà depuis plusieurs semaines durant mon stage. Mais maintenant j’aimerai bien me faire un petit projet tout en PHP objet. Je ne sais pas si vous connaissez Doodle ? Je trouve le concept vraiment génial. Ce site permet à n’importe qui de créer des sondages classiques, ou alors des sortes de sondages permettant de fixer facilement une date d’un rendez-vous pour autant de personnes que l’on souhaite. Je vais donc réaliser dans les jours à venir (et j’espère arriver aux termes de ce projet) un Doodle like (j’ai pas encore d’idées de nom… mais ça viendra) !
Voici donc un cahier des charges d’un Doodle like.

Feuille de route

  • Version tout en PHP (orienté objet) sans aucun Javascript ou autre. Fonctionnalité : « Trouver une date ».
  • Ajout du Javascript pour la fonctionnalité « Trouver une date » et le reste du site.
  • Ajout de fonctionnalités « Faire un choix », « Sondage », « Qui prend quoi, pour un repas », ou autre, et amélioration des fonctionnalités présentes. En PHP (orienté objet) d’abord puis en améliorant avec le Javascript.

Continuer la lecture

Générer un array de plus de 2 400 000 éléments

Publié dans PHP | Un commentaire

Peut-être avez-vous déjà essayé de créer un array très très grand. Moi oui. Mon problème c’est que les valeurs que contenaient mon array étaient aussi très grande. En fait j’ai essayé de générer un array contenant 2 600 000 éléments allant de 1 à 2 600 000.

Naïvement avec une boucle for

 $a_cle = array();
for($i=1;$i<=2600000;$i++) {
   $a_cle[] = $i;
}

Mais là… erreur : Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 16 bytes) in /var/agence.php on line 52

Un peu plus malin avec range()

$a_cle = range(1, 2600000);

Mais là… erreur : Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 16 bytes) in /var/agence.php on line 52

Futé avec array_flip

En fait, je me suis aperçu que ce dont j’avais besoin c’était des numéros que je pouvais prendre au hasard (mais jamais les mêmes) allant de 1 à 2600000, mais pas forcément d’un array avec les clés allant de 1 à 2600000 et les valeurs allant de 1 à 260000. Donc j’ai créé avec array avec des clés allant de 1 à 2600000 et des valeurs toutes à 1.

$a_cle = array_flip($a_cle);
$cle = array_rand($a_cle);
echo $cle; unset($a_cle[$cle]);

Vous me direz que j’aurai pu modifier le php.ini pour augmenter l’espace mémoire utilisable par PHP, mais :

  • je n’y avais pas accès
  • je ne savais comment faire à l’époque :p

Petit bilan sur les premiers mois de 30 minutes par jour

Publié dans Informations | Laisser un commentaire

Et voilà, j’ai envie de dire que cela fait vraiment 1 mois que j’ai commencé ce blog 30 minutes par jour. Certes en réalité le premier billet est paru en avril 2009, mais le temps que la machine se mette en place…

Le bilan est plutôt positif puisque j’arrive à prendre un rythme assez soutenu (ce billet étant le 36ème) mais peu contraignant pour moi. D’ailleurs, je trouve l’effet « blog » assez sympa puisque, contrairement à mon site perso, je n’ai pas vraiment à me restreindre sur le sujet des articles, ni sur leur exhaustivité. Dès qu’une idée me passe par la tête, je peux commencer à écrire quelque chose, puis je me renseigne sur le Web ou dans des bouquins, et je met à jour mon billet jusqu’à ce que j’arrive à quelque chose de suffisamment correct pour être publié. Mais qu’importe si le billet en question n’est pas complet, si toutes les manipulations ne sont pas expliqués en détails : je pourrai en parler à nouveau dans un autre billet et donner des compléments d’informations (le module « Billet connexe » de Dotclear se chargera de lier mes différents billets), et même éditer un billet si ça me chante. Et c’est d’autant mieux que tout cela pourra me servir de bases pour des tutoriels que je pourrai ensuite créer sur la Bnbox.

Eh tiens, quant aux sujets abordés… Pour l’instant, j’ai surtout parlé de PHP Objet (17 billets en tout) et je pense arriver au bout de mes pérégrinations. J’ai déjà des projets pour les prochains jours, et ça tournera toujours autour du PHP Objet. Mais j’ai aussi pu faire quelques billets sur Apache, ou sur le CMS Dotclear, et j’ai eu l’occasion de parler de quelques projets. Je pense continuer sur la même lancée : des billets fils rouges (en ce moment sur le PHP Objet), et quelques billets divers. (sur mes projets ou mes découvertes du moment) Je pense pouvoir continuer sur ce rythme très facilement durant toute la durée de mon stage. Mais je me demande si j’y arriverai lorsque les cours reprendront. L’avenir nous le dira !

Du BBcode en PHP sans regex

Publié dans PHP | Laisser un commentaire

Alors parait-il que l’on pourrait faire du BBcode en PHP sans utiliser du tout de regex, et ce grâce à une l’extension PECL nommée BBcode et qui ferait partie (en théorie) du module PHP standart depuis PHP 5.2.0. Bon en pratique j’ai PHP 5.2.8 (en local avec Easy PHP, eh oui j’suis sous Windows en ce moment) et je n’ai pas du tout cette extension. Et puis sur le site de téléchargement du package il n’y a que des packages pour Linux (et pour des raisons diverses et variées je n’ai pas accès à Linux pour l’instant. Misère…).
Bref, je suis un peu déçu, j’aurai bien aimé tester. Mais le manuel nous dit tout ce qu’il faut faire : Extension PHP BBcode. Y parait que c’est beaucoup plus rapide que de coder son BBcode avec des regex, et en plus ça à l’air très simple à mettre en place. Bon par contre, je suppose qu’on ne peut pas configurer tout comme on le souhaite, mais passons pour l’instant. En théorie :

  • On créé une structure de BBcode avec bbcode_create() et on peut ensuite ajouter des balises avec bbcode_add_element() si on en a oublié, ou même des smilies avec bbcode_add_smiey().
  • Reste à utiliser bbcode_parse() pour parser une chaine de caractère en transformant par exemple [b]test[/b] par test, et donc pour mettre le mot « test » en gras.
  • Puis bbcode_destroy() pour libérer proprement notre structure de BBcode.

Voilà pour la théorie ! Dès que j’ai réussi à tester la bête, j’essaierai de voir ce que ça peut donner en pratique !

Quelques méthodes et constantes magiques ou prédéfinies

Publié dans PHP objet | Laisser un commentaire

Attributs ou méthodes qui n’existent pas ?

Avant de faire un petit récapitulatif magique ou déjà défini (mouahaha), voyons une petite notion importante du PHP objet : il est possible de modifier et de lire la valeur d’un attribut qui n’existe pas (ah horreur), par contre, on ne peut utiliser une méthode qui n’existe pas (ah bah ça tombe bien alors !). Je m’explique en codant :

class Chat { }
$unChat = new Chat();
$unChat->couleur = 'noir';
$unChat->etat = 'sorti ses griffes';
echo 'Mon chat '.$unChat->couleur.' a '.$unChat->etat.'.';

Eh oui, ce petit exemple affichera bien : « Mon chat noir a sorti ses griffes . ». C’est horrible, n’est-ce-pas ? Heureusement avec __set() et __get(), on va pouvoir empêcher ce types d’actions et en profiter pour vérifier le type des valeurs que l’on assigne à nos attributs.
Par contre :

class Chat { } 
$unChat = new Chat();
$unChat->etreGentils();

Nous renverra une jolie petite erreur ! (heu, oui, je n’aime pas tellement les chats. Enfin, cela dit, je n’ai rien contre eux non plus) Heureusement la méthode magique __call() va nous permettre de rattraper ce petit bémol. Mais tout cela est très bien expliqué sur Apprendre PHP, alors sans plus tarder voilà une liste des méthodes et des constantes magiques, ainsi que des fonctions prédéfinies avec à chaque fois une explique, ou des exemples tiré du manuel PHP, de tutoriels sur le Web ou de mes propres mot.
Continuer la lecture