<?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</title>
	<atom:link href="http://www.sbnet.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sbnet.fr</link>
	<description>xhtml, css, javascript, php et ruby</description>
	<lastBuildDate>Wed, 21 Jul 2010 11:57:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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 wildcards dans [...]]]></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>2</slash:comments>
		</item>
		<item>
		<title>La vie est belle</title>
		<link>http://www.sbnet.fr/2010/02/02/la-vie-est-belle/</link>
		<comments>http://www.sbnet.fr/2010/02/02/la-vie-est-belle/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 15:47:23 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[autre]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2010/02/02/la-vie-est-belle/</guid>
		<description><![CDATA[D&#8217;habitude je ne parle que technique sur ce blog, mais pas cette fois-ci.
Cette dernière année à été riche en évènements pour moi, beaucoup de changements, dans l&#8217;ordre :

Je me suis marié !
J&#8217;ai trouvé un travail qui me plait beaucoup dans une petite entreprise bien sympathique et dynamique.
J&#8217;ai déménagé et j&#8217;ai changé de région (J&#8217;ai quitté [...]]]></description>
			<content:encoded><![CDATA[<p>D&#8217;habitude je ne parle que technique sur ce blog, mais pas cette fois-ci.</p>
<p><span id="more-129"></span>Cette dernière année à été riche en évènements pour moi, beaucoup de changements, dans l&#8217;ordre :</p>
<ul>
<li>Je me suis marié !</li>
<li>J&#8217;ai trouvé un travail qui me plait beaucoup dans une petite entreprise bien sympathique et dynamique.</li>
<li>J&#8217;ai déménagé et j&#8217;ai changé de région (J&#8217;ai quitté le Vaucluse pour la Savoie)</li>
<li>Et surtout, je suis l&#8217;heureux papa de la plus jolie de toutes les petites filles.<br />
<strong>Julie est née le 28 janvier 2010</strong> !</li>
</ul>
<p>Ça commence et ça termine bien non ?</p>
<p><img src="http://stephane.6degres.fr/julie/2/DSC01645.JPG" alt="julie" width="600" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/02/02/la-vie-est-belle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qui veut une invitation à Google Wave ?</title>
		<link>http://www.sbnet.fr/2009/12/07/qui-veut-une-invitation-a-google-wave/</link>
		<comments>http://www.sbnet.fr/2009/12/07/qui-veut-une-invitation-a-google-wave/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 13:09:51 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2009/12/07/qui-veut-une-invitation-a-google-wave/</guid>
		<description><![CDATA[Il me reste 3 invitations à Google Wave, si vous en voulez une laissez moi un commentaire ici.
Faites vite, seuls les 3 premiers en auront une.
]]></description>
			<content:encoded><![CDATA[<p>Il me reste 3 invitations à <a href="https://wave.google.com/wave/" title="Google Wave">Google Wave</a>, si vous en voulez une laissez moi un commentaire ici.</p>
<p>Faites vite, seuls les 3 premiers en auront une.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2009/12/07/qui-veut-une-invitation-a-google-wave/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Attention à la faille dans subversion</title>
		<link>http://www.sbnet.fr/2009/11/19/attention-a-la-faille-dans-subversion/</link>
		<comments>http://www.sbnet.fr/2009/11/19/attention-a-la-faille-dans-subversion/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 10:33:17 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2009/11/19/attention-a-la-faille-dans-subversion/</guid>
		<description><![CDATA[Enfin, c&#8217;est pas vraiment une faille, c&#8217;est juste que lorsque l&#8217;on déploie un projet à partir d&#8217;un dépôt subversion, il faut faire attention aux fichiers et répertoires .svn qui peuvent être visibles, selon  la configuration de votre serveur web.
Pour empêcher ça avec apache, quelques lignes dans votre httpd.conf suffisent :
&#60;Directory ~ &#34;.*\.svn&#34;&#62;
    Order [...]]]></description>
			<content:encoded><![CDATA[<p>Enfin, c&#8217;est pas vraiment une faille, c&#8217;est juste que lorsque l&#8217;on déploie un projet à partir d&#8217;un dépôt subversion, il faut faire attention aux fichiers et répertoires <em>.svn</em> qui peuvent être visibles, selon  la configuration de votre serveur web.</p>
<p>Pour empêcher ça avec apache, quelques lignes dans votre httpd.conf suffisent :</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>Directory ~ &quot;.*\.svn&quot;<span class="sc1">&gt;</span>
    Order allow,deny
    Deny from all
    Satisfy All
<span class="sc1">&lt;</span>/Directory<span class="sc1">&gt;</span></pre></div>
<p>Thanks <a href="http://isaykin.ru/" target="_blank">Anton Isaykin</a> for pointing that out to us.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2009/11/19/attention-a-la-faille-dans-subversion/feed/</wfw:commentRss>
		<slash:comments>0</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>1</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 site officiel [...]]]></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>0</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 les [...]]]></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 page [...]]]></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>
	</channel>
</rss>
