使用 php curl 进行长轮询

Posted

技术标签:

【中文标题】使用 php curl 进行长轮询【英文标题】:Long polling with php curl 【发布时间】:2015-10-02 04:42:51 【问题描述】:

我正在关注 this example 使用 HTTP 长轮询的 Spring MVC 聊天客户端。

我的网络服务器位于端口 7555,我需要能够从端口 80(浏览器)向端口 7555 发出 HTTP 长轮询请求,因此我创建了一个调用我的网络服务的 php 脚本。

<?php
$index = $_GET["index"];
echo $index;
echo $index2;

$urlVar = "http://localhost:7555/test?" . $index . $index2;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlVar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PORT, 7305);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_exec($ch)
?>

我从我的 javascript 中调用这个 PHP 文件,参数如下:

($.ajax(
    url : "http://localhost/myphpscript.php?index=" + i, 
    type : "GET", 
    cache: false,
    success : function(messages) 
       //do stuff
    
));

PHP 文件位于我的本地主机中。这似乎不起作用,因为 JavaScript 似乎无休止地调用 PHP(调用 URL)。我是否使用 PHP curl 正确进行长轮询?由于我是 curl 中的 HTTP 调用,是否需要在 JavaScript 中进行 Ajax 调用?

【问题讨论】:

您的 URL 中的端口与 cURL 中调用的端口不同。 你设置了 RETURNTRANSFER 但你没有看到结果!? echo curl_exec($ch) 不见了。 【参考方案1】:

使用CURLOPT_RETURNTRANSFER,您需要回显curl_exec($ch) 的结果

echo curl_exec($ch);

【讨论】:

【参考方案2】:

因为不允许发送cross site requests(这也适用于端口),所以你需要做这个 PHP relais 事情。

永远不会少。一遍又一遍地请求相同的请求(轮询)几乎是正确的,但是您的 Web 服务应该保持连接打开,直到它有一些新信息或请求超时(长轮询)。

你的网络服务返回什么(Http-Status ok?任何内容?)

【讨论】:

它不会长时间轮询,它只是在无限循环中一遍又一遍地调用服务器。是否按预期工作只是一遍又一遍地调用php(调用服务器) 所以你说是你的JS有问题?但是,请使用完整的 JS 代码更新您的问题。据我了解长轮询:JS 查询您的 PHP 查询您的 web 服务。该网络服务使您与 PHP/Apache 服务器的连接保持打开状态,然后使他的连接对您的浏览器请求保持打开状态。所以它一遍又一遍地调用(快速)的唯一原因是,这条链中的某个人没有保持他的连接打开。

以上是关于使用 php curl 进行长轮询的主要内容,如果未能解决你的问题,请参考以下文章

轮询长轮询长连接的区别

使用 Httpclient 进行长轮询

轮询长轮询长连接socket连接WebSocket

轮询长轮询长连接socket连接WebSocket

Comet,使用 jquery 教程进行长轮询 [关闭]

短连接长连接和短轮询长轮询