我目前正在创建股票市场模拟,并在用户登录模拟时进行工作。我有一个 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 数据库中生成和更新价格,而不会延迟这些任务的发生?
最佳答案
您对基于网络的请求的工作原理存在根本性的误解。
您需要了解的是,PHP 是一种服务器端语言。 PHP 生成 HTML、CSS、JavaScript、JSON 或您想要的任何其他形式的数据的任意组合,并在完成后将其发送到您的 Web 浏览器。在执行此操作的同时,它还可以管理数据库中的数据或执行任何其他数量的操作,但在完成所有设置之前,它永远不会发送 Web 浏览器可以使用的内容。因此,如果您处于无限循环中,它将永远不会完成,因此不会将任何内容发送回网络浏览器。
要解决这个问题,您需要使用称为“异步 JavaScript”的东西,通常称为“ajax”。具体来说,您首先在一个请求中向 Web 浏览器发送一些初始 HTML,然后让请求立即结束。这使得用户无需无限期等待即可查看某些内容。然后,在 Web 浏览器端,您可以使用 JavaScript 自动向服务器发送第二个请求。在向服务器发送第二个请求期间,您可以执行数据处理并在完成向用户显示后发回一些数据。
如果您想定期更新向用户显示的内容,那么您可以重复第二个请求来刷新用户网页上显示的内容。
任何时候您在网站上看到某种“实时”更新,它都不是来自与 Web 服务器的单个、持续打开的连接,它实际上是一系列重复的、分散的请求,这些请求会定期刷新内容你看。
<小时/>分解后的标准 Web 请求工作流程如下所示:
- 网络浏览器向网络服务器请求网页。 Web 浏览器等待回复。
- 网络服务器生成网页并将网页发送到网络浏览器。 Web 服务器已完成。
- 网络浏览器接收网页并将其显示给用户。 Web 浏览器停止等待回复。
- Web 浏览器运行其运行所需的任何 JavaScript,并向 Web 服务器请求数据。 Web 浏览器等待回复。
- Web 服务器处理请求并将请求的数据发送回 Web 浏览器。 Web 服务器已完成。
- 网络浏览器接收请求的数据并更新网页上的 HTML,以便用户可以看到它。 Web 浏览器停止等待回复。
正如您所看到的,每一系列请求都是 1) 由 Web 浏览器发起,2) 由 Web 服务器处理,3) 在 Web 服务器响应后,由 Web 浏览器处理来自 Web 服务器的任何回复。完成了。因此,每个请求都会经过浏览器 -> 服务器 -> 浏览器
。如果我们在上面添加步骤 7.
、8.
和 9.
,我们将看到它们重复完全相同的模式。
如果您想避免添加 JavaScript,更愿意每次都刷新整个页面,那么请保持数据处理简短。优化你的数据库调用,修复你的基础设施(确保你的服务器和数据库有 LAN 连接,你的硬件足够好,等等),让你的代码更高效......做任何你需要做的事情来保持处理时间最小化。
<小时/>这一切都非常简单,并不是 100% 准确,但希望可以帮助您解决具体问题。所有这一切的简短版本是:您无法按照现在的方式同时显示 HTML 和处理数据。您需要从根本上改变您的工作流程。
关于php - PHP 脚本在后台运行时 HTML 未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54582184/