2009-07-31 5 views
3

Je fais un client MSN en PHP. J'ai ce code, qui se connecte à un serveur et se connecte à MSN:PHP pfsockopen dans une session

$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. 

Maintenant je dois utiliser cette prise dans une autre page (AJAX/status.php). php.net dit que la connexion reste disponible. Cependant, cela est status.php (ignorer $ _SESSION [ "cid"]), qui est appelé via AJAX:

<?php 
session_start(); 
fputs($_SESSION["socket"], "CHG 12 " . $_GET["s"] . " " . $_SESSION["cid"], 5000); 
echo fread($_SESSION["socket"]); 

Ce qui devrait changer le statut. Je reçois cette erreur:

<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 /> 

Mon socket est persistant, et il est id est enregistré dans la variable de session $ _SESSION [ "socket"]. Je ne comprends pas pourquoi ça ne marche pas. J'utilise Windows XP Professionnel SP2 comme serveur, avec le serveur WAMP (Apache, MySQL et PHP).

Quelqu'un peut-il m'aider? Merci!

Répondre

5

pfsockopen() renvoie une ressource. Vous ne pouvez pas stocker de ressources dans la session car elles ne traitent que des ressources externes qui ne seront peut-être pas présentes ultérieurement. Si vous demandez à nouveau la même page, vous pouvez réutiliser la connexion en appelant à nouveau pfsockopen() avec les mêmes paramètres, mais je ne pense pas que vous ayez de garantie et cela ne sera probablement pas pratique pour ce que vous voulez probablement une connexion par session d'utilisateur.

Vous pouvez démarrer des processus PHP de fond qui se connectent au serveur distant, et lire/écrire des événements dans une file d'attente (peut-être une base de données ou memcached). Vous devez vous assurer que ces processus sont terminés correctement sinon vous pourriez rapidement vous asseoir là. Votre script PHP frontal peut alors simplement lire/écrire depuis/vers la file d'attente. Le problème que vous avez est vraiment basé sur HTTP étant sans état, mais le service auquel vous vous connectez est en état. Donc, vous devez en quelque sorte maintenir l'état (pour la ressource externe) sur votre serveur web, ce qui n'est pas très facile à faire avec PHP.

0

Nous pouvons le faire en écrivant une classe pour se connecter, lire, écrire & déconnecter en utilisant pfsockopen() et en créant et en stockant l'objet de cette classe dans une variable de session. Lorsque vous stockez l'objet, vous devez le sérialiser et, lorsque vous en avez besoin, le désérialiser. Les variables de session peuvent stocker uniquement des données de chaîne.

0

Salut, vous pouvez créer un serveur persistx conx et juste ouvrir nouveau conx avec les paramètres prev set dans nexus et la finalité utiliser js pour sauver une partie de ce .. le style de développement n'est pas important. tnks

1

Modifier ce:

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

pour cela!

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

;)