php - PHP 脚本在后台运行时 HTML 未加载

标签 php mysql

我目前正在创建股票市场模拟,并在用户登录模拟时进行工作。我有一个 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 请求工作流程如下所示:

  1. 网络浏览器向网络服务器请求网页。 Web 浏览器等待回复。
  2. 网络服务器生成网页并将网页发送到网络浏览器。 Web 服务器已完成。
  3. 网络浏览器接收网页并将其显示给用户。 Web 浏览器停止等待回复。
  4. Web 浏览器运行其运行所需的任何 JavaScript,并向 Web 服务器请求数据。 Web 浏览器等待回复。
  5. Web 服务器处理请求并将请求的数据发送回 Web 浏览器。 Web 服务器已完成。
  6. 网络浏览器接收请求的数据并更新网页上的 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/

相关文章:

java - Spring数据查询非常慢

php - 这看起来很愚蠢吗?安全地将2个表单字段插入mysql数据库

mysql - 如何在mysql中用新插入的值计算最后一行的值

php - 如何在 PHP 中的 PHPDocumentor block 中粘贴特殊符号,例如 "*/"?

mysql - 如何使用 App Engine 从 eclipse 连接到 google cloud sql 实例?

mysql - MyISAM 是否有丢失数据的风险?

php - 依次更新mysql中的json结果

php - 如何使用 PHP 条码生成器将条码打印到我想要​​的 pdf 格式页面上?

php - 使用 Joomla 自定义安装程序代码 API 创建存储过程

php - CoreDumpDirectory 不适用于 ubuntu;使用 php 获取段错误