PHP pfsockopen在一个会话中

时间:2009-07-31 16:11:19

标签: 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说连接保持可用。但是,这是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)服务器。

任何人都可以帮助我吗?谢谢!

4 个答案:

答案 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