Existe-t-il une fonction similaire à setTimeout() (JavaScript) pour PHP?
La question dit tout - y a-t-il une fonction qui fait la même chose que la fonction JavaScript setTimeout() pour PHP? J'ai cherché php.net, et je n'arrive pas à en trouver...
8 réponses
Il N'y a aucun moyen de retarder l'exécution d'une partie du code de dans le script courant. Cela n'aurait pas beaucoup de sens non plus, car le traitement d'un script PHP se déroule entièrement du côté serveur et vous retarderiez simplement l'exécution globale du script. Il y a sleep()
mais cela va simplement arrêter le processus pendant un certain temps.
Vous pouvez, bien sûr, planifier un script PHP à exécuter à un moment précis en utilisant des travaux cron et autres.
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 une classe Timer que vous pourriez utiliser. Mais je serais prudent avant de commencer à programmer de cette manière côté serveur en PHP.
Il y a le sleep
fonction, qui met en pause le script pendant une durée déterminée.
Voir aussi usleep
, time_nanosleep
et time_sleep_until
.
Pas vraiment, mais vous pouvez essayer de la tique fonction count.
Quelques choses que je voudrais noter sur les minuteries en PHP:
1) les minuteries en PHP ont du sens lorsqu'elles sont utilisées 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, vous n'avez pas besoin de minuteries.
2) les minuteries peuvent être bloquantes et non bloquantes. Si vous utilisez sleep()
, alors c'est une minuterie de blocage, car votre script se fige juste pendant un laps de temps spécifié.
Pour de nombreuses tâches, les minuteries de blocage sont très bien. Par exemple, envoyer des statistiques toutes les 10 Secondes. C'est correct de bloquer le script:
while (true) {
sendStat();
sleep(10);
}
3) les minuteries non bloquantes 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 event-loop, comme reactphp / event-loop , qui vous permet de gérer plusieurs flux de manière non bloquante et a également fonction minuterie / intervalle.
4) des délais d'attente non bloquants en PHP sont possibles.
Il peut être mis en œuvre au moyen de stream_select()
fonction avec le paramètre timeout (voir comment il est implémenté dans reactphp/event-loop StreamSelectLoop::run () ).
5) Il y a des extensions PHP comme libevent
, libev
, event
qui permettent l'implémentation des minuteries (si vous voulez aller hardcore)
Attention: vous devez noter que si la commande sleep
peut bloquer un processus PHP, ou "sleep" pendant un temps donné, vous implémentez généralement des retards visuels dans l'interface utilisateur.
Puisque PHP est un langage côté serveur, il suffit d'écrire sa sortie d'exécution (généralement sous forme de HTML) dans une réponse du serveur web: l'utilisation de sleep de cette manière ne fera généralement que retarder ou retarder la réponse.
Cela étant dit, le sommeil a des objectifs pratiques. Retarder l'exécution peut être utilisé pour implémenter des schémas de désactivation, par exemple lors de la réessayer une requête après une connexion échouée. D'une manière générale, si vous avez besoin d'utiliser un setTimeout en PHP, vous faites probablement quelque chose de mal.
Solution: pour répondre explicitement à votre question: puisque setTimeout possède deux paramètres, l'un qui représente la fonction à exécuter, et l'autre qui représente le temps (en millisecondes). Le code suivant rencontrerait en fait le fonctionnel exigences dans 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 sera de trois secondes de retard, suivie par la sortie suivante:
La fonction exécutée!
Si vous avez besoin de faire une action après avoir exécuté du code php, vous pouvez le faire avec un echo
echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>";
Donc, après un temps dans le client(navigateur), vous pouvez faire autre chose, comme une redirection vers un autre script php par exemple, ou l'écho d'une alerte
Http://php.net/manual/en/class.evtimer.php est probablement ce que vous cherchez, 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 que la classe evtimer a commencé à être codée en 2012-2013. donc, en tant que mise à jour d'une ancienne question, il y a maintenant une classe qui peut faire ceci est similaire à javascripts settimeout / setinterval.