将数据从 HTML 页面发送到 PHP 脚本并在 PHP 中选取数据

Posted

技术标签:

【中文标题】将数据从 HTML 页面发送到 PHP 脚本并在 PHP 中选取数据【英文标题】:Sending data from a HTML page to a PHP script and picking the data in PHP 【发布时间】:2016-11-19 09:07:28 【问题描述】:

我的 HTML 页面

<html>
<body>
<form action="myScript.php" method="POST">
    Enter a transceiver ID:
    <br><br>
    <input type="text" name="id" >
    <br><br>
    <input type="submit" value="Submit">
</form>
</body>

我的 PHP 脚本正在我的服务器上运行

<?php
$id_array = array("101");
while(1)

    if (isset($_POST['id']))
     
        $id = $_POST['id'];
        echo ("ID is ".$id."\n");
        array_push($transceiverID_array, $id);
    
    print_r($id_array);
    usleep(5000000);
    // lot of processing will be done 

?>

我的 PHP 脚本处于一个永远的 while 循环中。如果我从我的 HTML 页面发布一些数据,我的 PHP 脚本正在做其他事情(这需要相当多的时间),而不一定要处理它正在检查是否设置了来自 HTML 页面的变量的行。因此,即使我从我的 HTML 页面发布了一些内容,由于发布数据和 PHP 脚本在 isset 行上的持续时间很长,我的 PHP 脚本也无法获取数据。

我需要在从 HTML 页面发布的 PHP 脚本中获取变量是否有任何时间限制?有没有更好的方法呢?

此外,在发布后,我的 HTML 页面一直在等待我的 PHP 脚本响应。有什么方法可以停止加载我的 HTML 页面?

【问题讨论】:

为什么会有一个while循环?你认为它有什么好处。这个 while 循环将运行“无限”,因为 1 永远为真 My PHP script is in a forever while loop. 什么?那是行不通的。你需要一个 web.socket 用于 ***.com/questions/7160899/websocket-client-in-php 和表单中的 ajax 帖子 您实际上是使用while(1) 将其置于“永远的while 循环”中。 是的,我需要它永远运行。我做错了吗? 我认为是因为你在第一次发帖后让它休眠了 5 分钟 【参考方案1】:

正如其他评论员所问的那样。无限循环有什么意义?服务器将代表您完成侦听请求的任务!

HTML 页面没有收到任何内容是很自然的,因为您的 PHP 脚本中的流程永远不会结束。删除该循环并尝试请求。

【讨论】:

【参考方案2】:

问题是每次调用只能获取一次 HTTP 参数。如果您创建一个无限循环,您将不会从服务器获得响应。 甚至您的参数也不会改变,因为您每次发出请求时都会单独调用 PHP 脚本。

为什么需要永远运行?在其他地方完成工作不是更好吗,例如开始一个 cronjob?

【讨论】:

由于正在执行的处理,我无法重新启动我的脚本。如果我使用 cronjob,我的脚本不是每次都从头开始吗?它将重新初始化所有我不想要的变量(我没有在这里显示) 您可以将变量存储在文件或数据库中,并在执行脚本时再次读取。例如,您可以简单地使用序列化函数:php.net/manual/de/function.serialize.php 是的,它每次都会从头开始。您必须先处理它才能加载内容,然后从您希望它开始的地方继续。您的脚本的问题是每次有人调用您的页面时,脚本也会从头开始。所以你必须以某种方式序列化和反序列化你的数据。 - 然后你就可以在任何你想要的地方继续。 你认为使用nodeJS代替PHP,连续做某事会更好吗? 我对nodeJS了解不多。但是目前您的 HTTP 协议有问题。浏览器请求数据,您必须将其带回客户端。此请求应尽快得到答复。所以在这里无限循环不是个好主意。要处理数据,您需要后台工作人员之类的东西。这可能是一个 cron 脚本、一些 JS 代码(在 nodeJS 的情况下),或者如果您使用其中一种技术,甚至可以永远运行 java 或 c# 代码。为了通知用户,我会使用客户端代码和 Websockets 或 AJAX 请求。您必须过度考虑您的工作人员代码。【参考方案3】:

您的 php 确实有时间限制: http://php.net/manual/en/function.set-time-limit.php

但是,尚不清楚您为什么希望它永远循环。 您的 while 1 循环将始终声明为 true,因此“无限”运行 然而,这个无限是有限的。 (见上面的链接)

【讨论】:

【参考方案4】:

编辑:来自此评论:I cannot restart my script due to the processing that it is doing. If I use a cronjob, won't my script start from the beginning every time? It will re-initialize all the variables (which I did not show here), which I do not want

我不确定单独使用 PHP 是否足以实现您想要的。您需要考虑一个持久层(内存、数据库)以使您的变量在多个请求中保持活动状态。 while(1) 不是你这样做的方式。


通过阅读您的帖子,听起来您对 HTTP/PHP 有误解。看起来好像您正在尝试创建一个循环,该循环将继续“侦听”来自 HTML 表单的 POST 值,就好像您正在编写 Web 服务器本身或其他东西一样。

HTTP 不是这样工作的。

客户端将发出 GET 请求以获取您的 HTML,然后您的脚本结束。 然后,客户端将使用数据发出 POST 请求,您的脚本对其进行处理然后结束。

这种情况每次都会发生,您的脚本将在它收到的每组 POST 值中运行一次。请注意,您的 HTML 不是“等待”,您的 HTML 在 GET 请求中已“完成”,您的浏览器现在正在向您的 PHP 脚本发出请求,并且在您有输出之前,它不会显示任何内容。

现在,你说这是一个长期运行的过程,你不在乎,即。即发即弃,你说你不这样做在这种情况下,最好简单地使用一个你可以触发而不关心响应的 AJAX 请求。另一种选择是向 iFrame 或类似的发起请求。

无论哪种方式,删除 while 循环都可以让您验证您的请求是否正在通过,如下所示:

<?php
    $id_array = array("101");
    if (isset($_POST['id']))
     
        $id = $_POST['id'];
        echo ("ID is ".$id."\n");
        array_push($transceiverID_array, $id);
    
    print_r($id_array);
?>

如果您想向浏览器提供反馈,您尝试做的一个选项是随时将内容刷新到浏览器。

尝试 POST 到这个脚本,看看会发生什么:

<?php
for($i = 0; $i < 5; $i++)

    echo $i;
    flush(); // Send processing so far to the browser
    ob_flush(); // For good measure
    sleep(1);

【讨论】:

以上是关于将数据从 HTML 页面发送到 PHP 脚本并在 PHP 中选取数据的主要内容,如果未能解决你的问题,请参考以下文章

在获取数据时将变量发送到 PHP 脚本

将数据从 PHP 脚本发送到 iOS

通过 PHP 脚本将数据从 Arduino 发送到数据库的问题

Chrome 扩展如何将数据从内容脚本发送到 popup.html

动态 jQuery PHP 表单不会将 POST 数据发送到 PHP var

将数据从下拉菜单提交到mysql而不刷新页面