0

我的 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 页面?

4

4 回答 4

0

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

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

于 2016-11-19T09:14:04.780 回答
0

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

为什么你需要永远奔跑?在其他地方做这项工作不是更好吗,例如开始一个 cronjob?

于 2016-11-19T09:14:21.550 回答
0

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

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

于 2016-11-19T09:14:25.557 回答
0

编辑:从此评论: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);
?>

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

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

<?php
for($i = 0; $i < 5; $i++)
{
    echo $i;
    flush(); // Send processing so far to the browser
    ob_flush(); // For good measure
    sleep(1);
}
于 2016-11-19T09:15:51.457 回答