我正在用PHP创建一个MSN客户端.我有这个代码,它连接到服务器并登录到MSN:
$server2 = explode(":", $xfr[3]); $socket2 = pfsockopen($server2[0], (int)$server2[1]); $_SESSION["socket"] = $socket; echo 'Connected to 2nd server.
'; //Send MSNP version fputs($socket2, "VER 0 MSNP10 CVR0\r\n"); echo fread($socket2, 5000) . '
'; //Send user-agent fputs($socket2, "CVR 1 0x0409 php ".phpversion()." i386 MSNMSGR 7.0.0000 MSMSGS ".$_POST["username"]."\r\n"); echo fread($socket2, 5000) . '
'; //Send username fputs($socket2, "USR 2 TWN I ".$_POST["username"]."\r\n"); //Read USR $usr = fread($socket2, 5000); echo $usr . '
'; $usr = explode(" ", $usr);//This is for later usage.
现在我需要在另一个页面中使用这个套接字(AJAX/status.php
).php.net说连接保持可用.但是,这是status.php(只是忽略$ _SESSION ["cid"]),这是通过AJAX调用的:
哪个应该改变状态.我收到此错误:
Warning: fputs(): supplied argument is not a valid stream resource in C:\wamp\apps\msnphp\AJAX\status.php on line 3
Warning: Wrong parameter count for fread() in C:\wamp\apps\msnphp\AJAX\status.php on line 4
我的套接字是持久的,它的id保存在会话变量$ _SESSION ["socket"]中.我不明白为什么它不起作用.
我使用Windows XP Professional SP2作为服务器,使用WAMP(Apache,MySQL和PHP)服务器.
谁能帮我?谢谢!
1> Tom Haigh..:pfsockopen()返回一个资源.您无法在会话中存储资源,因为它们只是外部资源的句柄,以后可能不会存在.
如果你再次请求同一页面,你可以通过使用相同的参数再次调用pfsockopen()来重用连接,但我认为你没有任何保证这一点,并且它可能不适用于你可能希望每个用户会话有一个连接.
您可以启动连接到远程服务器的后台PHP进程,以及将事件读/写到队列中(可能是数据库或memcached).你必须确保这些过程正确终止,否则你很快就会坐在那里.然后,您的前端PHP脚本可以只读/写队列.
您遇到的问题实际上是基于HTTP无状态,但您连接的服务是有状态的.所以你必须以某种方式维护你的web服务器上的状态(对于外部资源),这不是很容易用PHP做的事情.