3

我正在用 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["socket"] 中。我不明白为什么它不起作用。

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

谁能帮我?谢谢!

4

4 回答 4

5

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

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

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

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

于 2009-07-31T16:14:51.380 回答
1

改变这个:

$socket2 = pfsockopen($server2[0], (int)$server2[1]);
$_SESSION["socket"] = $socket;

为了这!

$socket2 = pfsockopen($server2[0], (int)$server2[1]);
$_SESSION["socket"] = $socket2 /* WITH "2" */;

;)

于 2011-09-15T20:04:21.350 回答
0

我们可以通过编写一个类来连接、读取、写入和断开连接,pfsockopen()并在会话变量中创建和存储该类的对象。在存储对象时,您必须对其进行序列化,并在需要时将其反序列化。会话变量只能存储字符串数据。

于 2009-11-04T10:29:52.470 回答
0

嗨,您可以创建一个服务器持久化 conx,只需使用 nexus 中的 prev 设置参数打开新的 conx,finality 使用 js 来保存一些部分......开发风格并不重要。Tnks

于 2010-06-21T06:32:57.833 回答