<span><span><span class="hljs-variable">$cmd</span></span><span> = </span><span><span class="hljs-string">'exec sleep 100'</span></span><span>;
</span><span><span class="hljs-variable">$descriptorspec</span></span><span> = [
</span><span><span class="hljs-number">0</span></span><span> => [</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-number">1</span></span><span> => [</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-number">2</span></span><span> => [</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-variable">$process</span></span><span> = </span><span><span class="hljs-title function_ invoke__">proc_open</span></span><span>(</span><span><span class="hljs-variable">$cmd</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__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 模擬一些處理</span></span><span>
</span><span><span class="hljs-title function_ invoke__">proc_terminate</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>, </span><span><span class="hljs-number">15</span></span><span>); </span><span><span class="hljs-comment">// 嘗試 SIGTERM</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">proc_get_status</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'running'</span></span><span>]) {
</span><span><span class="hljs-comment">// 如果還在運行,嘗試 SIGKILL</span></span><span>
</span><span><span class="hljs-title function_ invoke__">proc_terminate</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>, </span><span><span class="hljs-number">9</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-comment">// 清理資源</span></span><span>
}
</span></span>
在Linux 上使用pcntl_fork() (CLI 環境)自行實現進程管理。
對於復雜任務,考慮使用進程管理框架(如Supervisord)代替proc_open() 。