<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.the-asw.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>The ASW - c</title>
  <link>http://www.the-asw.com/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 14 Nov 2008 16:51:08 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Une version optimisée pour PHP de JSMin</title>
    <link>http://www.the-asw.com/post/2007/03/28/Une-version-optimisee-pour-PHP-de-JSMin</link>
    <guid isPermaLink="false">urn:md5:dcbeaf0f55f519173e6a2884ae3cb8c7</guid>
    <pubDate>Wed, 28 Mar 2007 18:23:00 +0200</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Développement web</category>
        <category>c</category><category>javascript</category><category>php</category>    
    <description>&lt;p&gt;Les Javascripts permettent de faire tout pleins de choses sur un site web, c'est cool.
Mais à force d'empiler les librairies, les &lt;em&gt;frameworks&lt;/em&gt; et autres fonctions, 
on peut vite se retrouver avec deux kilo-tonnes de script, ce qui n'est ni très
agréable à charger et ni très léger pour la bande passante.&lt;/p&gt;

&lt;p&gt;Heureusement, plusieurs librairies (plus ou mois efficaces) existent et permettent
de compresser les scripts. JSMin est l'une d'entre elle.&lt;/p&gt;    &lt;p&gt;A l'origine, JSMin est un petit
programme écrit en C par &lt;a href=&quot;http://www.crockford.com/javascript/jsmin.html&quot; hreflang=&quot;en&quot;&gt;Douglas Crokford&lt;/a&gt;.
Il prend un fichier Javascript et supprime tout
ce qui n'est strictement nécessaire, c'est-à-dire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les commentaires (&lt;code&gt;/* */&lt;/code&gt; et &lt;code&gt;//&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;les lignes vides et retour à la ligne,&lt;/li&gt;
&lt;li&gt;les espaces (sauf dans les chaines de caractères et les expressions régulières).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contrairement à d'autres &lt;em&gt;packer&lt;/em&gt;, JSMin &lt;strong&gt;ne brouille pas le code&lt;/strong&gt;,
c'est-à-dire que le fichier compressé reste lisible, débuggable et modifiable (même si une petite
ré-indentation est nécessaire), ce qui est quand même un avantage très appréciable.&lt;/p&gt;

&lt;p&gt;Il existe une &lt;a href=&quot;http://gggeek.altervista.org/2006/12/22/shrink-the-size-of-your-javascript-with-js-min-the-php-way/&quot; hreflang=&quot;en&quot;&gt;version PHP de JSMin&lt;/a&gt;,
mais, comme son auteur l'indique, il s'agit d'une « conversion simple et brutale
du C vers le PHP », entendez par là qu'elle n'est pas du tout optimisée et donc
super lente. Evidemment, la version C est théoriquement utilisable en PHP via la fonction
&lt;code&gt;shell_exec&lt;/code&gt;, mais c'est totalement impensable sur un hébergement mutualisé.&lt;/p&gt;

&lt;p&gt;Récemment, j'ai dû mettre en place un système de compression et de concaténation
des javascripts « à la volée » ; c'est-à-dire que les javascripts sont compressés
la première fois qu'un utilisateur les demande, puis mis en cache (vaguement
inspiré &lt;a href=&quot;http://www.ejeliot.com/blog/72&quot; hreflang=&quot;en&quot;&gt;de ce post&lt;/a&gt;).
Dès qu'un fichier est mis à jour, le cache est regénéré. Ainsi, je conserve les versions
commentées et indentées pour développer, et je n'ai pas à me soucier de les
compresser avant de les mettre en ligne. C'est magique.&lt;/p&gt;

