2009-07-31 2 views
3

PHP로 MSN 클라이언트를 만들고 있습니다.세션의 PHP pfsockopen

$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)이 소켓을 사용할 필요가 : 나는 MSN에있는 서버 및 로그에 연결이 코드를 가지고있다. php.net은 연결 상태를 유지한다고 말합니다. 그러나이 status.php이다 AJAX를 통해 호출되는, (단지 [ "CID"] $ _SESSION을 무시) :

<?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 [ "소켓"]에 저장되어 있습니다. 왜 작동하지 않는지 나는 이해하지 못한다.

Windows XP Professional SP2를 WAMP (Apache, MySQL 및 PHP) 서버와 함께 서버로 사용합니다.

아무도 도와 줄 수 있습니까? 감사!

답변

5

pfsockopen()은 리소스를 반환합니다. 나중에있을 수없는 외부 리소스에 대한 처리이기 때문에 세션에 리소스를 저장할 수 없습니다.

같은 페이지를 다시 요청하면 같은 매개 변수로 pfsockopen()을 다시 호출하여 연결을 재사용 할 수 있지만이 문제에 대해서는 아무런 보장이 없다고 생각합니다. 실용적이지는 않을 것입니다 이 경우 사용자 세션 당 하나의 연결이 필요할 것입니다.

당신은 원격 서버에 연결 배경 PHP 프로세스를 시작하고 큐 (어쩌면 데이터베이스 또는 memcached를)로/쓰기 이벤트를 읽을 수 있습니다. 이 프로세스가 제대로 종료되었는지 확인해야합니다. 그렇지 않으면 빠르게 처리 할 수 ​​있습니다. 프론트 엔드 PHP 스크립트는 대기열에서 읽고 쓸 수 있습니다.

당신이 정말로 HTTP에 상태가되고 있지만, 서비스가이 상태 인에 연결을 기반으로이 문제. 그래서 어떻게 든 웹 서버에 (외부 자원을 위해) 상태를 유지해야합니다. 이것은 PHP로는 매우 쉬운 일이 아닙니다.

0

pfsockopen()을 사용하여 연결, 읽기, 쓰기 & 연결을 끊고 해당 클래스의 개체를 만들고 세션 변수에 저장하면됩니다. 객체를 저장하는 동안 직렬화해야하며 필요할 때 다시 직렬화합니다. 세션 변수는 문자열 데이터 만 저장할 수 있습니다.

0

안녕하세요 당신은 서버 persistans conx를 만들 수 있습니다. 그리고 넥서스에있는 이전에 설정된 매개 변수와 새로운 conx를 열면 일부는이 부분을 저장하기 위해 js를 사용합니다. 개발 스타일은 중요하지 않습니다. Tnks

1

변경이 : 이것에 대한

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

!

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

)