我正在用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说连接保持可用。但是,这是status.php(只是忽略$ _SESSION [“cid”]),这是通过AJAX调用的:
<?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 [“socket”]中。我不明白为什么它不起作用。
我使用Windows XP Professional SP2作为服务器,使用WAMP(Apache,MySQL和PHP)服务器。
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:5)
pfsockopen()返回一个资源。您无法在会话中存储资源,因为它们只是外部资源的句柄,以后可能不会存在。
如果再次请求同一页面,您可以通过使用相同的参数再次调用pfsockopen()来重用连接,但我认为您对此没有任何保证,并且它可能不实用为此,您可能希望每个用户会话有一个连接。
您可以启动连接到远程服务器的后台PHP进程,以及将事件读/写到队列中(可能是数据库或memcached)。你必须确保这些过程正确终止,否则你很快就会坐在那里。然后,您的前端PHP脚本可以只读/写队列。
您遇到的问题实际上是基于HTTP无状态,但您连接的服务是有状态的。因此,您必须以某种方式维护Web服务器上的状态(对于外部资源),这对于PHP来说并不容易。
答案 1 :(得分:1)
改变这个:
$socket2 = pfsockopen($server2[0], (int)$server2[1]);
$_SESSION["socket"] = $socket;
为此!
$socket2 = pfsockopen($server2[0], (int)$server2[1]);
$_SESSION["socket"] = $socket2 /* WITH "2" */;
)
答案 2 :(得分:0)
我们可以通过写一个连接,读,写和类的类来做到这一点。使用pfsockopen()
断开连接,并在会话变量中创建和存储该类的对象。存储对象时,必须将其序列化,并在需要时将其反序列化。会话变量只能存储字符串数据。
答案 3 :(得分:0)
您好,你可以创建一个服务器persistans conx,只需打开新的conx与nexus和finality中的prev设置参数使用js来节省一些这个.. 发展方式并不重要。 TNKS