PHP脚本在后台运行时未加载HTML
我目前正在创建一个股市模拟,并在用户登录模拟的那一刻工作。我有一个PHP脚本,它将为一家公司生成四次特定的价格,并在运行时将其更新到我的MySQL数据库中。我目前拥有以下代码: PHP:PHP脚本在后台运行时未加载HTML,php,mysql,Php,Mysql,我目前正在创建一个股市模拟,并在用户登录模拟的那一刻工作。我有一个PHP脚本,它将为一家公司生成四次特定的价格,并在运行时将其更新到我的MySQL数据库中。我目前拥有以下代码: PHP: if (isset($_SESSION['userId'])) { $isPlaying = 0; while ($isPlaying <= 3) { $priceTemp = (rand(3300, 3700) / 100); $sql = "UPDATE pricestem
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>';
}
if(isset($\u会话['userId']))
{
$isplay=0;
当($isplay时,您必须在两个网络调用中执行此操作。第一个网络调用应获取html。然后您必须使用Javascript启动另一个调用以更新数据。一旦api调用返回,它将更新html。您对基于web的请求如何工作有一个基本的误解
您需要了解的是,PHP是一种服务器端语言。PHP生成HTML、CSS、JavaScript、JSON或任何其他形式的数据的任意组合,并在完成后将其发送到web浏览器。在此过程中,它还可以管理数据库中的数据或执行任何其他操作,但它永远不会发送在完成所有设置之前,web浏览器可以使用的内容。因此,如果您处于无限循环中,它将永远不会完成,因此不会将任何内容发送回web浏览器
为了解决这个问题,您需要使用“异步JavaScript”,通常称为“ajax”。具体地说,您首先在一个请求中向web浏览器发送一些初始HTML,然后让请求立即结束。这样,用户无需无限期等待即可看到某些内容。然后,在web浏览器端,您可以使用JavaScript自动向服务器发送第二个请求。在第二个请求期间对于服务器,您可以执行数据处理,并在完成向用户显示时发回一些数据
如果要定期更新向用户显示的内容,则需要重复第二个请求以刷新用户网页上显示的内容
每当你在网站上看到某种“实时”更新时,它并不是来自一个单一的、持续打开的web服务器连接——它实际上是一系列重复的、中断的请求,定期刷新你所看到的内容
分解后的标准web请求工作流如下所示:
Web浏览器向Web服务器请求该网页。Web浏览器等待答复
Web服务器生成网页并将网页发送到Web浏览器。Web服务器完成
Web浏览器接收网页并将其显示给用户。Web浏览器停止等待答复
Web浏览器运行它需要运行的任何JavaScript,并从Web服务器请求数据。Web浏览器等待答复
Web服务器处理请求并将请求的数据发送回Web浏览器。Web服务器完成
Web浏览器接收请求的数据并更新网页上的HTML,以便用户可以查看。Web浏览器停止等待答复
如您所见,每个请求系列都是1)由web浏览器启动,2)由web服务器处理,3)在web服务器完成后,web服务器的任何回复都会由web浏览器处理。因此,每个请求都会进入browser->server->browser
。如果我们在上面添加步骤7.
,8.
和9.
,我们将看到它们重复完全相同的模式
如果您希望避免将JavaScript添加到混合中,宁愿每次刷新整个页面,然后保持数据处理简短。优化数据库调用,修复基础设施(确保服务器和数据库具有LAN连接,确保硬件足够好,等等),使您的代码更高效…尽可能缩短处理时间
这一切都非常简单,并非100%准确,但希望能帮助您解决具体问题。这一切的简短版本是:您不能以现在的方式同时显示HTML和处理数据。您需要从根本上改变您的工作流程。管理频率的调度模型基于前端请求频率的后台操作的延迟是一个非常困难的问题。这也是一个您不需要解决的问题。当没有人查看数据时,不需要更改数据。您只需要存储上次查看数据的时间,并对旧数据应用更大的增量。输出缓冲可能有助于注意:mysqli的面向对象接口mysqli
明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql\u查询接口混淆。在您对过程式风格投入过多之前,值得切换。例如:$db=new mysqli(…)
和$db->prepare(“…”)
过程接口是PHP 4时代的产物,当时引入了mysqli
API,理想情况下不应在新代码中使用。感谢您的解释,我现在将阅读Ajax并研究如何创建我需要的请求。