session 中的 PHP pfsockopen

标签 php session sockets msn

我正在用 PHP 开发一个 MSN 客户端。我有这段代码,它连接到服务器并登录到 MSN:

$server2 = explode(":", $xfr[3]);
$socket2 = pfsockopen($server2[0], (int)$server2[1]);
$_SESSION["socket"] = $socket;
echo '<b>Connected to 2nd server.</b><br />';
//Send MSNP version
fputs($socket2, "VER 0 MSNP10 CVR0\r\n");
echo fread($socket2, 5000) . '<br />';
//Send user-agent
fputs($socket2, "CVR 1 0x0409 php ".phpversion()." i386 MSNMSGR 7.0.0000 MSMSGS ".$_POST["username"]."\r\n");
echo fread($socket2, 5000) . '<br />';
//Send username
fputs($socket2, "USR 2 TWN I ".$_POST["username"]."\r\n");
//Read USR
$usr = fread($socket2, 5000);
echo $usr . '<br />';
$usr = explode(" ", $usr);//This is for later usage.

现在我需要在另一个页面中使用这个套接字 (AJAX/status.php)。 php.net 表示连接保持可用。但是,这是通过 AJAX 调用的 status.php(忽略 $_SESSION["cid"]):

<?php
session_start();
fputs($_SESSION["socket"], "CHG 12 " . $_GET["s"] . " " . $_SESSION["cid"], 5000);
echo fread($_SESSION["socket"]);

哪个应该改变状态。我收到此错误:

<br />
<b>Warning</b>:  fputs(): supplied argument is not a valid stream resource in <b>C:\wamp\apps\msnphp\AJAX\status.php</b> on line <b>3</b><br />
<br />
<b>Warning</b>:  Wrong parameter count for fread() in <b>C:\wamp\apps\msnphp\AJAX\status.php</b> on line <b>4</b><br />

我的套接字是持久的,它的 ID 保存在 session 变量 $_SESSION["socket"] 中。我不明白为什么它不起作用。

我使用 Windows XP Professional SP2 作为服务器,使用 WAMP(Apache、MySQL 和 PHP)服务器。

谁能帮帮我?谢谢!

最佳答案

pfsockopen() 返回一个资源。您不能将资源存储在 Session 中,因为它们只是外部资源的句柄,稍后可能不会存在。

如果您再次请求相同的页面,您可能会通过使用相同的参数再次调用 pfsockopen() 来重用连接,但我认为您对此没有任何保证,而且它可能不实用,因为为此,您可能希望每个用户 session 一个连接。

您可以启动连接到远程服务器的后台 PHP 进程,并将事件读/写到队列(可能是数据库或内存缓存)中。您必须确保这些进程已正确终止,否则您很快就会有很多东西坐在那里。然后,您的前端 PHP 脚本就可以从队列中读取/写入队列。

您遇到的问题实际上是基于 HTTP 是无状态的,但您要连接的服务是有状态的。所以你必须以某种方式在你的网络服务器上维护状态(对于外部资源),这不是用 PHP 很容易做到的事情。

关于 session 中的 PHP pfsockopen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1213464/

相关文章:

php - 使用两个不同的表咨询更多的值组合

php - 产生真实单词的词干提取算法

java - 如何通过同一个套接字发送不同类型的数据

c# - 使用 IPV6 的 UDP 客户端和服务器

c - 在非阻塞套接字连接中,select() 总是返回 1

php - WordPress 插件短代码始终显示在顶部

php - 无论如何,SQlite3是否知道已添加的条目数量?

php - 使用后清除 session 变量

php - 使用 302 重定向/IMG SRC/JSON-P 共享 session 以及对 Google SEO/Pagerank 或其他问题的影响

php - Codeigniter 中的 session 如何工作