我正在做一个php函数,它使用php本身每秒更新一次,没有其他语言,只有纯PHP代码。
function exp(){
//do something
}
我希望它每秒返回一个值。喜欢每秒更新一次。
对于应用程序服务器(不是 Web 服务器(,最佳做法是使用事件循环模式而不是睡眠。这使您能够在需要时运行多个计时器(睡眠阻塞,因此在此期间没有其他计时器可以运行(。另一方面,Web 服务器不应该真正执行任何长时间运行的脚本。
虽然其他语言为您提供开箱即用的事件循环(例如,使用 setInterval的 node/js(,但 PHP 没有,因此您必须使用众所周知的库或创建自己的库(。React PHP 是一个广泛使用的 PHP 事件循环。
这是一个事件循环的快速而肮脏的"hello world"实现
define("INTERVAL", 5 ); // 5 seconds
function runIt() { // Your function to run every 5 seconds
echo "something'n";
}
function checkForStopFlag() { // completely optional
// Logic to check for a program-exit flag
// Could be via socket or file etc.
// Return TRUE to stop.
return false;
}
function start() {
$active = true;
$nextTime = microtime(true) + INTERVAL; // Set initial delay
while($active) {
usleep(1000); // optional, if you want to be considerate
if (microtime(true) >= $nextTime) {
runIt();
$nextTime = microtime(true) + INTERVAL;
}
// Do other stuff (you can have as many other timers as you want)
$active = !checkForStopFlag();
}
}
start();
在现实世界中,你会在课堂上用所有的口哨和花里胡哨很好地封装这一点。
关于线程的话:
PHP是单线程的(任何操作系统线程都必须由程序员手动管理,这伴随着显着的学习曲线(。因此,事件循环中的每个任务都将阻止后续任务。另一方面,例如,Node在后台管理操作系统线程,将这种"担忧"从程序员身上带走(这是一个有很多争论的话题(。因此,当你调用setInterval((时,引擎将发挥它的魔力,以便javascript的其余部分将同时运行。
快速结语:可以说,如果你只想让一个函数每 5 秒做一次某事,那么这种模式是矫枉过正的。但是,如果您开始需要并发计时器,sleep(( 将不是适合这项工作的工具。
sleep()
函数是您要查找的函数:
while (true) {
my_function(); // Call your function
sleep(5);
}
- 而循环始终为真
- 在 while 循环中调用函数
- 等待5秒(睡眠(
- 返回循环的开头
顺便说一下,如果你通过Web协议(HTTP,HTTPS等(执行脚本,这不是PHP中无限循环的逻辑用例,因为你会超时。合理的用例可以是定期数据库更新程序或网络爬虫。
此类脚本可以使用命令行执行php myscript.php
或者另一种(但不推荐(方法是使用 set_time_limit 来扩展限制,如果您坚持使用 Web 协议来执行脚本。
function exp(){
//do something
}
while(true){
exp();
sleep(5);
}
使用睡眠功能使执行休眠5秒
如果你使用 setInterval 并使用 ajax 来执行你的操作会更好
$t0 = microtime(true);
$i = 0;
do{
$dt = round(microtime(true)-$t0);
if($dt!= $i){
$i = $dt;
if(($i % 5) == 0) //every 5 seconds
echo $i.PHP_EOL;
}
}while($dt<10); //max execution time
假设 exp(( 是你的函数
function exp(){
//do something
}
现在我们正在开始一个做同时循环
$status=TRUE;
do {
exp(); // Call your function
sleep(5); //wait for 5 sec for next function call
//you can set $status as FALSE if you want get out of this loop.
//if(somecondition){
// $status=FALSE:
//}
} while($status==TRUE); //loop will run infinite
我希望这个对:)有所帮助
在 PHP 中执行此操作不可取,请尝试通过计算从数据库获得的时间与当前时间之间的差异在客户端进行此操作。你可以在JS中做到这一点,就像这样:
setInterval(function(){
// method to be executed;
},5000); // run every 5 seconds