<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cloud Connected &#187; c</title>
	<atom:link href="http://www.cloudconnected.fr/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cloudconnected.fr</link>
	<description>Thoughts of a french web developer</description>
	<lastBuildDate>Wed, 01 Feb 2012 08:53:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Une version optimisée pour PHP de JSMin</title>
		<link>http://www.cloudconnected.fr/2007/03/28/une-version-optimisee-pour-php-de-jsmin/</link>
		<comments>http://www.cloudconnected.fr/2007/03/28/une-version-optimisee-pour-php-de-jsmin/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 18:23:00 +0000</pubDate>
		<dc:creator>Rémi</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://pre.the-asw.com/?p=76</guid>
		<description><![CDATA[<p>Les Javascripts permettent de faire tout pleins de choses sur un site web, c'est cool. Mais à force d'empiler les librairies, les <em>frameworks</em> 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.</p> <p>Heureusement, plusieurs librairies (plus ou mois efficaces) existent et permettent de compresser les scripts. JSMin est l'une d'entre elle.</p>]]></description>
			<content:encoded><![CDATA[<p>Les Javascripts permettent de faire tout pleins de choses sur un site web, c&#8217;est cool. Mais à force d&#8217;empiler les librairies, les <em>frameworks</em> et autres fonctions, on peut vite se retrouver avec deux kilo-tonnes de script, ce qui n&#8217;est ni très agréable à charger et ni très léger pour la bande passante.</p>
<p>Heureusement, plusieurs librairies (plus ou mois efficaces) existent et permettent de compresser les scripts. JSMin est l&#8217;une d&#8217;entre elle.</p>
<p><span id="more-77"></span></p>
<p>A l&#8217;origine, JSMin est un petit programme écrit en C par <a href="http://www.crockford.com/javascript/jsmin.html" hreflang="en">Douglas Crokford</a>. Il prend un fichier Javascript et supprime tout ce qui n&#8217;est strictement nécessaire, c&#8217;est-à-dire :</p>
<ul>
<li>les commentaires (<code>/* */</code> et <code>//</code>),</li>
<li>les lignes vides et retour à la ligne,</li>
<li>les espaces (sauf dans les chaines de caractères et les expressions régulières).</li>
</ul>
<p>Contrairement à d&#8217;autres <em>packer</em>, JSMin <strong>ne brouille pas le code</strong>, c&#8217;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.</p>
<p>Il existe une <a href="http://gggeek.altervista.org/2006/12/22/shrink-the-size-of-your-javascript-with-js-min-the-php-way/" hreflang="en">version PHP de JSMin</a>, mais, comme son auteur l&#8217;indique, il s&#8217;agit d&#8217;une « conversion simple et brutale du C vers le PHP », entendez par là qu&#8217;elle n&#8217;est pas du tout optimisée et donc super lente. Evidemment, la version C est théoriquement utilisable en PHP via la fonction <code>shell_exec</code>, mais c&#8217;est totalement impensable sur un hébergement mutualisé.</p>
<p>Récemment, j&#8217;ai dû mettre en place un système de compression et de concaténation des javascripts « à la volée » ; c&#8217;est-à-dire que les javascripts sont compressés la première fois qu&#8217;un utilisateur les demande, puis mis en cache (vaguement inspiré <a href="http://www.ejeliot.com/blog/72" hreflang="en">de ce post</a>). Dès qu&#8217;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&#8217;ai pas à me soucier de les compresser avant de les mettre en ligne. C&#8217;est magique.</p>
<p>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&#8217;ai pas pû m&#8217;empêcher de faire un tour dans le code pour l&#8217;optimiser. J&#8217;ai remplacé toutes les boucles de lecture caractère par caractère (typique du C) par des fonctions natives PHP comme <code>strpos</code> et <code>strlen</code>.</p>
<p>J&#8217;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&#8217;il le lise directement), parceque en PHP c&#8217;est <strong>beaucoup</strong> plus rapide de lire d&#8217;abord le fichier (par une fonction comme <code>file_get_contents</code>) et de travailler sur la chaine de caractère représentant le contenu.</p>
<p>Le gain en vitesse dépend fortement de la taille et du contenu du fichier ; dans mon cas c&#8217;est entre 10% et 50% plus rapide.</p>
<h3>Utilisation</h3>
<p>Le constructeur prend 2 paramètres : le code à compresser (<code>string</code>) et, si besoin, un tableau de commentaires à ajouter en début de fichier (<code>array</code> ou rien). Ensuite il suffit d&#8217;appeller la fonction <code>minify()</code>.</p>
<p>Exemple :</p>
<pre>
$code = file_get_contents('foo.js');
 $compressor = new MyJsMin($code, array('Hello', 'World'));
 echo $compressor-&gt;minify();
</pre>
<p>Le fichier <code>foo.js</code> contient :</p>
<pre>
function foo(bar) {
 bar += 1; alert('hello world !');
} </pre>
<p>Le résultat sera :</p>
<pre>
// hello
// world
 function foo(bar) {bar+=1;alert('hello world !');}
</pre>
<h3>Sources</h3>
<ul>
<li>Sources <a href="http://files.the-asw.com/web/myjsmin/MyJsMin.class.phps">de MyJsMin</a>.</li>
<li>Pour JSMin en PHP, voir <a href="http://gggeek.altervista.org/2006/12/22/shrink-the-size-of-your-javascript-with-js-min-the-php-way/">le blog de l&#8217;auteur</a>.</li>
<li>La <a href="http://www.crockford.com/javascript/jsmin.html">page de la version originale</a> de JSMin en C (avec des liens vers d&#8217;autres langages)</li>
</ul>
<h3>Test en ligne</h3>
<p>Vous pouvez tester les performances du script <a href="http://files.the-asw.com/web/myjsmin/">grace à cette page</a> (en anglais, parceque c&#8217;est la classe internationnale).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudconnected.fr/2007/03/28/une-version-optimisee-pour-php-de-jsmin/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Mon premier programme C/PHP</title>
		<link>http://www.cloudconnected.fr/2005/05/02/mon-premier-programme-cphp/</link>
		<comments>http://www.cloudconnected.fr/2005/05/02/mon-premier-programme-cphp/#comments</comments>
		<pubDate>Mon, 02 May 2005 09:16:00 +0000</pubDate>
		<dc:creator>Rémi</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://pre.the-asw.com/?p=6</guid>
		<description><![CDATA[Comment embarquer PHP dans un programme C de la manière la plus basique possible.]]></description>
			<content:encoded><![CDATA[<p>Comment embarquer PHP dans un programme C de la manière la plus basique possible.</p>
<h3>Hello world</h3>
<p>En guise d&#8217;&#8221;Hello World&#8221;, nous allons essayer d&#8217;executer la commande <code>phpinfo()</code>.</p>
<p>Avant tout, il faut initialiser le module php embed. Tout ceci n&#8217;étant absolument pas documenté, je ne saurais dire à quoi correspondent les paramètres.</p>
<pre>
static char *argv[2] = {"monboprog", NULL};
if ( php_embed_init(1, argv PTSRMLS_CC) == FAILURE ) {
	puts ("Impossible d'initialiser PHP");
	return -1;
}
</pre>
<p>Maintenant on peut executer une commande. On utilise <code>zend_eval_string</code> qui prend comme premier paramètre la commande à executer. Je ne sais pas à quoi correspond le deuxième (je laisse <code>NULL</code>). Quant au dernier, apparement on peut mettre n&#8217;importe quoi&#8230; Allez comprendre !</p>
<p>Zend (le parseur php) fournis des macros imitant le try-catch du C++, permettant de recuperer les erreurs de php. Il n&#8217;y a donc qu&#8217;à les utiliser. Et voila ce que ça donne :</p>
<pre>
zend_first_try {
	if ( zend_eval_string("phpinfo();", NULL, "php embed roulez") == SUCCESS )
		puts("Commande executée avec succès");
	else
		puts("Impossible d'executer la commande");
} zend_catch {
	printf ("Exception %d", EG(exit_status));
}
zend_end_try();
</pre>
<p>Enfin, on arrette php avec la commande suivante :</p>
<pre>php_embed_shutdown(TSRMLS_C);</pre>
<p>Il ne manque plus qu&#8217;à inclure <code>php_embed.h</code>, et on peut essayer de le compiler. Le programme complet d&#8217;exemple est disponible <a href="articles/prog/phpembed1/main.c">par ici</a></p>
<h3>Compilation</h3>
<p>Ca c&#8217;est la partie la plus galère, surtout quand rien n&#8217;est documenté. Je tiens d&#8217;ailleurs à remercier kermit, une star du Makefile, sans qui je ne serais sans doute jamais arrivé à compiler cette saloperie de programme.</p>
<p>En fait, <code>php_embed.h</code> demande pleins d&#8217;autres fichiers d&#8217;entetes, situés un peu partout dans les sources de PHP. Il faut donc rajouter un paquet de paramètres d&#8217;inclusion à <code>gcc</code>. Dans un makefile, ça donne :</p>
<pre>
# 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
</pre>
<p>Pour le linkage, il faut utiliser la lib que l&#8217;on a compilé :</p>
<pre>
LDFLAGS=-L$(PHPPATH)/libs LIBS=-lphp5
</pre>
<p>Le <a href="articles/prog/phpembed1/Makefile">makefile</a> pour ce programme d&#8217;exemple n&#8217;est pas encore parfait, puisque trop de paramètres sont hardcodés, mais bon&#8230;</p>
<h3>Exécution</h3>
<p>Premier test :</p>
<pre> $ ./monboprog ./monboprog: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or directory </pre>
<p>Pas grave, il suffit d&#8217;ajouter le chemin de la libs dans la variable d&#8217;environnement qui va bien :</p>
<pre> $ export LD_LIBRARY_PATH=~/documents/prog/php/php-5.0.2/libs/ </pre>
<p>Et voila :)</p>
<h3>Conclusion</h3>
<p>Il reste encore beaucoup à faire pour pouvoir embarquer facilement php : faciliter la compilation et le linkage (tout le monde n&#8217;a pas les sources de php sous la main), et également l&#8217;execution. Quant au code, dans un premier temps un découpage en fonctions permettant d&#8217;eviter de manipuler Zend directement s&#8217;impose. Il faut ensuite voir comment inclure des fichiers php, exporter des fonctions C pour les utiliser dans les scripts, etc&#8230; Mais au moins avec cet exemple vous pourrez dire : &#8220;moi aussi j&#8217;ai réussi à embarquer php&#8221; !</p>
<h3>Quelques liens</h3>
<ul>
<li>LE programme sans lequel on aurait rien reussi : le module php-irssi qui permet de script irssi avec php. Malheureusement il n&#8217;y a aucun site officiel, et le projet semble mort. On peut encore recuprer les sources sur le <a href="http://cvs.php.net/embed/">CVS de php</a></li>
<li>Un <a href="http://www.phpconference.de/2003/slides/internals_track/wez_embedding-php.pdf">PDF interressant</a> par l&#8217;auteur de php-irssi</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudconnected.fr/2005/05/02/mon-premier-programme-cphp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

