以下函式接受一個 shell 指令陣列並執行它們。它能夠同時執行最多 $nb_max_process 個指令。一旦一個程序終止,就會執行另一個程序。如果您想在多處理器或多核心環境中批次處理指令,這非常有用。
以下範例嘗試將命令列上提交的 SVG 檔案清單轉換為 PNG(使用 Inkscape)。
(這方法雖然粗糙但對我來說很有效)
#!/usr/bin/php
<?php
function pool_execute($commandes,$nb_max_process) {
$pool=array();
for($i=0;$i<$nb_max_process;$i++) {
$pool[$i]=FALSE;
}
while(count($commandes)>0) {
$commande=array_shift($commandes);
$commande_lancee=FALSE;
while($commande_lancee==FALSE) {
usleep(50000);
for($i=0;$i<$nb_max_process and $commande_lancee==FALSE;$i++) {
if($pool[$i]===FALSE) {
$pool[$i]=proc_open($commande,array(),$foo);
$commande_lancee=TRUE;
} else {
$etat=proc_get_status($pool[$i]);
if($etat['running']==FALSE) {
proc_close($pool[$i]);
$pool[$i]=proc_open($commande,array(),$foo);
$commande_lancee=TRUE;
}
}
}
}
}
}
$fichiers=$argv;
array_shift($fichiers);
$commandes=array();
foreach($fichiers as $fichier) {
$entree=$fichier;
$sortie=basename($fichier,'.svg').".png";
$commandes[]='inkscape --file='.escapeshellarg($entree).' --export-area-canvas --export-png='.escapeshellarg($sortie);
}
pool_execute($commandes,4);