web-dev-qa-db-fra.com

Existe-t-il une fonction similaire à setTimeout () (JavaScript) pour PHP?

La question en quelque sorte dit tout - existe-t-il une fonction qui fait la même chose que la fonction JavaScript setTimeout () for [~ # ~] php [~ # ~] ? J'ai cherché php.net , et je n'arrive pas à en trouver ...

25
Latze

Il n'y a aucun moyen de retarder l'exécution d'une partie du code de dans le script actuel. Cela n'aurait pas beaucoup de sens non plus, car le traitement d'un script PHP a lieu entièrement côté serveur et vous retarderiez simplement l'exécution globale du script. Il y a sleep() mais cela arrêtera simplement le processus pendant un certain temps.

Vous pouvez, bien sûr, planifier un script PHP pour qu'il s'exécute à un moment précis à l'aide de tâches cron et similaires).

11
Pekka 웃

PHP n'est pas piloté par les événements, donc un setTimeout n'a pas beaucoup de sens. Vous pouvez certainement l'imiter et en fait, quelqu'un a écrit un classe Timer que vous pourriez utiliser. Mais je serais prudent avant de commencer à programmer de cette façon côté serveur en PHP.

13
ars

Il y a la fonction sleep , qui interrompt le script pendant une durée déterminée.

Voir aussi usleep , time_nanosleep et time_sleep_until .

11
Artefacto

Pas vraiment, mais vous pouvez essayer la fonction de comptage des ticks .

8
Robin

Quelques choses que je voudrais noter sur les temporisateurs en PHP:

1) Les temporisateurs de PHP ont du sens lorsqu'ils sont utilisés dans des scripts de longue durée (démons et, peut-être, dans des scripts CLI Donc si vous ne développez pas ce type d'application, alors vous n'avez pas besoin de temporisateurs.

2) Les temporisateurs peuvent être bloquants et non bloquants. Si vous utilisez sleep(), alors c'est un temporisateur bloquant, car votre le script se fige juste pendant une durée spécifiée. Pour de nombreuses tâches, les temporisations de blocage sont correctes. Par exemple, envoyer des statistiques toutes les 10 secondes. C'est ok pour bloquer le script:

while (true) {
    sendStat();
    sleep(10);
}

3) Les temporisateurs non bloquants n'ont de sens que dans les applications événementielles , comme websocket-server. Dans de telles applications, un événement peut se produire à tout moment (par exemple, une connexion entrante), vous ne devez donc pas bloquer votre application avec sleep() (évidemment). À cette fin, il existe des bibliothèques de boucles d'événements, telles que reactphp/event-loop , qui vous permettent de gérer plusieurs flux de manière non bloquante et ont également une fonction minuterie/intervalle.

4) Des délais d'expiration non bloquants en PHP sont possibles. Il peut être implémenté au moyen de stream_select() fonction avec paramètre timeout (voir comment il est implémenté dans reactphp/event-loop StreamSelectLoop :: run () ).

5) Il existe des extensions PHP comme libevent, libev, event qui permet l'implémentation des timers (si vous voulez aller hardcore)

7
AlexM

Attention: Vous devez noter que bien que la commande sleep puisse faire bloquer un processus PHP ou "sleep" pendant une durée donnée, vous 'implémenterait généralement des retards visuels dans l'interface utilisateur.

Étant donné que PHP est un langage côté serveur, il suffit d'écrire sa sortie d'exécution (généralement sous la forme de HTML) dans une réponse de serveur Web: l'utilisation de sleep de cette manière ne fera généralement que retarder ou retarder la réponse.

Cela dit, le sommeil a des objectifs pratiques. Le retard de l'exécution peut être utilisé pour implémenter des schémas de désactivation, comme lors d'une nouvelle tentative de requête après une connexion défaillante. De manière générale, si vous devez utiliser un setTimeout en PHP, vous faites probablement quelque chose de mal.

Solution: Pour répondre à votre question de manière explicite: Puisque setTimeout possède deux paramètres, l'un qui représente la fonction à exécuter et l'autre qui représente la durée (en millisecondes). Le code suivant répondrait en fait aux exigences fonctionnelles de votre question:

<?php
// Build the setTimeout function.
// This is the important part.
function setTimeout($fn, $timeout){
    // sleep for $timeout milliseconds.
    sleep(($timeout/1000));
    $fn();
}

// Some example function we want to run.
function someFunctionToExecute(){
    echo 'The function executed!';
}

// This will run the function after a 3 second sleep =>
// We're using an anonymous function to wrap the function
// which we wish to execute.
setTimeout(function(){
   someFunctionToExecute();
}, 3000);
?>

La sortie du code ci-dessus aura un délai de trois secondes, suivi de la sortie suivante:

La fonction exécutée!

3
Joseph Orlando

http://php.net/manual/en/class.evtimer.php est probablement ce que vous recherchez, vous pouvez avoir une fonction appelée pendant les intervalles définis, similaire à setInterval en javascript. c'est une extension pecl, si vous avez whm/cpanel vous pouvez facilement l'installer via la page d'installation du logiciel/extension pecl.

je n'avais pas remarqué que cette question date de 2010 et la classe evtimer a commencé à être codée en 2012-2013. Donc, en tant que mise à jour d'une ancienne question, il existe maintenant une classe qui peut le faire de la même manière que javascripts settimeout/setinterval.

3
Masu

si vous devez effectuer une action après avoir exécuté du code php, vous pouvez le faire avec un écho

 echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>";

donc après un certain temps dans le client (navigateur) vous pouvez faire autre chose, comme une redirection vers un autre script php par exemple ou faire écho à une alerte

2
Geomorillo