PHP : file() ou requête MySQL ?

p4bl0

Membre expert
Club iGen
12 Juillet 2004
4 772
423
35
$PWD
p4bl0.net
Bonjour !

Je me pose une question.
On va prendre un exemple simple :
Admettons qu'on a un fichier "quotes.txt" qui contient un certains nombre que citations, une par ligne.
Une ligne est de la forme "Auteur --!-- Citation..." (--!-- je l'ai pris au hasard, c'est un séparateur qu'on est sûr d'avoir qu'une fois par ligne vu qu'il ne sera dans aucune citation).
Et on a une table dans une base de donnée avec deux champs : author et quote. Cette table contient exactement les même citation que le fichier.

Quel sera le code le plus rapide est le moins gourmand en resources (les codes sont simplifié, pas de gestion des erreurs etc...)

Code 1 : lecture des quotes dans la table.
Bloc de code:
$sql_con = mysql_connect(HOST, USER, PASS);
mysql_select_db(DB);
$quotes = mysql_query("SELECT COUNT(*) AS `nbr` FROM `quotes`);
$quote = mysql_fetch_rows(mysql_qery("SELECT * FROM `quotes` LIMIT ".rand(0, $quotes['nbr']-1).",1;"));
mysql_close($sql_con);
echo '<strong>',$quote[0],' :</strong> <q title="',$quote[0],'">',$quote[1],'</q>';

Code 2 : lecture des quotes dans le fichier.
Bloc de code:
$quotes = file('quotes.txt');
list($author, $quote) = explode(' --!-- ', $quotes[rand(0, count($quotes)-1)]);
echo '<strong>',$author,' :</strong> <q title="',$author,'">',$quote,'</q>';

Comme &#231;a j'aurais tendance &#224; dire que le second code est plus rapide (moins d'instructions), mais quand je vois qu'enregistrer presque 500ko de texte dans une base de donn&#233;es MySQL avec PHP ne prend m&#234;me pas une demi seconde (quand j'ai transf&#233;r&#233; tout mon blog d'un coup chez OVH).


Donc voil&#224;, c'est quoi le plus rapide et le moins gourmand ?


P.S.: j'ai &#233;crit ce code directement sur MacG et je ne l'ai aps test&#233;, donc il y a peut-&#234;tre quelques erreurs (oublie d'un ;... ce genre de truc) mais vous comprenez l'id&#233;e quoi :)
 
à mon avis, la seconde solution est plus rapide, mais pour ça c'est negligeable


la meilleure façon de tester, c'est de le faire quelques milliers de fois (ou dizaines de milliers) avec chaque solution et de comparer

je te file un vieux script de benchmark que j'avais fait...




Bloc de code:
<?php

/**
* @copyright Oligraphes 2004
**/


/**
*
* easy bench
* permet d'installer simplement un systeme de benchmark
* tres simple sur ses pages php.
*
* pour l'utiliser, la syntaxe est la suivante :
*
* include_once 'include/EasyBench.php';
* $bench = new EasyBench();
* // script votre script php.
* echo $bench->fin();
*
* @author ParkSTo <[email protected]>
* @since 2004-03-13
*
**/
class EasyBench{


    /**
     * le microtype du debut de bench
     *
     * @var int
     */
    var $debut;

    /**
    * Constructor
    * @access protected
    */
    function EasyBench(){
        $this->debut = microtime();
    }

    /**
    *
    * @access public
    * @return double le temps d'execution
    **/
    function fin(){
        $a = explode( ' ', $this->debut );
        $b = explode( ' ', microtime() );
        return $b[1] - $a[1] + $b[0] - $a[0];
    }


    /**
    *
    * @access public
    * @return vod affiche le temps d'execution dans un commentaire
    **/
    function affiche(){
        echo '<!-- '. $this->fin() .' -->';
    }

}
?>
[\CODE]
 
Ben en moyenne c'est plus rapide avec le fichier, j'ai fait 5 essais dans chaque cas :

Un essai consistait &#224; r&#233;p&#233;ter 1000 fois l'op&#233;ration "s&#233;lectionner une citation au hasard et l'afficher".
(les temps sont en secondes)

File :
&#8226; 3.33255386353
&#8226; 5.5994451046
&#8226; 3.46603608131
&#8226; 3.61492109299
&#8226; 3.47854185104

MySQL :
&#8226; 4.72280502319
&#8226; 5.20016503334
&#8226; 5.14404296875
&#8226; 4.49166202545
&#8226; 4.83679199219
 
ce n'est pas &#233;tonnant sur un fichier de petite taille

maintenant fait un fichier avec 50 000 entr&#233;es et une table &#224; 50 000 entr&#233;es
:zen: