2016-11-19 38 views
0

我的HTML页面从一个HTML页面将数据发送到PHP脚本,并在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 
} 
?> 

上运行

<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脚本处于永久while循环中。如果我从我的HTML页面发布一些数据,我的PHP脚本正在做其他事情(这需要花费很多时间),并且不一定要处理检查HTML页面变量是否设置的行。所以,即使我从HTML页面发布了一些内容,由于发布数据和PHP脚本在isset行之间持续时间较长,我的PHP脚本无法获取数据。

是否有任何时间限制,我需要从HTML页面发布的PHP脚本中获取变量?有没有更好的方法来做到这一点?

另外,发布后,我的HTML页面一直在等待我的PHP脚本作出响应。有没有办法停止加载我的HTML页面?

+0

为什么你有一个while循环?你认为这有什么好处。这个while循环会运行“无限”,因为1永远是真的 – Mart

+0

'我的PHP脚本永远处于while循环中。“什么?那不适用于这种方式。事情你需要一个web.socket为这个http://stackoverflow.com/questions/7160899/websocket-client-in-php和ajax后形式 – JOUM

+0

你真的把它放在一个'永远while循环'通过使用while (1)'。 –

回答

0

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

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

0

问题是每次调用只能获得一次HTTP参数。如果你创建一个无限循环,你将不会得到服务器的响应。 即使您的参数不会更改,因为每次请求时都会分别调用PHP脚本。

为什么你需要永远运行?是不是好做的工作别处e.g开始一个cronjob?

+0

由于正在执行的处理,我无法重新启动我的脚本。如果我使用cronjob,每次我的脚本都不会从头开始?它会重新初始化所有变量(我没有在这里显示),我不想要 – SMG

+0

您可以将变量存储在文件或数据库中,并在执行脚本时再次读取它们。例如,您可以简单地使用序列化功能:http://php.net/manual/de/function.serialize.php – CHF

+0

是的,它每次都会从头开始。您必须先处理它才能加载内容,然后继续您想要的内容。脚本的问题在于,每次有人打电话给你的页面时,脚本也会从头开始。所以你必须以某种方式序列化和反序列化你的数据。 - 那么你有可能继续任何你想要的。 – CHF

0

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

但是你为什么想要这个循环下去,目前尚不清楚。 你而1循环将始终注明真实,为此运行“无限” 这无边但是是有限的。 (见上面的链接)

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。看起来,如果你想创建一个循环,将让“听”的POST值从HTML表单来通过,如果你正在编写一个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); 
}