&lt;p&gt;Mais, la version originale de JSMin en PHP met parfois plus de 3 secondes à compresser
certains fichiers, ce qui est bien trop long. Donc je n'ai pas pû m'empêcher
de faire un tour dans le code pour l'optimiser. J'ai remplacé toutes les boucles
de lecture caractère par caractère (typique du C) par des fonctions natives PHP 
comme &lt;code&gt;strpos&lt;/code&gt; et &lt;code&gt;strlen&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;J'ai également viré toute
la partie qui concernait les fichiers (dans la version originale, il est possible
de passer un nom de fichier à JSMin pour qu'il le lise directement), parceque
en PHP c'est &lt;strong&gt;beaucoup&lt;/strong&gt; plus rapide de lire d'abord le fichier (par
une fonction comme &lt;code&gt;file_get_contents&lt;/code&gt;) et de travailler sur la chaine
de caractère représentant le contenu.&lt;/p&gt;

&lt;p&gt;Le gain en vitesse dépend fortement de la taille et du contenu du fichier ; dans
mon cas c'est entre 10% et 50% plus rapide.&lt;/p&gt;

&lt;h3&gt;Utilisation&lt;/h3&gt;

&lt;p&gt;Le constructeur prend 2 paramètres : le code à compresser (&lt;code&gt;string&lt;/code&gt;)
et, si besoin, un tableau de commentaires à ajouter en début de fichier (&lt;code&gt;array&lt;/code&gt; ou rien).
Ensuite il suffit d'appeller la fonction &lt;code&gt;minify()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemple :&lt;/p&gt;
&lt;pre&gt;$code = file_get_contents('foo.js');
$compressor = new MyJsMin($code, array('Hello', 'World'));
echo $compressor-&amp;gt;minify();&lt;/pre&gt;

&lt;p&gt;Le fichier &lt;code&gt;foo.js&lt;/code&gt; contient :&lt;/p&gt;
&lt;pre&gt;function foo(bar)
{
bar += 1;
alert('hello world !');
}
&lt;/pre&gt;
&lt;p&gt;Le résultat sera :&lt;/p&gt;

&lt;pre&gt;// hello
// world

function foo(bar)
{bar+=1;alert('hello world !');}
&lt;/pre&gt;

&lt;h3&gt;Sources&lt;/h3&gt;

&lt;ul&gt;
	&lt;li&gt;Sources &lt;a href=&quot;http://www.the-asw.com/public/web/myjsmin/MyJsMin.class.phps&quot;&gt;de MyJsMin&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;Pour JSMin en PHP, voir &lt;a href=&quot;http://gggeek.altervista.org/2006/12/22/shrink-the-size-of-your-javascript-with-js-min-the-php-way/&quot;&gt;le blog de l'auteur&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;La &lt;a href=&quot;http://www.crockford.com/javascript/jsmin.html&quot;&gt;page de la version originale&lt;/a&gt; de JSMin en C (avec des liens vers d'autres langages)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Test en ligne&lt;/h3&gt;

&lt;p&gt;Vous pouvez tester les performances du script &lt;a href=&quot;http://www.the-asw.com/public/web/myjsmin/&quot;&gt;grace à cette page&lt;/a&gt; (en anglais, parceque c'est la classe internationnale).&lt;/p&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2007/03/28/Une-version-optimisee-pour-PHP-de-JSMin#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2007/03/28/Une-version-optimisee-pour-PHP-de-JSMin#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/74</wfw:commentRss>
      </item>
    
  <item>
    <title>Mon premier programme C/PHP</title>
    <link>http://www.the-asw.com/post/2005/05/02/7-mon-premier-programme-c-php</link>
    <guid isPermaLink="false">urn:md5:0dbfb0fefe8e05542a5efebbd97b18ff</guid>
    <pubDate>Mon, 02 May 2005 11:16:00 +0000</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Programmation</category>
        <category>c</category><category>php</category>    
    <description>Comment embarquer PHP dans un programme C de la manière la plus basique possible.    &lt;h3&gt;Hello world&lt;/h3&gt;

	
	&lt;p&gt;En guise d'&quot;Hello World&quot;, nous allons essayer d'executer la commande &lt;code&gt;phpinfo()&lt;/code&gt;.&lt;/p&gt;
	
	&lt;p&gt;Avant tout, il faut initialiser le module php embed. Tout ceci n'étant absolument pas documenté, je ne saurais dire à quoi correspondent les paramètres.&lt;/p&gt;
&lt;pre&gt;
static char *argv[2] = {&quot;monboprog&quot;, NULL};

if ( php_embed_init(1, argv PTSRMLS_CC) == FAILURE ) {
	puts (&quot;Impossible d'initialiser PHP&quot;);
	return -1;
}
&lt;/pre&gt;

	&lt;p&gt;Maintenant on peut executer une commande. On utilise &lt;code&gt;zend_eval_string&lt;/code&gt; qui prend comme premier paramètre la commande à executer. Je ne sais pas à quoi correspond le deuxième (je laisse &lt;code&gt;NULL&lt;/code&gt;). Quant au dernier, apparement on peut mettre n'importe quoi... Allez comprendre !&lt;/p&gt;

	&lt;p&gt;Zend (le parseur php) fournis des macros imitant le try-catch du C++, permettant de recuperer les erreurs de php. Il n'y a donc qu'à les utiliser. Et voila ce que ça donne :&lt;/p&gt;
&lt;pre&gt;
zend_first_try {                                                                                                                   
	if ( zend_eval_string(&quot;phpinfo();&quot;, NULL, &quot;php embed roulez&quot;) == SUCCESS )
		puts(&quot;Commande executée avec succès&quot;);
	else    
		puts(&quot;Impossible d'executer la commande&quot;);
} zend_catch {
	printf (&quot;Exception %d&quot;, EG(exit_status));
} zend_end_try();
&lt;/pre&gt;

	&lt;p&gt;Enfin, on arrette php avec la commande suivante :&lt;/p&gt;
&lt;pre&gt;php_embed_shutdown(TSRMLS_C);&lt;/pre&gt;

	&lt;p&gt;Il ne manque plus qu'à inclure &lt;code&gt;php_embed.h&lt;/code&gt;, et on peut essayer de le compiler. Le programme complet d'exemple est disponible &lt;a href=&quot;http://www.the-asw.com/post/2005/05/02/articles/prog/phpembed1/main.c&quot;&gt;par ici&lt;/a&gt;&lt;/p&gt;

	
	&lt;h3&gt;Compilation&lt;/h3&gt;
	&lt;p&gt;Ca c'est la partie la plus galère, surtout quand rien n'est documenté. Je tiens d'ailleurs à remercier kermit, une star du Makefile, sans qui je ne serais sans doute jamais arrivé à compiler cette saloperie de programme.&lt;/p&gt;
	&lt;p&gt;En fait, &lt;code&gt;php_embed.h&lt;/code&gt; demande pleins d'autres fichiers d'entetes, situés un peu partout dans les sources de PHP. Il faut donc rajouter un paquet de paramètres d'inclusion à &lt;code&gt;gcc&lt;/code&gt;. Dans un makefile, ça donne :&lt;/p&gt;
&lt;pre&gt;
# chemin des sources de php
PHPPATH=/home/cgo2/documents/prog/php/php-5.0.2
PHPFLAGS=-I$(PHPPATH) -I$(PHPPATH)/Zend -I$(PHPPATH)/TSRM -I$(PHPPATH)/sapi/embed
&lt;/pre&gt;

	&lt;p&gt;Pour le linkage, il faut utiliser la lib que l'on a compilé :&lt;/p&gt;
&lt;pre&gt;
LDFLAGS=-L$(PHPPATH)/libs
LIBS=-lphp5
&lt;/pre&gt;

	&lt;p&gt;Le &lt;a href=&quot;http://www.the-asw.com/post/2005/05/02/articles/prog/phpembed1/Makefile&quot;&gt;makefile&lt;/a&gt; pour ce programme d'exemple n'est pas encore parfait, puisque trop de paramètres sont hardcodés, mais bon...&lt;/p&gt;
	
	&lt;h3&gt;Execution&lt;/h3&gt;
	&lt;p&gt;Premier test :&lt;/p&gt;

&lt;pre&gt;
$ ./monboprog
./monboprog: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or directory
&lt;/pre&gt;
	&lt;p&gt;Pas grave, il suffit d'ajouter le chemin de la libs dans la variable d'environnement qui va bien :&lt;/p&gt;
&lt;pre&gt;
$ export LD_LIBRARY_PATH=~/documents/prog/php/php-5.0.2/libs/
&lt;/pre&gt;
	&lt;p&gt;Et voila :)&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Il reste encore beaucoup à faire pour pouvoir embarquer facilement php : faciliter la compilation et le linkage (tout le monde n'a pas les sources de php sous la main), et également l'execution. Quant au code, dans un premier temps un découpage en fonctions permettant d'eviter de manipuler Zend directement s'impose. Il faut ensuite voir comment inclure des fichiers php, exporter des fonctions C pour les utiliser dans les scripts, etc... Mais au moins avec cet exemple vous pourrez dire : &quot;moi aussi j'ai réussi à embarquer php&quot; !&lt;/p&gt;

&lt;h3&gt;Quelques liens&lt;/h3&gt;
&lt;ul&gt;
			&lt;li&gt;LE programme sans lequel on aurait rien reussi : le
module php-irssi qui permet de script irssi avec php. Malheureusement
il n'y a aucun site officiel, et le projet semble mort. On peut encore
recuprer les sources sur le &lt;a href=&quot;http://cvs.php.net/embed/&quot;&gt;CVS de php&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;Un &lt;a href=&quot;http://www.phpconference.de/2003/slides/internals_track/wez_embedding-php.pdf&quot;&gt;PDF interressant&lt;/a&gt; par l'auteur de php-irssi
		&lt;/li&gt;&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2005/05/02/7-mon-premier-programme-c-php#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2005/05/02/7-mon-premier-programme-c-php#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/4</wfw:commentRss>
      </item>
    
</channel>
</rss>