我目前正在创建一个股市模拟,并在用户登录模拟的那一刻开始工作。我有一个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。将来,我希望它不断更新,直到满足特定条件为止,但是当我更早地设置了无限循环时,HTML就不会加载。
我该怎么做才能使HTML登录后加载,并在后台在MySQL数据库中生成和更新价格,而不会延迟执行任何一项任务?
答案 0 :(得分:0)
您必须在2个网络呼叫中执行此操作。第一个网络调用应获取html。然后,您必须使用Javascript触发另一个调用来更新您的数据。一旦该api调用返回,它将更新html。
答案 1 :(得分:0)
您对基于Web的请求如何工作有基本的误解。
您需要了解的是PHP是一种服务器端语言。 PHP生成HTML,CSS,JavaScript,JSON或所需的任何其他形式的数据的任意组合,并在完成后将其发送到Web浏览器。在执行此操作的同时,它还可以管理数据库中的数据或执行任何其他数量的操作,但是在完成所有设置之前,它永远不会发送Web浏览器可以利用的内容。因此,如果您处于无限循环之内,它将永远不会完成,因此不会有任何内容发送回Web浏览器。
要解决此问题,您需要使用“ 异步JavaScript ”(通常称为“ ajax ”)。具体来说,您首先要在一个请求中向Web浏览器发送一些初始HTML,然后立即终止该请求。这允许用户看到内容而无需无限期地等待。然后,在Web浏览器端,您可以使用JavaScript自动将第二个请求发送到服务器。在对服务器的第二个请求期间,您可以执行数据处理并在完成显示给用户后发送一些数据。
如果您想定期更新显示给用户的内容,那么您将重复第二个请求以刷新显示在用户网页上的内容。
每当您在网站上看到某种“实时”更新时,它并不是来自与Web服务器的单一持久连接,而是一系列重复的,分散的请求,这些请求会定期刷新你明白了。
分解后,标准的Web请求工作流程如下所示:
如您所见,每个系列的请求都是:1)由Web浏览器发起,2)由Web服务器处理,以及3)在Web服务器被处理后,Web浏览器处理来自Web服务器的任何答复。完成了。因此,每个请求都转到browser -> server -> browser
。如果在上面添加步骤7.
,8.
和9.
,我们将看到它们重复完全相同的模式。
如果要避免将JavaScript添加到组合中,而是希望每次都刷新整个页面,则可以缩短数据处理时间。优化数据库调用,修复基础结构(确保服务器和数据库具有LAN连接,硬件足够好,等等),使代码更高效...执行所需的所有操作以保持处理时间最少。
这都是难以置信的简化,并非100%准确,但是希望可以帮助您解决特定问题。所有这些的简短版本是:您不能以现在的处理方式同时显示HTML 和。您需要从根本上改变您的工作流程。
答案 2 :(得分:0)
基于前端的请求频率来管理后台操作的频率的调度模型是一个非常困难的问题。这也是您不需要解决的问题。当没有人看的时候,不需要更改数据。您只需要存储最后一次查看数据的时间,并对较旧的数据应用更大的增量即可。