【发布时间】:2012-01-25 14:40:06
【问题描述】:
我找到的这个问题的答案(例如here、here 和here)都涉及pfsockopen(),它似乎适合非本地套接字连接。但是,到目前为止,我编写的代码使用 php 通过本地连接访问 C++ 服务器。我希望这种连接是持久的(顺便说一下,我可以将它用于 Comet)。这是我的非持久版本:
<?php
session_start();
...
if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false)
{
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
$sess_id = $_SESSION['sess_id'];
$sock_str = '/tmp/sockdir/' . $sess_id; //The socket is named after the php session, not important
if (socket_connect($sock, $sock_str) === false)
{
echo "socket_connect() to " . $sock_str . " failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
socket_close($sock);
exit();
}
$msg = $_GET['message'];
// ... do things with $msg
socket_close($sock);
?>
我发现,现在我不能简单地将“$sock”保存为 $_SESSION 变量并在每次调用此脚本时简单地访问它。关于如何将其转变为持久连接的任何提示?
【问题讨论】:
-
这里的问题是请求是有状态的——当请求处于活动状态时,您的 php 应用程序仅在内存中运行。为什么需要持久连接?
-
@tkone 我需要网页来响应服务器生成的消息,而不依赖于特定的客户端请求。这通常是抢手的功能,例如here;这些也称为服务器端事件。
-
所以您正在寻找 websockets? “页面”需要做什么?这是否意味着页面,因为它已加载到客户端上?您是否考虑过使用 socket.io?目前还没有 PHP 服务器实例,但它可能会对您有所帮助。或者只是研究支持 websockets 或 ajax 长轮询等。
-
@tkone 我知道 WebSockets,但我希望能对我已经编写的内容进行修改。安装 WS 服务器(并让它与我的 C++ 后端接口!)将是一项艰巨的任务。长轮询对我来说似乎太过分了,但 sockets.io 看起来很有趣,谢谢你的提示。我也在研究 Node.js。如果我有任何地方,我会保持更新。
-
你总是在最后关闭:
socket_close($sock);。可能这是造成您的问题?
标签: php javascript sockets comet persistent