我正在尝试创建一个每秒更新一次的 php 函数,使用 php 本身,没有其他语言,只是纯 PHP 代码。
function exp(){
//do something
}
我希望它每秒返回一个值。就像每秒更新一样。
对于应用程序服务器(不是 Web 服务器),最佳实践是使用事件循环模式而不是睡眠。这使您能够在需要时运行多个计时器(睡眠会阻塞,因此同时无法运行其他任何东西)。另一方面,Web 服务器不应该真正执行任何长时间运行的脚本。
虽然其他语言为您提供了开箱即用的事件循环(例如,node / js,带有 setInterval),但 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() 将不是适合该工作的工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)