현재 위치: > 최신 기사 목록> PCLOSE 기능을 사용할 때 표준 오류 출력을 캡처하고 올바르게 처리하는 방법은 무엇입니까? 실용적인 기술을 공유하십시오

PCLOSE 기능을 사용할 때 표준 오류 출력을 캡처하고 올바르게 처리하는 방법은 무엇입니까? 실용적인 기술을 공유하십시오

gitbox 2025-09-12

3. 표준 오류 출력을 개별적으로 캡처하는 방법

표준 출력 및 표준 오류 출력을 별도로 얻으려면 임시 파일 또는 이름이 지정된 파이프를 사용할 수 있습니다.

솔루션 1 : 임시 파일 저장 표준 오류를 사용하십시오

 <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">"표준 출력:\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">"표준 오류:\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">"명령은 상태를 반환합니다: <span class="hljs-subst">$status</span></span></span><span>\n";
</span></span>

이러한 방식으로보다 자세한 오류 처리를 위해 두 개의 출력 스트림을 별도로 얻을 수 있습니다.


4. Proc_open을 사용하여보다 유연한 파이프 라인 제어를 얻으십시오

Proc_open ()을 사용하면 표준 입력, 출력 및 오류를 직접 조작 할 수 있으므로 사용하기가 더욱 복잡하지만 더 강력합니다.

 <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">// 표준 입력</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">// 표준 출력</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">// 표준 오류</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">"표준 출력:\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">"표준 오류:\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">"명령은 상태를 반환합니다: <span class="hljs-subst">$status</span></span></span><span>\n";
}
</span></span>

이 방법은 두 개의 출력 스트림을 정확하게 분리 할 수 ​​있으며, 이는 복잡한 요구에 더 적합합니다.