我正在用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.
Run Code Online (Sandbox Code Playgroud)
现在我需要在另一个页面中使用这个套接字(AJAX/status.php).php.net说连接保持可用.但是,这是status.php(只是忽略$ _SESSION ["cid"]),这是通过AJAX调用的:
<?php
session_start();
fputs($_SESSION["socket"], "CHG 12 " . $_GET["s"] . " " . $_SESSION["cid"], 5000);
echo fread($_SESSION["socket"]);
Run Code Online (Sandbox Code Playgroud)
哪个应该改变状态.我收到此错误:
<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 />
Run Code Online (Sandbox Code Playgroud)
我的套接字是持久的,它的id保存在会话变量$ _SESSION ["socket"]中.我不明白为什么它不起作用.
我使用Windows XP Professional SP2作为服务器,使用WAMP(Apache,MySQL和PHP)服务器.
谁能帮我?谢谢!
pfsockopen()返回一个资源.您无法在会话中存储资源,因为它们只是外部资源的句柄,以后可能不会存在.
如果你再次请求同一页面,你可以通过使用相同的参数再次调用pfsockopen()来重用连接,但我认为你没有任何保证这一点,并且它可能不适用于你可能希望每个用户会话有一个连接.
您可以启动连接到远程服务器的后台PHP进程,以及将事件读/写到队列中(可能是数据库或memcached).你必须确保这些过程正确终止,否则你很快就会坐在那里.然后,您的前端PHP脚本可以只读/写队列.
您遇到的问题实际上是基于HTTP无状态,但您连接的服务是有状态的.所以你必须以某种方式维护你的web服务器上的状态(对于外部资源),这不是很容易用PHP做的事情.
| 归档时间: |
|
| 查看次数: |
4993 次 |
| 最近记录: |