PHP:http_get如何工作?

时间:2011-09-20 23:57:45

标签: php httpwebrequest

假设我有一个index.php,我使用某种形式的http get / post操作。这究竟是由服务器执行的?它会在完成执行之前暂停并等待响应吗?怎么回事呢?如果我希望继续执行并在响应到达后执行另一个脚本(如在Ajax中),该怎么办?

启示赞赏。

5 个答案:

答案 0 :(得分:3)

这是一个简单的逻辑问题。


在完成执行之前是否会暂停并等待响应?


如果没有返回什么怎么办?

然后您获得false或空字符串。


如果我希望继续执行并在响应到达后执行另一个脚本(如在Ajax中),该怎么办?

您需要使用libevent(不是为了软心肠 - 比Ajax更难)。

答案 1 :(得分:3)

服务器接收请求(假设它是Apache),它识别有人正在请求.php文件,因此它知道它必须将请求传递给PHP引擎。 PHP引擎接收请求并将标头解析为$ _POST / $ _GET / $ _FILES($ _REQUEST)超全局变量,以便可以使用它。

在此期间执行如下:

客户端从服务器请求资源。 服务器接收它并执行某些工作以返回响应(在这种情况下,它调用PHP引擎)。 PHP引擎完成它必须做的事情并返回一个结果(无论是有效的结果还是解析错误 - 服务器都不关心)。无论如何,如果没有出现任何问题,服务器将返回一个具有相应响应状态代码的响应(2xx,3xx,4xx,5xx,您可能已经知道404)。 一旦Apache从PHP收到响应,脚本就会停止执行。

这不是全双工通信,您可以随时打开插座以用作电话线(想想Skype或任何其他IM)。

在Javascript和异步调用的情况下 - 由于JS是异步语言(它实现了事件循环而不是线程模型),所以指定在响应到达时要执行的回调函数。根据您的需要,您可以向服务器发送另一个请求。

然而,WebSocket协议支持全双工通信,使连接保持打开状态,服务器可以将数据推送到客户端。它需要与Apache / Nginx不同的服务器,例如Node.js或自定义服务器。

答案 2 :(得分:1)

从文档中读取,似乎http_get是一个阻塞调用,即它将冻结您的脚本,直到HTTP事务完成,失败或超时。看起来你不能在非阻塞模式下设置它,PHP没有线程。我不是PHP专家,但我认为没有简单的方法可以继续使用PHP。

除了问题本身,如果我是你,我会真的重新考虑我的选择。我觉得你并没有以正确的方式思考它,因为我很难想象在PHP中执行HTTP GET需要严格的场景。它非常非常罕见。

答案 3 :(得分:1)

除非页面仍然传递给浏览器,否则PHP脚本不会以任何方式继续运行。如果您的浏览器的“正在加载”图标没有旋转,那么PHP已经停止执行。它们运行然后几乎立即终止(对于合理大小的页面)。

当您传递HTTP GET / POST信号时,您将其传递给PHP脚本,但不是已经在运行并等待响应的脚本。这是一个全新的脚本实例,它必须重新分配所有内容,重新包含所有内容,并重新获取数据库中的所有内容,如果您使用的话。

答案 4 :(得分:0)

index.php将立即执行并终止。

如果有一个请求发布到php,php文件将被执行(再次,如果它是index.php)并终止。 您可以使用exec()函数在php文件中执行脚本。