我目前正在创建一个模拟股市和我工作的用户登录到模拟的时刻。我有一个PHP脚本,将产生一定的价格为公司的四倍,并更新到我的MySQL数据库运行时。目前,我有以下代码:
PHP:
if (isset($_SESSION['userId']))
{
$isPlaying = 0;
while ($isPlaying <= 3)
{
$priceTemp = (rand(3300, 3700) / 100);
$sql = "UPDATE pricestemp SET price = $priceTemp WHERE companyName = 'Bawden';";
mysqli_query($conn, $sql);
sleep(1);
$isPlaying++;
}
echo '<h1>Welcome to the simulation</h1>';
}
我的目标,这些更新发生在后台一旦用户登录到模拟。当刷新我的数据库每秒钟更新的价格显示这是我的目标之一。不过,我想它做的是仍然加载HTML到页面上(说“欢迎使用模拟”),而更新与每秒的数据库更新的价格。
到目前为止,当我登录,我不得不等待4秒钟,然后HTML载入。在未来,我希望有它consisently更新直到某个条件满足,但是当我设置一个无限循环不会装载早些时候HTML。
我有什么做的,允许HTML加载一次登录并具有生成并与在这些任务发生没有延迟的背景在MySQL数据库中更新的价格?
你的基于Web的请求是如何工作的一个根本性的误解。
什么,你需要明白的是,PHP是一个服务器端语言。 PHP生成HTML,CSS,JavaScript的,JSON,或任何其他形式的你想要的数据的任意组合,当它完成它发送到Web浏览器。虽然它这样做,它也可以在数据库中管理数据或执行的动作任何其他数字,但它绝不会送什么网页浏览器可以使用,直到其完成设置一切。所以,如果你是一个无限循环中,它永远不会结束,因此什么都不会被发送回Web浏览器。
为了解决这个问题,你需要使用一种叫“异步JavaScript的”,更通常被称为“AJAX”。具体来说,首先发送一些初始HTML的Web浏览器中的一个请求,并让请求立即结束。这允许用户看到的东西,而无需等待周围的无限期。然后,在Web浏览器端,你可以使用JavaScript来自动发送第二请求到服务器。在这第二个请求到服务器,您就可以执行数据处理,当你完成,以显示给用户发回的一些数据。
如果要定期更新你显示什么用户,那么你会重复刷新什么是用户的网页上显示的是第二个请求。
任何时候你看到某种形式的“实时”更新在网站上,它不是从一个单一的,持续的开放连接到Web服务器的未来 - 它实际上是一系列的反复,打散要求定期更新你所看到的。
看,标准的Web请求的工作流程是这个样子:
正如你所看到的,每个系列的请求为1)由Web服务器处理的Web浏览器,2)发起,和3)从Web服务器的任何回复Web服务器完成了之后,然后通过Web浏览器来处理。所以,每一个请求会browser -> server -> browser
。如果再加步骤7.
,8.
和9.
上述情况,我们会看到他们重复完全相同的模式。
如果你想避免添加JavaScript混进去,宁愿每次刷新整个页面,然后让你的数据处理短。优化您的数据库调用,修复基础设施(请确保您的服务器和数据库有一个LAN连接,您的硬件是不够好等),使你的代码更加高效......做你需要做的,让处理时间到最低限度。
这是令人难以置信的所有简化,而不是100%准确,但应该有希望帮助您与您的特定问题。所有这一切的短版是:你不能显示你的HTML,并在同一时间处理你的数据,你现在正在做的事情的方式。你需要从根本上改变你的工作流程。
你要做的这2次网络通话。第一次网络调用应该获取的HTML。然后,你必须使用JavaScript火再次调用更新您的数据。一旦API调用返回它会更新HTML。
调度模型来管理基于在前端请求的频率后台操作的频率是一个非常困难的问题。这也是你并不需要解决的一个问题。该数据并不需要更改时没有人看它。你只需要存储时,数据最后看了一眼,并施加更大的增量较旧的数据。