<?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>Développement Web Libre &#187; php</title>
	<atom:link href="http://www.sbnet.fr/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sbnet.fr</link>
	<description>xhtml, css, javascript, php et ruby</description>
	<lastBuildDate>Fri, 03 Feb 2012 11:44:49 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Traitements parallèles grâce a Gearman</title>
		<link>http://www.sbnet.fr/2011/06/30/traitements-paralleles-grace-a-gearman/</link>
		<comments>http://www.sbnet.fr/2011/06/30/traitements-paralleles-grace-a-gearman/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 17:47:51 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/?p=168</guid>
		<description><![CDATA[Je me suis déjà frotté au multitâche avec PHP, et il faut dire, avec un certain recul et pas mal de temps de tests, que je suis plutot déçu par la stabilité du système mis en place. J&#8217;avais développé ça sur une base de forks de process. Ça marchait bien jusqu&#8217;à un certain point, lorsque [...]]]></description>
			<content:encoded><![CDATA[<p>Je me suis déjà frotté au <a title="PHP fait du multitâche" href="http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/">multitâche avec PHP</a>, et il faut dire, avec un certain recul et pas mal de temps de tests, que je suis plutot déçu par la stabilité du système mis en place. J&#8217;avais développé ça sur une base de forks de process. Ça marchait bien jusqu&#8217;à un certain point, lorsque le serveur était un peu chargé (à peine plus que d&#8217;habitude) certain de mes process plantaient aléatoirement, jamais le même process. Peut-être que j&#8217;abusais un peu, mais bon j&#8217;en ai besoin de mes 200 process moi.</p>
<p>Dans ma quête de stabilité, je me suis dit qu&#8217;utiliser <a title="Gearman" href="http://gearman.org/">Gearman</a> serait une bonne idée, il est censé être simple, scalable, stable, et tout et tout.</p>
<p><span id="more-168"></span></p>
<p>Voici la structure mise en place :</p>
<ul>
<li>Un client, qui en fait est un script PHP, qui envoie envoie des <em>jobs</em> (des tâches) au serveur gearman.</li>
<li>Un serveur gearman qui s&#8217;occupe d&#8217;empiler les jobs et de les distribuer au workers.</li>
<li>Plusieurs workers qui eux aussi sont des scripts PHP. Ils reçoivent les jobs que le client à envoyé au serveur. Une fois le job terminé, le worker qui avait le job en charge retourne le résultat au client via le serveur.</li>
</ul>
<p>On verra pas la suite que le client n&#8217;est pas obligé d&#8217;attendre le résultat de ses jobs. Dans ce cas le client ne sait pas si le job s&#8217;est bien passé et il ne connaitra pas non plus le résultat du job.</p>
<p>Dans mon cas je n&#8217;ai pas besoin du résultat, j&#8217;ai juste besoin d&#8217;empiler des jobs afin de les lancer en parallèle et ce n&#8217;est pas la peine d&#8217;attendre que chaque job ait fini son travail.</p>
<p style="text-align: center;"><img class="size-full wp-image-179 aligncenter" title="Achitecture Gearman" src="http://www.sbnet.fr/uploads/gearman.png" alt="" width="402" height="462" /></p>
<h2>Installation</h2>
<p>L&#8217;installation décrite ici est pour Linux, pour Ubuntu plus exactement, voici la démarche a suivre :</p>
<p>Il faut ajouter ce dépôt à vos sources dans le fichier <em>/etc/apt/sources.list</em> :  <a title="https://launchpad.net/~gearman-developers/+archive/ppa" href="https://launchpad.net/~gearman-developers/+archive/ppa" rel="nofollow">https://launchpad.net/~gearman-developers/+archive/ppa</a></p>
<p>On met à jour puis on installe gearman avec apt-get :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">apt-get update
apt-get upgrade
apt-get install gearman-job-server</pre></div>
<p>On installe l&#8217;extension pour PHP</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">apt-get install php5-dev
apt-get install libgearman-dev
wget http://pecl.php.net/get/gearman<span class="nu0">-0.8</span><span class="nu0">.0</span>.tgz
tar xzf gearman-X.Y.tgz
<span class="kw3">cd</span> gearman-X.Y
phpize
./configure
make
make install</pre></div>
<p>Si tout se passe bien, on a juste à a jouter l&#8217;extension au fichier php.ini :</p>
<div style="overflow: auto;"><pre class="ini" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">extension=<span class="st0">&quot;gearman.so&quot;</span></pre></div>
<p>Et on n&#8217;oublie pas de recharger son serveur web pour prendre en compte la nouvelle extension.</p>
<p>Pour vérifier que tout est bien en place, on peut utiliser cette commande :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><a href="http://www.php.net/print"><span class="kw3">print</span></a> gearman_version<span class="br0">(</span><span class="br0">)</span>;</pre></div>
<h2>Le client</h2>
<p>Voila le code du client utilisé :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$client</span>= <span class="kw2">new</span> GearmanClient<span class="br0">(</span><span class="br0">)</span>;
<span class="re0">$client</span>-&gt;addServer<span class="br0">(</span><span class="st0">&quot;127.0.0.1&quot;</span>, <span class="nu0">4730</span><span class="br0">)</span>;
 
<span class="re0">$task_id</span> = <span class="nu0">0</span>;
<span class="kw1">while</span><span class="br0">(</span><span class="re0">$image_id</span> = get_new_image<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="re0">$params</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span>
        <span class="st0">&quot;db_config&quot;</span> =&gt; <span class="re0">$db_config</span><span class="br0">[</span><span class="re0">$options</span><span class="br0">[</span><span class="st0">'environment'</span><span class="br0">]</span><span class="br0">]</span>,
        <span class="st0">&quot;image_id&quot;</span> = <span class="re0">$image_id</span>,
    <span class="br0">)</span>;
 
    <span class="re0">$client</span>-&gt;addTaskBackground<span class="br0">(</span><span class="st0">&quot;process_image&quot;</span>, <a href="http://www.php.net/serialize"><span class="kw3">serialize</span></a><span class="br0">(</span><span class="re0">$params</span><span class="br0">)</span>, <span class="kw2">null</span>, <span class="st0">&quot;T&quot;</span>.<span class="re0">$task_id</span>++<span class="br0">)</span>;
<span class="br0">}</span>
<span class="re0">$client</span>-&gt;runTasks<span class="br0">(</span><span class="br0">)</span>;
<a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span>;</pre></div>
<p>On commence par créer un objet <em>GearmanClient</em>, il se connectera à notre serveur grâce au <em>addServer</em>.</p>
<p>Dans cet exemple, on empile des traitements sur des images, c&#8217;est la fonction process_image qui sera appelée par chaque job.</p>
<p>On crée aussi un tableau de paramètres qui sera sérialisé avant d&#8217;être envoyé au job. Les paramètres que j&#8217;ai mis ici sont juste des exemples, on peut y mettre ce qu&#8217;on veut pourvu que ce qu&#8217;on y met soit sérialisable.</p>
<p>Le <em>runTasks() </em>achève le travail et indique au serveur de lancer les tâches.</p>
<h2>Les workers</h2>
<p>Pour gérer les workers, j&#8217;ai fait un petit script qui en lance un certain nombre à coup de <em>fork()</em>.</p>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Starting {$nb_workers} workers : &quot;</span>;
<span class="kw1">for</span><span class="br0">(</span><span class="re0">$i</span>=<span class="nu0">0</span>; <span class="re0">$i</span>&lt;<span class="re0">$nb_workers</span>; <span class="re0">$i</span>++<span class="br0">)</span>
<span class="br0">{</span>
     <span class="re0">$pid</span> = pcntl_fork<span class="br0">(</span><span class="br0">)</span>;
      <span class="kw1">if</span><span class="br0">(</span><span class="re0">$pid</span> == <span class="nu0">-1</span><span class="br0">)</span>
      <span class="br0">{</span>
          <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Fork error !<span class="es0">\n</span>&quot;</span>;
      <span class="br0">}</span>
      <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span><span class="re0">$pid</span><span class="br0">)</span>
      <span class="br0">{</span>
         <span class="re0">$pids</span><span class="br0">[</span><span class="br0">]</span> = <span class="re0">$pid</span>;
         <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Worker pid : {$pid}<span class="es0">\n</span>&quot;</span>;
      <span class="br0">}</span>
      <span class="kw1">else</span>
      <span class="br0">{</span>
         <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><span class="st0">&quot;run&quot;</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;
         <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span>;
     <span class="br0">}</span>
 <span class="br0">}</span>
 
 <span class="br0">[</span>...<span class="br0">]</span>
 
 <span class="kw2">function</span> run<span class="br0">(</span><span class="br0">)</span>
 <span class="br0">{</span>
     <span class="re0">$worker</span>= <span class="kw2">new</span> GearmanWorker<span class="br0">(</span><span class="br0">)</span>;
     <span class="re0">$worker</span>-&gt;addServer<span class="br0">(</span><span class="st0">&quot;127.0.0.1&quot;</span>, <span class="nu0">4730</span><span class="br0">)</span>;
     <span class="re0">$worker</span>-&gt;addFunction<span class="br0">(</span><span class="st0">&quot;process_image&quot;</span>, <span class="st0">&quot;do_work&quot;</span><span class="br0">)</span>;
     <span class="kw1">while</span><span class="br0">(</span><span class="re0">$worker</span>-&gt;work<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;
<span class="br0">}</span>
 
<span class="kw2">function</span> do_work<span class="br0">(</span><span class="re0">$job</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="re0">$params</span> = <a href="http://www.php.net/unserialize"><span class="kw3">unserialize</span></a><span class="br0">(</span><span class="re0">$job</span>-&gt;workload<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;    
 
    <span class="co1">// Code du traitement de l'image</span>
<span class="br0">}</span></pre></div>
<p>A vous de l’adapter selon vos besoins, il n&#8217;y a la rien de bien compliqué.</p>
<h2>Conclusion</h2>
<p>Finalement, la mise en place d&#8217;un tel système s&#8217;avère assez simple et rapide. Il ne nous aura pas fallu plus d&#8217;une journée pour réaliser l&#8217;ensemble alors que nous n&#8217;avions jamais touché à Gearman auparavant.</p>
<p>La stabilité à l&#8217;air d&#8217;être au rendez-vous, nous n&#8217;avons eu aucun plantage de job ou autre depuis sa mise en tests et nous lançons environs 700 jobs par jours repartis sur 10 workers. C&#8217;est pas énorme mais on a prévu de charger un peu plus la bête dans un second temps.</p>
<p>Pour plus d&#8217;informations, voici quelques liens :</p>
<ul>
<li><a href="http://fr.php.net/manual/en/book.gearman.php">http://fr.php.net/manual/en/book.gearman.php</a></li>
<li><a href="http://gearman.org/">http://gearman.org/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2011/06/30/traitements-paralleles-grace-a-gearman/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Associer un sous-domaine à une application symfony</title>
		<link>http://www.sbnet.fr/2010/07/02/associer-un-sous-domaine-a-une-application-symfony/</link>
		<comments>http://www.sbnet.fr/2010/07/02/associer-un-sous-domaine-a-une-application-symfony/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 08:35:29 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/?p=133</guid>
		<description><![CDATA[Coté serveur web Il faut soit  créer des virtual host pour tous vos sous-domaine. Soit créer un seul virtual host en utilisant des wildcards dans le ServerAlias, du coup tous les sous-domaines pourraient correspondre à une application, plus besoin de créer autant de virtual hosts que de sous-domaine. Il doit même être possible d&#8217;utiliser les [...]]]></description>
			<content:encoded><![CDATA[<h3>Coté serveur web</h3>
<p>Il faut soit  créer des virtual host pour tous vos sous-domaine.</p>
<p>Soit créer un seul virtual host en utilisant des wildcards dans le ServerAlias, du coup tous les sous-domaines pourraient correspondre à une application, plus besoin de créer autant de virtual hosts que de sous-domaine. Il doit même être possible d&#8217;utiliser les wildcards dans la déclaration du domaine dans le gestionnaire de dns.</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ServerName domain.tld
ServerAlias *.domain.tld</pre></div>
<h3>Coté symfony</h3>
<p>Il faut renommer le fichier <em>web/index.php</em> en <em>web/frontend.php</em><br />
<em> </em>Puis re-créer le fichier <em>web/index.php </em>en y mettant le code qui permettra de choisir l&#8217;application<br />
en fonction du sous domaine.<br />
Voici un exemple, il suffit de modifier le <em>switch()</em> pour l&#8217;adapter à vos besoins :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw1">require_once</span><span class="br0">(</span><a href="http://www.php.net/dirname"><span class="kw3">dirname</span></a><span class="br0">(</span><span class="kw2">__FILE__</span><span class="br0">)</span>.<span class="st0">'/../config/ProjectConfiguration.class.php'</span><span class="br0">)</span>;
<span class="co1">// Trouve le sous-domaine</span>
<a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">(</span><span class="re0">$subdomain</span>, <span class="re0">$domain</span>, <span class="re0">$tld</span><span class="br0">)</span> = <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">(</span><span class="st0">'.'</span>, <span class="re0">$_SERVER</span><span class="br0">[</span><span class="st0">'HTTP_HOST'</span><span class="br0">]</span><span class="br0">)</span>;
 
<span class="co1">// En deduit l'application</span>
<span class="kw1">switch</span><span class="br0">(</span><span class="re0">$subdomain</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">case</span> <span class="st0">&quot;documentation&quot;</span>:
        <span class="re0">$app</span> = <span class="st0">&quot;documentation&quot;</span>;
    <span class="kw1">break</span>;
 
    <span class="kw2">default</span>:
        <span class="re0">$app</span> = <span class="st0">&quot;frontend&quot;</span>;
    <span class="kw1">break</span>;
<span class="br0">}</span>
<span class="re0">$configuration</span> = ProjectConfiguration::<span class="me2">getApplicationConfiguration</span><span class="br0">(</span><span class="re0">$app</span>, <span class="st0">'prod'</span>, <span class="kw2">false</span><span class="br0">)</span>;
sfContext::<span class="me2">createInstance</span><span class="br0">(</span><span class="re0">$configuration</span><span class="br0">)</span>-&gt;dispatch<span class="br0">(</span><span class="br0">)</span>;</pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/07/02/associer-un-sous-domaine-a-une-application-symfony/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP fait du multitâche</title>
		<link>http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/</link>
		<comments>http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 15:30:52 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[multitache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2010/02/26/threads-et-php-multitache/</guid>
		<description><![CDATA[Pour les besoins d&#8217;un projet effectuant un grand nombre de tâches répétitives, j&#8217;ai dû mettre en place un système basé sur un script PHP lancé par cron à intervalles réguliers. Il n&#8217;y a aucune difficulté particulière à réaliser ceci, là où ça commence à être intéressant c&#8217;est à partir du moment où il a fallu [...]]]></description>
			<content:encoded><![CDATA[<p>Pour les besoins d&#8217;un projet effectuant un grand nombre de tâches répétitives, j&#8217;ai dû mettre en place un système basé sur un script PHP lancé par cron à intervalles réguliers. Il n&#8217;y a aucune difficulté particulière à réaliser ceci, là où ça commence à être intéressant c&#8217;est à partir du moment où il a fallu que ce script puisse lancer plusieurs tâches en même temps.</p>
<p>On a donc un script lancé à intervalles réguliers qui lui même va lancer et gérer un certain nombre, configurable, de tâches concurrente. Voici comment j&#8217;ai procédé.</p>
<p><span id="more-131"></span>Avant de continuer, il est bon de noter que j&#8217;ai effectué tous mes tests sur une machine fonctionnant sous linux, <strike>je n&#8217;ai aucune idée de la façon dont ça peu fonctionner sous windows, si jamais ça fonctionne sous windows</strike> les fonctions pcntl ne fonctionnent pas sous windows, donc pas de multitâche, avec cette méthode en tous cas, pour cette plateforme.</p>
<p>Un petit exemple vaut mieux que de longs discours :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">function</span> task<span class="br0">(</span><span class="re0">$msg</span><span class="br0">)</span>
<span class="br0">{</span>
    <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Task say $msg<span class="es0">\n</span>&quot;</span>;
<span class="br0">}</span>
 
<span class="re0">$t</span> = <span class="kw2">new</span> Task<span class="br0">(</span><span class="br0">)</span>;
<span class="re0">$t</span>-&gt;fork<span class="br0">(</span><span class="st0">'task'</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">&quot;hello&quot;</span><span class="br0">)</span><span class="br0">)</span>;</pre></div>
<p>On peut sans problème lancer plusieurs tâches en créant plusieurs objets <em>Task</em>.</p>
<p>Et vérifier qu&#8217;une tâche est en cours avec la méthode <em>is_running()</em></p>
<p>Ici, pour l&#8217;exemple, on lance simplement une nouvelle tâche dont l&#8217;action principale sera d&#8217;afficher du texte, mais en général on à tendance à faire des tâches pour effectuer un traitement lourd ou long. Par exemple si on doit vérifier qu&#8217;une liste sites répondent correctement (disons 10 000 sites) sans utiliser de multitâche, si on a un timeout de 5 secondes et que 10% des sites sont hs, on perdra 5000 secondes à attendre. Par contre si on lance 100 tâches, potentiellement, on divises par 100 le temps d&#8217;attente.</p>
<p>Voici le code de cette classe</p>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">class</span> Task
<span class="br0">{</span>
    <span class="kw2">private</span> <span class="re0">$pid</span>;
    <span class="kw2">private</span> <span class="re0">$priority</span>=<span class="nu0">0</span>;
 
    protected <span class="re0">$children_pid</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span>;
 
    <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span>!<a href="http://www.php.net/function_exists"><span class="kw3">function_exists</span></a><span class="br0">(</span><span class="st0">&quot;pcntl_fork&quot;</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception <span class="br0">(</span><span class="st0">&quot;Your system does not support pcntl (thread) functions&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="co1">// Set the default signal handler</span>
        <span class="re0">$this</span>-&gt;add_signal<span class="br0">(</span>SIGTERM, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">&quot;signal_handler&quot;</span><span class="br0">)</span><span class="br0">)</span>;
        <span class="re0">$this</span>-&gt;add_signal<span class="br0">(</span>SIGINT, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">&quot;signal_handler&quot;</span><span class="br0">)</span><span class="br0">)</span>;
        <span class="re0">$this</span>-&gt;add_signal<span class="br0">(</span>SIGQUIT, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">&quot;signal_handler&quot;</span><span class="br0">)</span><span class="br0">)</span>;
    <span class="br0">}</span> 
 
    <span class="kw2">public</span> <span class="kw2">function</span> __destruct<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$this</span>-&gt;wait_children<span class="br0">(</span><span class="br0">)</span>;
    <span class="br0">}</span> 
 
    <span class="kw2">public</span> <span class="kw2">function</span> is_running<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$pid</span> = pcntl_waitpid<span class="br0">(</span><span class="re0">$this</span>-&gt;pid, <span class="re0">$status</span>, WNOHANG<span class="br0">)</span>;
        <span class="kw1">return</span><span class="br0">(</span><span class="re0">$pid</span> === <span class="nu0">0</span><span class="br0">)</span>;
    <span class="br0">}</span>  
 
    <span class="kw2">public</span> <span class="kw2">function</span> wait_children<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$this</span>-&gt;children_pid <span class="kw1">as</span> <span class="re0">$child_pid</span><span class="br0">)</span>
        <span class="br0">{</span>
            pcntl_waitpid<span class="br0">(</span><span class="re0">$child_pid</span>, <span class="re0">$status</span><span class="br0">)</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> fork<span class="br0">(</span><span class="re0">$name</span>, <span class="re0">$params</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$pid</span> = pcntl_fork<span class="br0">(</span><span class="br0">)</span>;
 
        <span class="kw1">if</span><span class="br0">(</span><span class="re0">$pid</span> === <span class="nu0">-1</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Unable to fork&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
        <span class="kw1">elseif</span><span class="br0">(</span><span class="re0">$pid</span> &gt; <span class="nu0">0</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="co1">// Parent</span>
            <span class="re0">$this</span>-&gt;children_pid<span class="br0">[</span><span class="br0">]</span> = <span class="re0">$pid</span>;
        <span class="br0">}</span>
        <span class="kw1">elseif</span><span class="br0">(</span><span class="re0">$pid</span> === <span class="nu0">0</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="co1">// Child</span>
            <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><span class="re0">$name</span>, <span class="re0">$params</span><span class="br0">)</span>;
            <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> add_signal<span class="br0">(</span><span class="re0">$signal</span>, <span class="re0">$function_name</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span>!pcntl_signal<span class="br0">(</span><span class="re0">$signal</span>, <span class="re0">$function_name</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Can't add the signal&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> signal_handler<span class="br0">(</span><span class="re0">$signal</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">switch</span><span class="br0">(</span><span class="re0">$signal</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="kw2">default</span>:
            <span class="kw1">case</span> SIGTERM:
                <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span>;
            <span class="kw1">break</span>;
 
            <span class="kw1">case</span> SIGQUIT:
            <span class="kw1">case</span> SIGINT:
            <span class="kw1">case</span> SIGKILL:
                <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span>;
            <span class="kw1">break</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> get_pid<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span> <span class="re0">$this</span>-&gt;pid;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> set_priority<span class="br0">(</span><span class="re0">$priority</span>, <span class="re0">$process_identifier</span>=PRIO_PROCESS<span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span>!<a href="http://www.php.net/is_int"><span class="kw3">is_int</span></a><span class="br0">(</span><span class="re0">$priority</span><span class="br0">)</span> || <span class="re0">$priority</span> &lt; <span class="nu0">-20</span> || <span class="re0">$priority</span> &gt; <span class="nu0">20</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Invalid priority&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="kw1">if</span><span class="br0">(</span><span class="re0">$process_identifier</span> != PRIO_PROCESS || <span class="re0">$process_identifier</span> != PRIO_PGRP || <span class="re0">$process_identifier</span> != PRIO_USER<span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Invalid process identifier type&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="kw1">if</span><span class="br0">(</span>!pcntl_setpriority<span class="br0">(</span><span class="re0">$priority</span>, <span class="re0">$this</span>-&gt;pid, <span class="re0">$process_identifier</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Can't set the priority&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="re0">$this</span>-&gt;priority = <span class="re0">$priority</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> get_priority<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span> <span class="re0">$this</span>-&gt;priority;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> kill<span class="br0">(</span><span class="re0">$pid</span><span class="br0">)</span>
    <span class="br0">{</span>
        <a href="http://www.php.net/posix_kill"><span class="kw3">posix_kill</span></a><span class="br0">(</span>pid, SIGHUP<span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zero, c&#8217;est la tête à toto</title>
		<link>http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/</link>
		<comments>http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 16:13:45 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/</guid>
		<description><![CDATA[C&#8217;est pas moi qui le dit, c&#8217;est PHP. La preuve : var_dump(0 == &#34;toto&#34;); Voir ça sur codepad]]></description>
			<content:encoded><![CDATA[<p><a href="http://php.net/error_reporting" class="external text" title="http://php.net/error_reporting" rel="nofollow"></a>C&#8217;est pas moi qui le dit, c&#8217;est PHP.</p>
<p>La preuve :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">(</span><span class="nu0">0</span> == <span class="st0">&quot;toto&quot;</span><span class="br0">)</span>;</pre></div>
<p><a href="http://codepad.org/AIpJjxLa" title="php ça crain">Voir ça sur codepad</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Magento : ajouter et enlever des produits du panier</title>
		<link>http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-des-produits-du-panier/</link>
		<comments>http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-des-produits-du-panier/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 09:37:26 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-de-produits-du-panier/</guid>
		<description><![CDATA[Magento est un système de commerce électronique assez complexe à appréhender, il est bien mieux organisé que le vieillissant Oscommerce et peut être modifié à souhait grâce à une architecture bien pensée, basée sur Zend Framework mais qui demande quand même assez de temps pour s&#8217;y habituer. Je vous propose dans ce billet de voir [...]]]></description>
			<content:encoded><![CDATA[<p>Magento est un système de commerce électronique assez complexe à appréhender, il est bien mieux organisé que le vieillissant Oscommerce et peut être modifié à souhait grâce à une architecture bien pensée, basée sur Zend Framework mais qui demande quand même assez de temps pour s&#8217;y habituer. Je vous propose dans ce billet de voir comment faire pour ajouter et enlever des produits du panier de façon automatique.</p>
<p><span id="more-124"></span></p>
<h3>Ajouter un produit</h3>
<p>C&#8217;est le plus simple, il suffit de récupérer l&#8217;id du produit puis de tout simplement l&#8217;ajouter au panier</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$id</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">'catalog/product'</span><span class="br0">)</span>-&gt;getIdBySku<span class="br0">(</span><span class="st0">&quot;product_sku&quot;</span><span class="br0">)</span>;
<span class="re0">$cart</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">&quot;checkout/cart&quot;</span><span class="br0">)</span>;
<span class="re0">$cart</span>-&gt;addProductsByIds<span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$id</span><span class="br0">)</span><span class="br0">)</span>;
<span class="re0">$cart</span>-&gt;save<span class="br0">(</span><span class="br0">)</span>;</pre></div>
<h3>Enlever un produit</h3>
<p>C&#8217;est un peut plus compliqué, il faut parcourir tout le panier pour vérifier si l&#8217;id du produit à enlever est bien présent et le supprimer si c&#8217;est le cas</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$cart</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">&quot;checkout/cart&quot;</span><span class="br0">)</span>;
<span class="re0">$id</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">'catalog/product'</span><span class="br0">)</span>-&gt;getIdBySku<span class="br0">(</span><span class="st0">&quot;product_sku&quot;</span><span class="br0">)</span>;
 
<span class="re0">$items</span> = <span class="re0">$cart</span>-&gt;getItems<span class="br0">(</span><span class="br0">)</span>;
<span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$items</span> <span class="kw1">as</span> <span class="re0">$item</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">if</span><span class="br0">(</span><span class="re0">$item</span>-&gt;getProduct<span class="br0">(</span><span class="br0">)</span>-&gt;getId<span class="br0">(</span><span class="br0">)</span> == <span class="re0">$id</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$itemId</span> = <span class="re0">$item</span>-&gt;getItemId<span class="br0">(</span><span class="br0">)</span>;
        <span class="re0">$cart</span>-&gt;removeItem<span class="br0">(</span><span class="re0">$itemId</span><span class="br0">)</span>-&gt;save<span class="br0">(</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-des-produits-du-panier/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Installer XDebug avec PHP 5.3</title>
		<link>http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/</link>
		<comments>http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 08:30:41 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/</guid>
		<description><![CDATA[PHP 5.3 à plein de nouvelles fonctionnalités à explorer, autant en profiter pour entrer dans le détail mettre en place un environnement de développement complet comprenant un profiler et un debugger. Je pense que vous avez déjà installé PHP 5.3, sinon, cet article est pour vous. Commencez par télécharger les sources de Xdebug sur le [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3 à plein de nouvelles fonctionnalités à explorer, autant en profiter pour entrer dans le détail mettre en place un environnement de développement complet comprenant un profiler et un debugger.</p>
<p><span id="more-121"></span>Je pense que vous avez déjà installé PHP 5.3, sinon, <a href="http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/" title="installer php5 et php6 sur le même serveur">cet article</a> est pour vous.</p>
<p>Commencez par télécharger <a href="http://www.xdebug.org/link.php?url=xdebug203" title="sources de xdebug">les sources de Xdebug</a> sur le site officiel et décompactez les dans un répertoire, peut-importe où.</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">wget http://www.xdebug.org/link.php?<span class="re2">url=</span>xdebug203
tar -xvf xdebug<span class="nu0">-2.0</span><span class="nu0">.3</span>.tgz
<span class="kw3">cd</span> xdebug<span class="nu0">-2.0</span><span class="nu0">.3</span></pre></div>
<p>Un fois fait, il faut lancer phpize, attention, il faut lancer le bon phpize, celui de PHP 5.3, chez moi il est dans /usr/local/php5.3/bin</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">/usr/<span class="kw3">local</span>/php5<span class="nu0">.3</span>/bin/phpize</pre></div>
<p>Il ne reste plus qu&#8217;a compiler en indiquant bien quel php utiliser, comme avec phpize</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">./configure --enable-xdebug --with-php-<span class="re2">config=</span>/usr/<span class="kw3">local</span>/php53/bin/php-config
make
cp modules/xdebug.so /usr/<span class="kw3">local</span>/php53/xdebug.so</pre></div>
<p>On ajoute le module au fichier php.ini (chez moi il est dans /usr/local/php53/lib/php.ini) et c&#8217;est fini :</p>
<div style="overflow: auto;"><pre class="ini" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">zend_extension=<span class="st0">&quot;/usr/local/php53/xdebug.so&quot;</span></pre></div>
<p>La suite, notamment la configuration et l&#8217;utilisation du profiler et le <a href="http://www.jeanphi.fr/?post/2008/09/30/Debug-php-pas-a-pas-avec-XDebug-et-Vim" title="debug php pas à pas">debug php pas à pas</a>, est disponible sur le blog de <a href="http://www.jeanphi.fr">Jean-Phi</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ajoutez des évenements à vos objets</title>
		<link>http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/</link>
		<comments>http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 07:19:26 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[nano]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/</guid>
		<description><![CDATA[Pour les besoins de Nano, notre framework PHP, JP et moi avons réalisé un système de d&#8217;abonnement et de gestion d&#8217;évènements à des objets. Nous avons créé deux classes, Observable et Observer. La première sera héritée par les objets que nous souhaitons rendre observables et la seconde contient la définition de l&#8217;objet qui appellera le [...]]]></description>
			<content:encoded><![CDATA[<p>Pour les besoins de <a href="http://code.google.com/p/nanoframework/" title="nano framework php">Nano</a>, notre framework PHP, JP et moi avons réalisé un système de d&#8217;abonnement et de gestion d&#8217;évènements à des objets.</p>
<p><span id="more-119"></span></p>
<p>Nous avons créé deux classes, <em>Observable</em> et <em>Observer</em>. La première sera héritée par les objets que nous souhaitons rendre observables et la seconde contient la définition de l&#8217;objet qui appellera le les méthodes déclenchées par les évènements.</p>
<p>Voici le code de ces deux classes,  nous verrons après comment l&#8217;utilise.</p>
<h2>Observer</h2>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">final <span class="kw2">class</span> Observer
<span class="br0">{</span>
    protected <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="re0">$_instance</span>;
    protected <span class="re0">$_observed_events</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span>;
 
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> get_instance<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">(</span>self::<span class="re0">$_instance</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="re0">$c</span>=<span class="kw2">__CLASS__</span>;
            self::<span class="re0">$_instance</span> = <span class="kw2">new</span> <span class="re0">$c</span>;
        <span class="br0">}</span>
        <span class="kw1">return</span> self::<span class="re0">$_instance</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> observe<span class="br0">(</span><span class="re0">$observed_class</span>, <span class="re0">$event</span>, <span class="re0">$called_class</span>, <span class="re0">$called_method</span>, <span class="re0">$arguments</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$this</span>-&gt;_observed_events<span class="br0">[</span><span class="br0">]</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">'observed_class'</span> =&gt; <span class="re0">$observed_class</span>, <span class="st0">'event'</span> =&gt; <span class="re0">$event</span>, <span class="st0">'called_class'</span> =&gt; <span class="re0">$called_class</span>, <span class="st0">'called_method'</span> =&gt; <span class="re0">$called_method</span>,<span class="st0">'arguments'</span> =&gt; <span class="re0">$arguments</span><span class="br0">)</span>;
    <span class="br0">}</span>   
 
    <span class="kw2">public</span> <span class="kw2">function</span> call_back<span class="br0">(</span><span class="re0">$observed_class</span>, <span class="re0">$event</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$return_value</span>=<span class="kw2">true</span>;
        <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$this</span>-&gt;_observed_events <span class="kw1">as</span> <span class="re0">$key</span> =&gt; <span class="re0">$value</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="kw1">if</span><span class="br0">(</span><span class="re0">$value</span><span class="br0">[</span><span class="st0">'observed_class'</span><span class="br0">]</span>==<span class="re0">$observed_class</span> &amp;&amp; <span class="re0">$value</span><span class="br0">[</span><span class="st0">'event'</span><span class="br0">]</span>==<span class="re0">$event</span><span class="br0">)</span>
            <span class="br0">{</span>
                <span class="re0">$return_value</span>&amp;=<a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$value</span><span class="br0">[</span><span class="st0">'called_class'</span><span class="br0">]</span>, <span class="re0">$value</span><span class="br0">[</span><span class="st0">'called_method'</span><span class="br0">]</span><span class="br0">)</span>, <span class="re0">$value</span><span class="br0">[</span><span class="st0">'arguments'</span><span class="br0">]</span><span class="br0">)</span>;
            <span class="br0">}</span>
        <span class="br0">}</span>
 
        <span class="kw1">return</span> <span class="re0">$return_value</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<h2>Observable</h2>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">interface</span> iObservable
<span class="br0">{</span>
    <span class="kw2">public</span> <span class="kw2">function</span> __call<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> __callStatic<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
<span class="br0">}</span>
 
abstract <span class="kw2">class</span> Observable implements iObservable
<span class="br0">{</span>
    <span class="kw2">public</span> <span class="kw2">function</span> __call<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$ret</span> = <span class="kw2">false</span>;
        <span class="kw1">if</span><span class="br0">(</span>Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'before_'</span>.<span class="re0">$method_name</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="re0">$ret</span> = <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">'_'</span>.<span class="re0">$method_name</span><span class="br0">)</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
        <span class="br0">}</span>
        Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'on_'</span>.<span class="re0">$method_name</span>, <span class="re0">$ret</span><span class="br0">)</span>;           
 
        <span class="kw1">return</span> <span class="re0">$ret</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> __callStatic<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$ret</span> = <span class="kw2">false</span>;
        <span class="kw1">if</span><span class="br0">(</span>Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'before_'</span>.<span class="re0">$method_name</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="re0">$ret</span> = <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'_'</span>.<span class="re0">$method_name</span><span class="br0">)</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
        <span class="br0">}</span>
        Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'on_'</span>.<span class="re0">$method_name</span>, <span class="re0">$ret</span><span class="br0">)</span>;       
 
        <span class="kw1">return</span> <span class="re0">$ret</span>;
    <span class="br0">}</span>
    <span class="kw2">public</span> <span class="kw2">function</span> add_observer<span class="br0">(</span><span class="re0">$event</span>, <span class="re0">$called_class</span>, <span class="re0">$called_method</span>, <span class="re0">$arguments</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
    <span class="br0">{</span>
        Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;observe<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="re0">$event</span>, <span class="re0">$called_class</span>, <span class="re0">$called_method</span>, <span class="re0">$arguments</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<h2>Utilisation</h2>
<p>Encore un peu de code pour illustrer tout ça, on commence par planter le décor avec nos deux classes.</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">class</span> ClassA <span class="kw2">extends</span> Observable
<span class="br0">{</span>
    <span class="kw2">public</span> <span class="kw2">function</span> _my_function_a<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span><span class="br0">(</span><span class="st0">&quot;Je suis dans ClassA&quot;</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span>
 
abstract <span class="kw2">class</span> CalledClass
<span class="br0">{</span>
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="re0">$value</span>;
 
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> callback_function_a<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        self::<span class="re0">$value</span> = <span class="st0">&quot;je suis dans CalledClass&quot;</span>;
        <span class="kw1">return</span> <span class="kw2">true</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<p>Puis on place notre observer on on vérifie que tout c&#8217;est bien passé</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ClassA::<span class="me2">add_observer</span><span class="br0">(</span><span class="st0">'on_my_function_a'</span>, <span class="st0">'CalledClass'</span>, <span class="st0">'callback_function_a'</span><span class="br0">)</span>;
 
<span class="re0">$this</span>-&gt;a = <span class="kw2">new</span> ClassA<span class="br0">(</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$this</span>-&gt;a-&gt;my_function_a<span class="br0">(</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> CalledClass::<span class="re0">$value</span>;</pre></div>
<p>Je vous laisse découvrir les petites subtilités du code que l&#8217;on n&#8217;a pas abordées ici, notamment dans les fonction magique.</p>
<p>Un indice :  le callback est automatiquement appelé (s&#8217;il existe bien sûr) pour les méthodes qui commencent par un underscore, sinon vous pouvez placer des<em> Observer::get_instance()-&gt;call_back(__CLASS__, $event);</em> dans votre code aux endroits stratégiques de votre méthode observée.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP5 et PHP6 sur le même serveur</title>
		<link>http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/</link>
		<comments>http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 17:02:12 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/</guid>
		<description><![CDATA[Dans un article précédent, j&#8217;expliquais comment installer PHP6 en module module Apache. Maintenant je vais vous montrer comment installer PHP5 et PHP6 en même temps. Pour que ça marche il faut installer PHP5 en module et PHP6 en CGI. Normalement PHP5 est déjà installé en module, si ce n&#8217;est pas le cas, allez voir la [...]]]></description>
			<content:encoded><![CDATA[<p>Dans un <a href="http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/" title="php6 en module apache">article précédent</a>, j&#8217;expliquais comment installer PHP6 en module module Apache. Maintenant je vais vous montrer comment installer PHP5 et PHP6 en même temps.<br />
<span id="more-117"></span><br />
Pour que ça marche il faut installer PHP5 en module et PHP6 en CGI. Normalement PHP5 est déjà installé en module, si ce n&#8217;est pas le cas, allez voir la page du <a href="http://doc.ubuntu-fr.org/lamp" title="lamp ubuntu">wiki ubuntu</a> qui est très bien faite.</p>
<p>Maintenant il faut télécharger PHP6 et le compiler, allez voir le blog de Jean-Phi, il a fait <a href="http://www.jeanphi.fr/blog/show/stripped_title/how-to-installer-php6-sur-ubuntu-feisty" title="php6 en cgi">un billet qui détaille la procédure</a>.</p>
<p>Voila, il ne reste plus qu&#8217;a configurer Apache, j&#8217;ai eu besoin d&#8217;utiliser le module <em>Actions</em> qui n&#8217;était pas activé chez moi, pour l&#8217;activer, c&#8217;est très simple :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">sudo a2enmod actions</pre></div>
<p>Passons à la configuration de votre virtual host, il suffit d&#8217;ajouter ce qui suit à un host :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ScriptAlias /php6-cgi /usr/local/bin
Action php6-script  /php6-cgi/php-cgi
AddHandler php6-script .php</pre></div>
<p>Ce qui donne pour le virtual host complet :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="sc1">&lt;</span>VirtualHost *<span class="sc1">&gt;</span>
        ServerName www.monsite.com
 
        DocumentRoot /home/mon_site/www/
        ScriptAlias /php6-cgi /usr/local/bin
        Action php6-script  /php6-cgi/php-cgi
        AddHandler php6-script .php
 
        <span class="sc1">&lt;</span>directory<span class="sc1">&gt;</span>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        <span class="sc1">&lt;</span>/directory<span class="sc1">&gt;</span>
<span class="sc1">&lt;</span>VirtualHost<span class="sc1">&gt;</span></pre></div>
<p>Le chemin du <em>Scriptalias</em> (/usr/local/bin) doit correspondre au répertoire où est installé php-cgi, celui qui à été installé manuellement avec PHP6</p>
<p>Après, vous pouvez modifier le <em>AddHandler</em> comme vous le souhaitez, dans cet exemple, les fichiers .php sont considérés comme du PHP6 mais si vous voulez, vous pouvez faire en sorte que seuls les fichiers .php6 soient interprétés par PHP6 comme ça les fichiers .php continueront d&#8217;être considérés comme du PHP5 :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ScriptAlias /php6-cgi /usr/local/bin
Action php6-script  /php6-cgi/php-cgi
AddHandler php6-script .php6</pre></div>
<p>Un simple <em>phpinfo();</em> devrait vous confirmer que votre configuration fonctionne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Installer PHP6 en module Apache sur Ubuntu</title>
		<link>http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/</link>
		<comments>http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/#comments</comments>
		<pubDate>Mon, 17 Sep 2007 20:36:51 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[PHP4 ne sera plus plus supporté d&#8217;ici un an laissant la place à PHP5 alors que la version 6 commence à montrer le bout de son nez. Voici comment installer cette derniere version sur un serveur Ubuntu pour effectuer quelques tests. Un petit mot avant de commencer : vous pouvez consulter le billet de Jeanphi [...]]]></description>
			<content:encoded><![CDATA[<p>PHP4 ne sera plus plus supporté d&#8217;ici un an laissant la place à PHP5 alors que la version 6 commence à montrer le bout de son nez. Voici comment installer cette derniere version sur un serveur Ubuntu pour effectuer quelques tests.<br />
<span id="more-111"></span><br />
Un petit mot avant de commencer : vous pouvez consulter le billet de Jeanphi sur son <a href="http://www.jeanphi.fr/" hreflang="fr">blog</a> pour installer <a href="http://www.jeanphi.fr/blog/show/stripped_title/how-to-installer-php6-sur-ubuntu-feisty" hreflang="fr">PHP6 en commande en ligne</a></p>
<h3>Préquis</h3>
<ul>
<li>Un serveur linux sur une base débian, ubuntu&#8230; pour profiter d&#8217;apt-get</li>
<li>Un accès administrateur (au moins pouvoir faire des sudo)</li>
<li>Apache, testé sur un apache 2.2 mais la version n&#8217;a pas vraiment d&#8217;importance</li>
</ul>
<h3>Installation</h3>
<p>Comme nous allons compiler PHP nous aurons besoin des outils de compilation, si vous ne les avez pas déjà installés faites un <em>sudo apt-get install build-esssensials automake</em> pour installer gcc et tout son attirail.</p>
<p>Nous aurons aussi besoin de quelques bibliothèques :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">sudo apt-get install apache2-prefork-dev
sudo apt-get install libicu36-dev
sudo apt-get install libxml-dev</pre></div>
<p>Vous pouvez choisir apache2-threaded-dev à la place da apache2-prefork-dev, ça devrait aussi marcher.</p>
<p>Maintemant occupons nous de PHP6 : téléchargez les sources sur <a href="http://snaps.php.net/" hreflang="en">snaps.php.net</a> et décompressez l&#8217;archive avec : <em>tar xvfz &lt;archive.tar.gz&gt;</em></p>
<p>Allez dans ce répertoire et lancez la compilation :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">./configure --with-<span class="re2">apxs2=</span>/usr/bin/apxs2 --enable-soap
make
make <span class="kw3">test</span>
sudo make install</pre></div>
<p>Sous root créez le fichier /etc/apache2/php6.conf et placez y :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="sc1">&lt;</span>IfModule mod_php6.c<span class="sc1">&gt;</span>
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php-source .phps
<span class="sc1">&lt;</span>/IfModule<span class="sc1">&gt;</span></pre></div>
<p>De même avec le fichier /etc/apache2/php6.load</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">LoadModule php6_module /usr/lib/apache2/modules/libphp6.so</pre></div>
<p>On initialise le module et on relance apache :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">sudo a2enmod php6
sudo /etc/init.d/apache2 restart</pre></div>
<h3>Tests</h3>
<p>Si tout s&#8217;est bien passé, un simple phpinfo devrait confirmer que PHP6 est bien installé, pour aller un peu plu loin, testez les  <a href="http://www.jeanphi.fr/blog/show/stripped_title/php6-et-namespace/" hreflang="fr">namespaces</a>.</p>
<h3>Un petit bonus</h3>
<p>Voici deux petits scripts pour passer de PHP5 à PHP6 et inversement de façon simple :</p>
<p>Activer PHP6</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re3">#!/bin/bash</span>
sudo a2dismod php5
sudo a2enmod php6
sudo /etc/init.d/apache2 restart</pre></div>
<p>Activer PHP5</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re3">#!/bin/bash</span>
sudo a2dismod php6
sudo a2enmod php5
sudo /etc/init.d/apache2 restart</pre></div>
<h3>La suite</h3>
<p>Si j&#8217;ai le temps, je me pencherai sur la configuration à mettre en place pour installe PHP6 et PHP5 conjointement sur le même serveur. Il faudra sûrement en installer un en module (PHP5) et l&#8217;autre en CGI (PHP6)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Protéger ses scripts PHP</title>
		<link>http://www.sbnet.fr/2007/05/22/proteger-ses-scripts-php/</link>
		<comments>http://www.sbnet.fr/2007/05/22/proteger-ses-scripts-php/#comments</comments>
		<pubDate>Tue, 22 May 2007 14:58:22 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://ww.sbnet.fr/2007/05/22/proteger-ses-scripts-php/</guid>
		<description><![CDATA[Si vous développez des applications web en PHP vous avez sûrement déjà eu besoin de protéger vos scripts contre les modifications. Si vous ne voulez pas, par exemple, qu&#8217;un client utilise votre travail sur plusieurs sites alors que vous lui avez permis d&#8217;utiliser votre script que sur un seul site. Voici un moyen simple et [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous développez des applications web en PHP vous avez sûrement déjà eu besoin de protéger vos scripts contre les modifications. Si vous ne voulez pas, par exemple, qu&#8217;un client utilise votre travail sur plusieurs sites alors que vous lui avez permis d&#8217;utiliser votre script que sur un seul site. Voici un moyen simple et relativement efficace d&#8217;empêcher la copie sauvage. Sources et explications fournies :<br />
<span id="more-7"></span></p>
<h3>Encoder ses scripts</h3>
<p>L&#8217;encodage permet de rendre illisible le code source d&#8217;un script sans en changer son comportement, le script encodé continuera de s&#8217;exécuter comme avant.</p>
<p>Il y a tout de même une contrainte : votre script doit entièrement être en php, pas de mélange php + html dans le même fichier. Je n&#8217;ai pas non plus testé cette méthode en profondeur, il y a sûrement plein de cas où elle n&#8217;est pas applicable, n&#8217;hésitez pas à poster des commentaires à ce sujet.</p>
<h3>Fonctionnement de l&#8217;encodage</h3>
<p>Le principe est assez simple : On commence par lire entièrement le fichier à encoder et on enlève les balises <em>&lt;?php</em> et <em>?&gt;</em>, normalement il n&#8217;y en a que deux, une au début et une à la fin du fichier.</p>
<p>Ensuite on fait un simple encodage en base 64 du script, on <em>mélange</em> le tout en utilisant une table de correspondances et c&#8217;est tout.</p>
<p>Enfin presque, il ne nous reste plus qu&#8217;a ajouter le décodeur et à enregistrer le tout dans un autre fichier. Le décodeur fait l&#8217;opération inverse : il remet les données dans le bon ordre, applique un <em>base_64decode()</em> et lance le script grâce à un <em>eval()</em></p>
<p>Voila le code de l&#8217;encodeur, il vous affiche le script encodé à la fin dans un textarea pour pouvoir le <em>copier-coller</em> facilement.</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$nom_fichier</span> = <span class="st0">'mon_script_a_encoder.php'</span>;
<span class="re0">$fichier</span> = <a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">(</span><a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">(</span><span class="re0">$nom_fichier</span><span class="br0">)</span><span class="br0">)</span>;
<span class="re0">$fichier</span> = <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">(</span><span class="st0">&quot;/^&lt;<span class="es0">\?</span>(php)?/&quot;</span>, <span class="st0">''</span>, <span class="re0">$fichier</span><span class="br0">)</span>;
<span class="re0">$fichier</span> = <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">(</span><span class="st0">&quot;/<span class="es0">\?</span>&gt;$/&quot;</span>, <span class="st0">''</span>, <span class="re0">$fichier</span><span class="br0">)</span>;
 
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;h1&gt;Encodage&lt;/h1&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;p&gt;Nom : '</span>.<span class="re0">$nom_fichier</span>.<span class="st0">'&lt;/p&gt;'</span>;
 
<span class="re0">$b64</span> = <a href="http://www.php.net/base64_encode"><span class="kw3">base64_encode</span></a><span class="br0">(</span><span class="re0">$fichier</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;p&gt;Base 64 : '</span>.<span class="re0">$b64</span>.<span class="st0">'&lt;/p&gt;'</span>;
 
<span class="re0">$tr</span> = <a href="http://www.php.net/strtr"><span class="kw3">strtr</span></a><span class="br0">(</span><span class="re0">$b64</span>, <span class="st0">&quot; kCV]4m.DNvM&gt;lstIKLBE6}ghf8[QAowPSR9ibX3cO{up=0anq27jF1eJx/UWGrzHT&lt;5yZYd&quot;</span>,<span class="st0">&quot;ACv.sfKXY{dEn58wjIBToFUtb9&gt;gL}=kqeZ0RuD[4lz Om&lt;12PyHSWJGp7MaiVQr/cN]h63x&quot;</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;p&gt;Translation : '</span>.<span class="re0">$tr</span>.<span class="st0">'&lt;/p&gt;'</span>;
 
<span class="re0">$enc</span>  = <span class="st0">&quot;<span class="es0">\$</span>__c='&quot;</span>.<span class="re0">$tr</span>.<span class="st0">&quot;';&quot;</span>;
<span class="re0">$enc</span> .= <span class="st0">&quot;<span class="es0">\$</span>__s=strtr(<span class="es0">\$</span>__c,<span class="es0">\&quot;</span>ACv.sfKXY{dEn58wjIBToFUtb9&gt;gL}=kqeZ0RuD[4lz Om&lt;12PyHSWJGp7MaiVQr/cN]h63x<span class="es0">\&quot;</span>,<span class="es0">\&quot;</span> kCV]4m.DNvM&gt;lstIKLBE6}ghf8[QAowPSR9ibX3cO{up=0anq27jF1eJx/UWGrzHT&lt;5yZYd<span class="es0">\&quot;</span>);&quot;</span>;
<span class="re0">$enc</span> .= <span class="st0">'$__d=strrev(&quot;edoced_46esab&quot;);eval(<span class="es0">\'</span>$__x=$__d(&quot;$__s&quot;);<span class="es0">\'</span>);eval($__x);'</span>;
 
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;h1&gt;Résultat&lt;/h1&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;textarea cols=&quot;100&quot; rows=&quot;10&quot;&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;?php '</span>.<span class="re0">$enc</span>.<span class="st0">' ?&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;/textarea&gt;'</span>;</pre></div>
<h3>Le mot de la fin</h3>
<p>Vous avez vu que ce procédé est assez simple, il ne tiendra pas longtemps face à un <em>vrai</em> développeur mais devrait suffire dans la plupart des cas. Vous pouvez aussi vous amuser avec <a href="http://pobs.mywalhalla.net/" hreflang="en">pobs</a> pour obfusquer vos scripts ou si vous prévoyez une plus large diffusion vous devrez peut-être utiliser un encodeur plus évolué (bien plus) du genre de <a href="http://www.zend.com/products/zend_guard" hreflang="en">Zend Guard</a> ou <a href="http://www.ioncube.com/sa_encoder.php" hreflang="en">ionCube PHP encoder</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2007/05/22/proteger-ses-scripts-php/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

