<?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>Cakecoding</title>
	<atom:link href="http://www.cakecoding.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cakecoding.com</link>
	<description>Les bonnes recettes du web !</description>
	<lastBuildDate>Wed, 18 Jan 2012 09:03:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Demander la confirmation d&#8217;un script PHP avant son exécution</title>
		<link>http://www.cakecoding.com/developpement/demander-la-confirmation-dun-script-php-avant-son-execution-55</link>
		<comments>http://www.cakecoding.com/developpement/demander-la-confirmation-dun-script-php-avant-son-execution-55#comments</comments>
		<pubDate>Fri, 13 May 2011 11:00:09 +0000</pubDate>
		<dc:creator>Clément</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.cakecoding.com/?p=55</guid>
		<description><![CDATA[<p><p>Il m&#8217;arrive de développer des scripts PHP que l&#8217;on devra exécuter en CLI directement sur le serveur (généralement via un crontab). Comme il n&#8217;est pas très agréable de débugger dans une console, j&#8217;ai pris l’habitude de passer par mon navigateur pendant la phase de développement.</p> <p>A la fin de la journée, comme la plupart d&#8217;entre [...]</p><p><em>Originally posted at <a href="http://www.cakecoding.com/developpement/demander-la-confirmation-dun-script-php-avant-son-execution-55">Demander la confirmation d&#8217;un script PHP avant son exécution</a></em></p>]]></description>
			<content:encoded><![CDATA[<p>Il m&#8217;arrive de développer des scripts PHP que l&#8217;on devra exécuter en CLI directement sur le serveur (généralement via un crontab). Comme il n&#8217;est pas très agréable de débugger dans une console, j&#8217;ai pris l’habitude de passer par mon navigateur pendant la phase de développement.</p>
<p>A la fin de la journée, comme la plupart d&#8217;entre vous j&#8217;éteins mon portable pour <del>aller sur mon fixe !</del> vaquer à mes occupations et très souvent le matin quand je le rallume mon navigateur charge les mêmes onglets que la veille. C&#8217;est pratique, mais si j&#8217;étais en train de développer un script sensé se lancer la nuit et qui s&#8217;occupe par exemple de la réparation d&#8217;une grosse base de données ou d&#8217;un autre processus plutôt gourmand  et bien il va probablement ralentir mon système à une heure où tous mes clients se connectent !</p>
<p>Pour ce genre de script j&#8217;ai prévu un écran de confirmation qui tient en trois ligne et qui permet lorsque le script n&#8217;est pas appelé en CLI de demander une confirmation avant son exécution.</p>
<pre name="code" class="php">if(php_sapi_name() != 'cli' and !isset($_POST['i-am-sure'])) {
    die('&lt;form action="'.$_SERVER['REQUEST_URI'].'" method="post"&gt;
&lt;input name="i-am-sure" type="submit" value="Etes-vous sur de vouloir lancer ce script ?" /&gt;
&lt;/form&gt;');
}</pre>
<p>Maintenant lorsque mon navigateur va ouvrir mes onglets de la veille, je devrais d&#8217;abord devoir confirmer que je suis sûr de vouloir le lancer.</p>

			<!--Facebook Like and Send button by darkomitrovic.com-->
			<div id="fb-root"></div>
			<script>
			<!--
			  window.fbAsyncInit = function() {
				FB.init({appId: "224955984185367", status: true, cookie: true, xfbml: true});
			  };
			  (function() {
				var e = document.createElement("script"); e.async = true;
				e.src = document.location.protocol +
				  "//connect.facebook.net/en_US/all.js";
				document.getElementById("fb-root").appendChild(e);
			  }());
			-->
			</script>
			<fb:like href="http://www.cakecoding.com/developpement/demander-la-confirmation-dun-script-php-avant-son-execution-55" send="true" layout="standard" width="450" show_faces="true" colorscheme="light" action="like" font=""></fb:like>
			<!--Facebook Like and Send button by darkomitrovic.com-->
			<p><em>Originally posted at <a href="http://www.cakecoding.com/developpement/demander-la-confirmation-dun-script-php-avant-son-execution-55">Demander la confirmation d&#8217;un script PHP avant son exécution</a></em></p>]]></content:encoded>
			<wfw:commentRss>http://www.cakecoding.com/developpement/demander-la-confirmation-dun-script-php-avant-son-execution-55/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Système de lock d&#8217;éxécution de script PHP</title>
		<link>http://www.cakecoding.com/developpement/systeme-de-lock-d-execution-de-script-php-27</link>
		<comments>http://www.cakecoding.com/developpement/systeme-de-lock-d-execution-de-script-php-27#comments</comments>
		<pubDate>Thu, 12 May 2011 11:00:26 +0000</pubDate>
		<dc:creator>Clément</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[batch]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.cakecoding.com/?p=27</guid>
		<description><![CDATA[<p><p>Parfois, il est nécessaire de s&#8217;assurer que plusieurs instances d&#8217;un même script CLI ne puisse pas être lancées à la fois. Prenons par exemple, un script chargé de vider une pile d&#8217;emails stockés dans une base de données à intervalle régulier (une minute) via un crontab.</p> <p>Sans ce système de lock, il serait possible, pour [...]</p><p><em>Originally posted at <a href="http://www.cakecoding.com/developpement/systeme-de-lock-d-execution-de-script-php-27">Système de lock d&#8217;éxécution de script PHP</a></em></p>]]></description>
			<content:encoded><![CDATA[<p>Parfois, il est nécessaire de s&#8217;assurer que plusieurs instances d&#8217;un même script CLI ne puisse pas être lancées à la fois. Prenons par exemple, un script chargé de vider une pile d&#8217;emails stockés dans une base de données à intervalle régulier (une minute) via un crontab.</p>
<p>Sans ce système de lock, il serait possible, pour une obscure raison, qu&#8217;il soit lancé par le crontab plusieurs fois : on aurait alors un petit script de spam qui enverrait en double ou pire les mêmes emails aux mêmes personnes (si ce sont des clients c&#8217;est embêtant !)</p>
<p>Pour éviter ce genre de cas de figure plusieurs solutions sont disponibles :</p>
<ul>
<li> on tue les processus déjà lancés avant d&#8217;en relancer un autre (en prenant le risque de ne pas laisser terminer la premier instance)</li>
<li> on empêche les nouvelles instances de se lancer si une d&#8217;elle est déjà en cours (c&#8217;est cette solution que j&#8217;ai retenue)</li>
</ul>
<p>L&#8217;idée étant de faire un script générique que l&#8217;on puisse utiliser sur n&#8217;importe qu&#8217;elle plateforme PHP5 c&#8217;est pourquoi pour que la première instance puisse déclarer qu&#8217;elle est en fonctionnement j&#8217;ai choisi de stocker son PID dans un fichier mais on aurait aussi pu utiliser memcache à la place.</p>
<p>Fini la présentation, voici maintenant un morceau de script générique que l&#8217;on peut coller en haut de chaque script CLI pour mettre en place le système de lock.</p>
<pre name="code" class="php">if(php_sapi_name() == 'cli') {
	$lockname = '/tmp/'.basename($argv[0], '.php').'.lock';
	$pid = is_file($lockname) ? trim(file_get_contents($lockname)) : false;
	if (($pid !== false) &amp;&amp; posix_kill($pid, 0)) {
		die('Error: Batch is already running with PID: '.$pid."\n");
	}
	else {
		register_shutdown_function('unlink', $lockname);
		$fp = fopen($lockname, 'w');
		fwrite($fp, posix_getpid());
		fclose($fp);
	}
}</pre>
<p>Les fonctions remarquables sont les posix_xxx accessibles uniquement en mode CLI (d&#8217;où la vérification du mode d&#8217;appel tout en haut avec php_sapi_name) et register_shutdown_function qui permet d&#8217;éxécuter une fonction à la fin du script (peu importe la façon dont sa fin est arrivée !)</p>
<p>Je ne trouve pas tellement de défauts à cette méthode alors si vous vous en voyez n&#8217;hésitez pas à les partager via les commentaires.</p>

			<!--Facebook Like and Send button by darkomitrovic.com-->
			<div id="fb-root"></div>
			<script>
			<!--
			  window.fbAsyncInit = function() {
				FB.init({appId: "224955984185367", status: true, cookie: true, xfbml: true});
			  };
			  (function() {
				var e = document.createElement("script"); e.async = true;
				e.src = document.location.protocol +
				  "//connect.facebook.net/en_US/all.js";
				document.getElementById("fb-root").appendChild(e);
			  }());
			-->
			</script>
			<fb:like href="http://www.cakecoding.com/developpement/systeme-de-lock-d-execution-de-script-php-27" send="true" layout="standard" width="450" show_faces="true" colorscheme="light" action="like" font=""></fb:like>
			<!--Facebook Like and Send button by darkomitrovic.com-->
			<p><em>Originally posted at <a href="http://www.cakecoding.com/developpement/systeme-de-lock-d-execution-de-script-php-27">Système de lock d&#8217;éxécution de script PHP</a></em></p>]]></content:encoded>
			<wfw:commentRss>http://www.cakecoding.com/developpement/systeme-de-lock-d-execution-de-script-php-27/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Redirection automatique www avec .htaccess</title>
		<link>http://www.cakecoding.com/serveur/redirection-automatique-www-avec-htaccess-5</link>
		<comments>http://www.cakecoding.com/serveur/redirection-automatique-www-avec-htaccess-5#comments</comments>
		<pubDate>Thu, 05 May 2011 18:40:39 +0000</pubDate>
		<dc:creator>Clément</dc:creator>
				<category><![CDATA[Serveur]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[redirection]]></category>

		<guid isPermaLink="false">http://www.cakecoding.com/?p=5</guid>
		<description><![CDATA[<p><p>Bien souvent lorsque nous mettons en place un nouveau site internet, il est disponible à au moins deux adresses différentes.</p> <p>Prenons un exemple : cakecoding.com acheté et hébergé chez OVH, il configuré nativement pour répondre à l&#8217;adresse cakecoding.com ou <a title="cakecoding" href="http://www.cakecoding.com">www.cakecoding.com</a>.</p> <p>Plutot que de laisser choisir les moteurs de recherche (= Google) au hasard [...]</p><p><em>Originally posted at <a href="http://www.cakecoding.com/serveur/redirection-automatique-www-avec-htaccess-5">Redirection automatique www avec .htaccess</a></em></p>]]></description>
			<content:encoded><![CDATA[<p>Bien souvent lorsque nous mettons en place un nouveau site internet, il est disponible à au moins deux adresses différentes.</p>
<p>Prenons un exemple : cakecoding.com acheté et hébergé chez OVH, il configuré nativement pour répondre à l&#8217;adresse cakecoding.com ou <a title="cakecoding" href="http://www.cakecoding.com">www.cakecoding.com</a>.</p>
<p>Plutot que de laisser choisir les moteurs de recherche (= Google) au hasard nous allons les rediriger (les robots et nos visiteurs humains) vers le format de domaine que nous aurons choisis !</p>
<p>Pour ne pas perdre le positionnement éventuel des pages du domaine que nous n&#8217;avons pas retenu, toutes les &#8220;mauvaises&#8221; urls seront redirigées vers les &#8220;correctes&#8221; avec une redirection 301 dite permanente.</p>
<p>Il y a plusieurs façon de procéder :</p>
<ul>
<li>avec PHP via la fonction header</li>
<li>avec Apache, mod_rewrite et un fichier .htaccess</li>
<li>certainement bien d&#8217;autres&#8230;</li>
</ul>
<p>Comme la méthode PHP ne permet de couvrir que les pages générées dynamiquement en PHP justement (Adieu images référencées ou autre contenu statique !), nous allons traiter la seconde méthode qui est, à mon sens la plus élégante.</p>
<p>En reprenant notre exemple, ce code permet de privilégier www.cakecoding.com :</p>
<pre name="code" class="py">
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.cakecoding\.com$
RewriteRule ^(.*) http://www.cakecoding.com/$1 [QSA,L,R=301]
</pre>
<p>Celui là permet de faire l&#8217;inverse et privilégier le nom de domaine cakecoding.com :</p>
<pre name="code" class="py">
RewriteEngine On
RewriteCond %{HTTP_HOST} !^cakecoding\.com$
RewriteRule ^(.*) http://cakecoding.com/$1 [QSA,L,R=301]
</pre>
<p>Je ne vais pas traiter en détails les commandes utilisées car la documentation disponible en ligne est vraiment bien faite. (<a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html">Apache 1.3 mod_rewrite</a>, <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">Apache 2 mod_rewrite</a>).</p>
<p>Maintenant, comme nous sommes tous de <strong>gros paresseux</strong>, nous voulons un code réutilisable !</p>
<p>Voici la version &#8220;<em>domain-free</em>&#8221; qui fonctionnera sur n&#8217;importe lequel de vos sites sans modifications aucunes.</p>
<p>Ici on privilégie le www.domain.tld :</p>
<pre name="code" class="py">
RewriteEngine On
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)$
RewriteRule ^(.*) http://www.%1.%2/$1 [QSA,L,R=301]
</pre>
<p>Et ici on privilégie le domain.tld :</p>
<pre name="code" class="py">
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.([^\.]+)\.([^\.]+)$
RewriteRule ^(.*) http://%1.%2/$1 [QSA,L,R=301]
</pre>
<p>Si vous avez des remarques ou des questions, je serais vraiment très heureux de les lire dans les commentaires.</p>
<p>[Edit] Comme le souligne Arnaud, si on veut un code portable, il est bon de tester la présence du module modrewrite sur le serveur en entourant les instructions si dessus de</p>
<pre name="code" class="py">
&lt;IfModule mod_rewrite.c&gt;
(...)
&lt;/IfModule&gt;
</pre>

			<!--Facebook Like and Send button by darkomitrovic.com-->
			<div id="fb-root"></div>
			<script>
			<!--
			  window.fbAsyncInit = function() {
				FB.init({appId: "224955984185367", status: true, cookie: true, xfbml: true});
			  };
			  (function() {
				var e = document.createElement("script"); e.async = true;
				e.src = document.location.protocol +
				  "//connect.facebook.net/en_US/all.js";
				document.getElementById("fb-root").appendChild(e);
			  }());
			-->
			</script>
			<fb:like href="http://www.cakecoding.com/serveur/redirection-automatique-www-avec-htaccess-5" send="true" layout="standard" width="450" show_faces="true" colorscheme="light" action="like" font=""></fb:like>
			<!--Facebook Like and Send button by darkomitrovic.com-->
			<p><em>Originally posted at <a href="http://www.cakecoding.com/serveur/redirection-automatique-www-avec-htaccess-5">Redirection automatique www avec .htaccess</a></em></p>]]></content:encoded>
			<wfw:commentRss>http://www.cakecoding.com/serveur/redirection-automatique-www-avec-htaccess-5/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://www.cakecoding.com/humeurs/hello-world-1</link>
		<comments>http://www.cakecoding.com/humeurs/hello-world-1#comments</comments>
		<pubDate>Wed, 04 May 2011 16:02:24 +0000</pubDate>
		<dc:creator>Clément</dc:creator>
				<category><![CDATA[Humeurs]]></category>

		<guid isPermaLink="false">http://www.cakecoding.com/?p=1</guid>
		<description><![CDATA[<p><p>It works !</p></p><p><em>Originally posted at <a href="http://www.cakecoding.com/humeurs/hello-world-1">Hello world!</a></em></p>]]></description>
			<content:encoded><![CDATA[<p>It works !</p>

			<!--Facebook Like and Send button by darkomitrovic.com-->
			<div id="fb-root"></div>
			<script>
			<!--
			  window.fbAsyncInit = function() {
				FB.init({appId: "224955984185367", status: true, cookie: true, xfbml: true});
			  };
			  (function() {
				var e = document.createElement("script"); e.async = true;
				e.src = document.location.protocol +
				  "//connect.facebook.net/en_US/all.js";
				document.getElementById("fb-root").appendChild(e);
			  }());
			-->
			</script>
			<fb:like href="http://www.cakecoding.com/humeurs/hello-world-1" send="true" layout="standard" width="450" show_faces="true" colorscheme="light" action="like" font=""></fb:like>
			<!--Facebook Like and Send button by darkomitrovic.com-->
			<p><em>Originally posted at <a href="http://www.cakecoding.com/humeurs/hello-world-1">Hello world!</a></em></p>]]></content:encoded>
			<wfw:commentRss>http://www.cakecoding.com/humeurs/hello-world-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

