Quelle est l'utilité pratique de PHP's sleep ()?
je viens de jeter un oeil aux docs sur sleep()
.
où utiliseriez-vous cette fonction?
est-il là pour donner au CPU une pause dans une fonction coûteuse?
des pièges courants?
13 réponses
un endroit où il trouve l'utilisation est de créer un retard .
disons que vous avez construit un crawler qui utilise curl
/ file_get_contents
pour obtenir des pages distantes. Maintenant, vous ne voulez pas bombarder le serveur distant avec trop de requêtes en peu de temps. Vous introduisez donc un délai entre les requêtes consécutives.
sleep
prend l'argument en secondes, son ami usleep
prend les arguments en microsecondes et est plus appropriée dans certains cas.
un autre exemple: vous exécutez une sorte de traitement par lots qui fait un usage intensif d'une ressource. Peut-être que vous parcourez la base de données de 9 000 000 titres et mettez à jour environ 10% d'entre eux. Ce processus doit être exécuté au milieu de la journée, mais il y a tellement de mises à jour à faire que l'exécution de votre programme par lots traîne le serveur de la base de données vers le bas à un crawl pour les autres utilisateurs.
donc vous modifiez le processus de lot Pour soumettre, disons, 1000 mises à jour, puis sleep
pour 5 quelques secondes pour donner au serveur de base de données une chance de terminer le traitement des requêtes d'autres utilisateurs qui ont fait une sauvegarde.
voici un extrait de comment j'utilise sleep
dans un de mes projets:
foreach($addresses as $address)
{
$url = "http://maps.google.com/maps/geo?q={$address}&output=json...etc...";
$result = file_get_contents($url);
$geo = json_decode($result, TRUE);
// Do stuff with $geo
sleep(1);
}
dans ce cas sleep
m'aide à éviter D'être bloqué par Google maps, parce que j'envoie trop de requêtes au serveur.
Edit: ceci est un exemple de ce que codaddict dit.
vieille question je sais, mais une autre raison d'utiliser u/sleep peut être quand vous écrivez le code de sécurité/cryptographie, comme un script d'authentification. Quelques exemples:
- vous pouvez vouloir réduire l'efficacité d'une attaque de force brute potentielle en rendant votre script de connexion volontairement lent, surtout après quelques tentatives ratées.
- vous pouvez également ajouter un délai artificiel pendant le cryptage pour atténuer contre timing des attaques . Je sais que les chances sont minces que vous allez écrire un tel code de cryptage en profondeur dans un langage comme PHP, mais toujours valide je pense.
MODIFIER
utiliser u / sleep contre les attaques de synchronisation n'est pas une bonne solution. Vous pouvez toujours obtenir les données importantes dans une attaque de timing, vous avez juste besoin de plus d'échantillons pour filtrer le bruit que u/sleep ajoute.
vous pouvez trouver plus d'informations sur ce sujet dans: un sommeil aléatoire pourrait-il prévenir les attaques de timing?
vous pouvez utiliser le sommeil pour mettre en pause l'exécution du script... par exemple pour retarder un appel AJAX côté serveur ou mettre en œuvre un observateur. Vous pouvez également l'utiliser pour simuler des retards.
j'utilise cela aussi pour retarder sendmail() & co. .
Quelqu'un utilise use sleep() pour empêcher DoS et login brutefoques, Je ne suis pas d'accord parce que dans ce que vous devez ajouter des vérifications pour empêcher l'utilisateur de courir plusieurs fois.
Vérifier usleep .
j'ai dû l'utiliser récemment lorsque J'utilisais L'API de géolocalisation de Google. Chaque adresse dans une boucle nécessaire pour appeler le serveur de Google, il a donc eu besoin d'un peu de temps pour recevoir une réponse. J'ai utilisé usleep(500000)
pour donner tout le temps nécessaire.
Je ne l'utiliserais généralement pas pour servir des pages web, mais c'est utile pour les scripts de ligne de commande.
$ready = false;
do {
$ready = some_monitor_function();
sleep(2);
} while (!$ready);
Super vieux messages, mais j'ai pensé que je voudrais commenter aussi bien. J'ai dû récemment vérifier un processus très long qui a créé des fichiers. Donc j'ai fait une fonction qui itère sur une fonction cURL. Si le fichier que je cherche n'existe pas, je dors le fichier php, et je vérifie encore un peu:
function remoteFileExists() {
$curl = curl_init('domain.com/file.ext');
//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);
//do request
$result = curl_exec($curl);
//if request did not fail
if ($result !== false) {
//if request was ok, check response code
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($statusCode == 404) {
sleep(7);
remoteFileExists();
}
else{
echo 'exists';
}
}
curl_close($curl);
}
echo remoteFileExists();
L'une de ses applications est, si j'envoie des mails par un script à plus de 100 clients, alors cette opération prendra un maximum de 1-2 secondes donc la plupart du site comme hotmail et yahoo le considèrent comme du spam, donc pour éviter cela, nous devons utiliser un certain délai d'exécution après chaque courrier.
entre autres: vous testez une application web qui fait des requêtes ayncrones (appels AJAX, chargement d'image paresseux,...)
vous le testez localement donc les réponses sont immédiates puisqu'il n'y a qu'un utilisateur (vous) et pas de latence réseau.
L'utilisation de sleep
vous permet de voir/tester comment l'application web se comporte lorsque la charge et le réseau provoquent des retards sur les requêtes.
un exemple de pseudo-code rapide où vous ne voulez peut-être pas recevoir des millions d'e-mails d'alerte pour un seul événement, mais vous voulez que votre script continue à fonctionner.
if CheckSystemCPU() > 95
SendMeAnEmail()
sleep(1800)
fi
une autre façon de l'utiliser: si vous voulez exécuter un cronjob plus souvent là chaque minute. J'utilise le code suivant:
sleep(30);
include 'cronjob.php';
j'appelle ce fichier, et cronjob.php à chaque minute.
C'est un peu un cas particulier...transfert de fichiers de limitation.
dans un service de transfert de fichiers que nous avons lancé il y a longtemps, les fichiers étaient servis à partir de serveurs de liaison ascendante de 10Mbps. Pour empêcher le réseau de s'enliser, le script de téléchargement a retracé combien d'utilisateurs téléchargeaient à la fois, puis calculé combien d'octets il pouvait envoyer par seconde par utilisateur. Il enverrait une partie de cette quantité, puis dormir un moment (1/4 seconde, je pense) puis envoyer plus...etc.
de cette façon, les serveurs fonctionnaient en continu à environ 9,5 Mbit / s, sans avoir de problèmes de saturation...et toujours ajustant les vitesses de téléchargements.
Je ne le ferais pas de cette façon, ni en PHP, maintenant...mais il a très bien fonctionné à l'époque.