Dans le cadre d'un de mes projets de développement, je dois exécuter une tâche un certain nombre de fois par jour et par palier. Pour des raisons spécifiques, le temps d'exécution de chacune des tâches de ce script doit être modéré mais pas sans intervalle régulière.
J'ai donc décidé d'utiliser la fameuse fonction sleep() pour temporiser mes tâches mais j'ai rencontré un petit soucis : la fonction sleep()
ne prend en argument qu'un type int
; or mon calcul de temporisation correspond à une valeur aléatoire issue de 2 pourcentages calculés sur des données de configuration.
Les pourcentages sont très généralement de type float
et donc cela posait un petit soucis pour faire un sleep()
mais même avant cela : un rand() qui lui aussi renvoie un type int
. Comment garder ma précision ?
La logique était donc de continuer à travailler avec les type float
tout le long en re-définissant la fonction rand()
mais le problème se posait toujours pour la fonction sleep()
alors pourquoi ne pas utiliser usleep() qui prend en argument un int
mais correspondant à des micro-secondes ?
En utilisant astucieusement PHP 5.3 et une petite fonction créee par un contributeur aux commentaires de la fonction rand()
, je suis parvienu à réaliser quelque chose dans ce style :
<?php
// On déclare notre espace de travail
namespace Utils;
// Re-définition de la fonction rand()
// @author [email protected]
function rand($min, $max) {
return ($min + lcg_value()) * abs($max - $min);
}
// Re-définition de la fonction usleep()
function usleep($float) {
return \usleep(intval(str_replace('.', null, round($float, 6))));
}
// Test
$start = microtime(true);
var_dump('Sleep: ' . $rand = rand(1.3, 3.6));
usleep($rand);
$end = microtime(true);
var_dump('Exec: ' . ($end - $start));
On obtient donc ce résultat :
string 'Sleep: 2.70700545616' (length=20)
string 'Exec: 2.7074701786' (length=18)
On a bien constaté que la durée d'exécution est très sensiblement plus élevée que la valeur générée aléatoirement... Mais, vous savez déjà pourquoi.
C'est donc avec PHP 5.3 que vous pourrez temporiser vos script aléatoirement et très précisément de manière propre et concise.
Merci !