URL: https://linuxfr.org/forums/programmation-php/posts/solved-optimisation-php-bash-tester-le-plus-rapidement-si-un-process-est-actif Title: [Solved] [Optimisation] PHP/Bash tester le plus rapidement si un process est actif Authors: voxdemonix Date: 2019年03月17日T13:40:33+01:00 License: CC By-SA Tags: healthcheck, php et haproxy Score: 1 Dans un script de [HealthCheck](https://gitlab.com/voxdemonix/cluster/blob/master/HealthCheck/nextcloud/HealthCheck.php) l'utilisateur peut tester si un ou plusieurs processus sont actifs sur le serveur. Voici un exemple adapté du code : Cette version scan /proc/*/cmdline à la recherche des logiciels demandés par l'user. ```php ``` Néanmoins l'activation de ce block de code double voir triple la durée d’exécution du script PHP. (ce qui me parait beaucoup) Auriez-vous d'autre solution plus rapide et moins énergivore que d’exécuter _pidof_ via _exec()_ ? 😀 Dans le cas ci-présent, chaque itération de la boucle foreach semble prendre a elle seule entre 20ms et 30ms (sur ARM, sur X64 c'est divisé par 5). EDIT : nouvelle édition du code : Cette version parse /proc///cmdline une fois par nom de logiciel. La fonction est optimisée au max. ```php $chkSoftwareName = array( "software1", "software2" ); /* uncomment and edit for check if these softwares names are running */ if(is_array($chkSoftwareName)) { if(!checkIfSoftwareIsRunning ($chkSoftwareName)){ echo "un des logiciels ne fonctionne pas !"; } } function checkIfSoftwareIsRunning ($chkSoftwareName){ $path="/proc/"; $subfile="cmdline"; foreach($chkSoftwareName as $softName){ $check=false; $listFiles = scandir($path, 1); $lenght = count($listFiles); foreach ($listFiles as $filename) { if(!$check && is_dir($path.$filename)){ if(is_file($path.$filename.'/'.$subfile)){ if ($myFile = @fopen($path.$filename."/".$subfile, "r")) { while (($buffer = fgets($myFile)) !== false) { if(preg_match("/".$softName."/i", $buffer)){ $check=true; } } fclose($myFile); } } } $lenght--; if ($lenght<=0 && $check==false) { return false; } // last tab } } return true; } ``` Cette deuxième implémentation parse une seule fois /proc/*/cmdline mais est quand même plus lente que la version juste ci-haut. La fonction peut encore être un peu optimisée. ```php function checkIfSoftwareIsRunning2($chkSoftwareName){ $path="/proc/"; $subfile="cmdline"; foreach($chkSoftwareName as $softName){ $check[$softName]=false; } $listFiles = scandir($path, 1); foreach ($listFiles as $filename) { if(is_dir($path.$filename)){ if(is_file($path.$filename.'/'.$subfile)){ if ($myFile = @fopen($path.$filename."/".$subfile, "r")) { while (($buffer = fgets($myFile)) !== false) { foreach($chkSoftwareName as $softName){ if(preg_match("/".$softName."/i", $buffer, $match[0])){ $check[$softName]=true; } } } fclose($myFile); } } } } foreach($check as $k=>$v){ if(!$v){ return false; } } return true; } ```

AltStyle によって変換されたページ (->オリジナル) /