web-dev-qa-db-fra.com

Quelle est une utilisation pratique de sleep () de PHP?

Je viens de jeter un œil aux documents sur sleep() .

Où utiliseriez-vous cette fonction?

Est-ce là pour donner au CPU une pause dans une fonction coûteuse?

Des pièges courants?

49
alex

Un endroit où il trouve son utilité est de créer un délai.

Disons que vous avez construit un robot 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 demandes consécutives.

sleep prend l'argument en quelques secondes, son ami usleep prend les arguments en microsecondes et est plus approprié dans certains cas.

47
codaddict

Un autre exemple: vous exécutez une sorte de processus par lots qui fait un usage intensif d'une ressource. Peut-être que vous parcourez la base de données de 9 millions de titres de livres et mettez à jour environ 10% d'entre eux. Ce processus doit s'exécuter au milieu de la journée, mais il y a tellement de mises à jour à effectuer que l'exécution de votre programme de commandes entraîne le serveur de base de données vers une analyse pour les autres utilisateurs.

Vous modifiez donc le processus par lots pour envoyer, disons, 1000 mises à jour, puis sleep pendant 5 secondes pour donner au serveur de base de données une chance de terminer le traitement des demandes des autres utilisateurs qui ont sauvegardé.

27
Andy Lester

Voici un extrait de la façon dont j'utilise sleep dans l'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, car j'envoie trop de demandes au serveur.

23
Mischa

Vieille question, je sais, mais une autre raison d'utiliser u/sleep peut être lorsque vous écrivez du code de sécurité/cryptographie, tel qu'un script d'authentification. Quelques exemples:

  1. Vous souhaiterez peut-être réduire l'efficacité d'une attaque potentielle par force brute en ralentissant délibérément votre script de connexion, en particulier après quelques tentatives infructueuses.
  2. Vous pouvez également souhaiter ajouter un délai artificiel pendant le cryptage pour atténuer les attaques temporelles . Je sais que les chances sont minces que vous allez écrire un tel code de cryptage approfondi 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 synchronisation, vous avez juste besoin de plus d'échantillons pour filtrer le bruit ajouté par u/sleep.

Vous pouvez trouver plus d'informations sur ce sujet dans: n sommeil aléatoire pourrait-il empêcher les attaques de synchronisation?

9
Angry Dan

J'ai dû l'utiliser récemment lorsque j'utilisais l'API de géolocalisation de Google. Chaque adresse dans une boucle devait appeler le serveur de Google, il a donc fallu un peu de temps pour recevoir une réponse. J'ai utilisé usleep(500000) pour donner suffisamment de temps à tout ce qui est impliqué.

1
hohner

Super vieux messages, mais j'ai pensé que je commenterais aussi. J'ai récemment dû vérifier un processus très long qui a créé certains fichiers. J'ai donc créé une fonction qui itère sur une fonction cURL. Si le fichier que je recherche n'existe pas, je dors le fichier php et vérifie à nouveau 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();
1
David

Une autre façon de l'utiliser: si vous souhaitez exécuter un cronjob plus souvent à chaque minute. J'utilise le code suivant pour cela:

sleep(30);
include 'cronjob.php';

J'appelle ce fichier et cronjob.php chaque minute.

1
Tom

Vous pouvez utiliser sleep pour suspendre l'exécution du script ... par exemple pour retarder un appel [~ # ~] ajax [~ # ~] côté serveur ou mettre en place un observateur. Vous pouvez également l'utiliser pour simuler des retards.

Je l'utilise également pour retarder sendmail () & co. .

Quelqu'un utilise use sleep () pour empêcher le DoS et les brutefoces de connexion, je ne suis pas d'accord car vous devez ajouter quelques vérifications pour empêcher l'utilisateur de s'exécuter plusieurs fois.

Vérifiez également sleep .

1
Fabio Mora

Je ne l'utilise 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);
1
Octopus

C'est un peu un cas étrange ... limitation du transfert de fichiers.

Dans un service de transfert de fichiers que nous avons exécuté il y a longtemps, les fichiers étaient servis à partir de serveurs de liaison montante de 10 Mbps. Pour empêcher le réseau de s'enliser, le script de téléchargement a suivi le nombre d'utilisateurs téléchargeant à la fois, puis a calculé le nombre d'octets qu'il pouvait envoyer par seconde par utilisateur. Cela enverrait une partie de ce montant, puis dormirait un instant (1/4 seconde, je pense) puis en enverrait plus ... etc.

De cette façon, les serveurs fonctionnaient en continu à environ 9,5 Mbps, sans problème de saturation de liaison montante ... et ajustaient toujours dynamiquement les vitesses de téléchargement.

Je ne le ferais pas de cette façon, ni en PHP, maintenant ... mais cela fonctionnait très bien à l'époque.

1
XediDC

L'une de ses applications est que si j'envoie des e-mails par script à plus de 100 clients, cette opération prendra au maximum 1-2 secondes, donc la plupart des sites Web comme hotmail et yahoo le considèrent comme du spam, donc pour éviter cela, nous devons utiliser un certain retard dans l'exécution après chaque courrier.

0
HARISH THAKUR

Entre autres: vous testez une application web qui fait des requêtes ayncrones (appels AJAX, chargement d'images paresseuses, ...)

Vous le testez localement afin que les réponses soient immédiates car il n'y a qu'un seul utilisateur (vous) et aucune latence réseau.

L'utilisation de sleep vous permet de voir/tester le comportement de l'application Web lorsque le chargement et le réseau entraînent un retard sur les demandes.

0
Paolo

Un exemple de pseudo-code rapide où vous ne souhaitez peut-être pas recevoir des millions d'e-mails d'alerte pour un seul événement, mais vous souhaitez que votre script continue de fonctionner.

  if CheckSystemCPU() > 95  
        SendMeAnEmail()
        sleep(1800)
  fi
0
Mike Q