当前位置:  开发笔记 > 编程语言 > 正文

PHP pfsockopen在一个会话中

如何解决《PHPpfsockopen在一个会话中》经验,为你挑选了1个好方法。

我正在用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做的事情.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有