Position actuelle: Accueil> Derniers articles> Comment capturer et gérer correctement la sortie d'erreur standard lors de l'utilisation de la fonction PCLOSE? Partager des compétences pratiques

Comment capturer et gérer correctement la sortie d'erreur standard lors de l'utilisation de la fonction PCLOSE? Partager des compétences pratiques

gitbox 2025-09-12

3. Méthodes pour capturer la sortie d'erreur standard individuellement

Si vous souhaitez obtenir une sortie standard et une sortie d'erreur standard séparément, vous pouvez utiliser des fichiers temporaires ou des tuyaux nommés:

Solution 1: Utilisez des erreurs standard de stockage de fichiers temporaires

 <span><span><span class="hljs-variable">$stderrFile</span></span><span> = </span><span><span class="hljs-title function_ invoke__">tempnam</span></span><span>(</span><span><span class="hljs-title function_ invoke__">sys_get_temp_dir</span></span><span>(), </span><span><span class="hljs-string">'stderr'</span></span><span>);
</span><span><span class="hljs-variable">$cmd</span></span><span> = </span><span><span class="hljs-string">"ls /nonexistent 2&gt; <span class="hljs-subst">$stderrFile</span></span></span><span>";

</span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">popen</span></span><span>(</span><span><span class="hljs-variable">$cmd</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>);
</span><span><span class="hljs-variable">$output</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) {
    </span><span><span class="hljs-variable">$output</span></span><span> .= </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
}
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);

</span><span><span class="hljs-variable">$stderr</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$stderrFile</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$stderrFile</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Sortie standard:\n<span class="hljs-subst">$output</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Erreur standard:\n<span class="hljs-subst">$stderr</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Commande renvoie l&#39;état: <span class="hljs-subst">$status</span></span></span><span>\n";
</span></span>

De cette façon, vous pouvez obtenir deux flux de sortie séparément pour une gestion des erreurs plus détaillée.


4. Utilisez ProC_Open pour obtenir un contrôle de pipeline plus flexible

proc_open () permet la manipulation directe des entrées, des sorties et des erreurs standard, ce qui le rend plus complexe à utiliser, mais plus puissant.

 <span><span><span class="hljs-variable">$descriptorspec</span></span><span> = [
    </span><span><span class="hljs-number">0</span></span><span> =&gt; [</span><span><span class="hljs-string">"pipe"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>],  </span><span><span class="hljs-comment">// Entrée standard</span></span><span>
    </span><span><span class="hljs-number">1</span></span><span> =&gt; [</span><span><span class="hljs-string">"pipe"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>],  </span><span><span class="hljs-comment">// Sortie standard</span></span><span>
    </span><span><span class="hljs-number">2</span></span><span> =&gt; [</span><span><span class="hljs-string">"pipe"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>]   </span><span><span class="hljs-comment">// Erreur standard</span></span><span>
];

</span><span><span class="hljs-variable">$process</span></span><span> = </span><span><span class="hljs-title function_ invoke__">proc_open</span></span><span>(</span><span><span class="hljs-string">'ls /nonexistent'</span></span><span>, </span><span><span class="hljs-variable">$descriptorspec</span></span><span>, </span><span><span class="hljs-variable">$pipes</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_resource</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$pipes</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);

    </span><span><span class="hljs-variable">$stdout</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_contents</span></span><span>(</span><span><span class="hljs-variable">$pipes</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>]);
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$pipes</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>]);

    </span><span><span class="hljs-variable">$stderr</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_contents</span></span><span>(</span><span><span class="hljs-variable">$pipes</span></span><span>[</span><span><span class="hljs-number">2</span></span><span>]);
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$pipes</span></span><span>[</span><span><span class="hljs-number">2</span></span><span>]);

    </span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">proc_close</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>);

    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Sortie standard:\n<span class="hljs-subst">$stdout</span></span></span><span>\n";
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Erreur standard:\n<span class="hljs-subst">$stderr</span></span></span><span>\n";
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Commande renvoie l&#39;état: <span class="hljs-subst">$status</span></span></span><span>\n";
}
</span></span>

Cette méthode peut séparer avec précision deux flux de sortie, ce qui convient plus aux besoins complexes.