PHP pfsockopen в сеансе - PullRequest
3 голосов
/ 31 июля 2009

Я делаю MSN-клиент на PHP. У меня есть этот код, который подключается к серверу и входит в 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 />

Мой сокет является постоянным, и его идентификатор сохраняется в переменной сеанса $ _SESSION ["socket"]. Я не понимаю, почему это не работает.

Я использую Windows XP Professional SP2 в качестве сервера с сервером WAMP (Apache, MySQL и PHP).

Кто-нибудь может мне помочь? Спасибо!

Ответы [ 4 ]

5 голосов
/ 31 июля 2009

pfsockopen () возвращает ресурс. Вы не можете хранить ресурсы в сеансе, так как они являются просто дескрипторами для внешних ресурсов, которых может не быть позже.

Если вы снова запросите ту же страницу, вы можете повторно использовать соединение, снова вызвав pfsockopen () с теми же параметрами, но я не думаю, что у вас есть какие-либо гарантии на это, и, вероятно, это не будет практичным для этого вам, вероятно, понадобится одно соединение на пользовательский сеанс.

Вы можете запускать фоновые процессы PHP, которые подключаются к удаленному серверу, и читать / записывать события в очередь (возможно, базу данных или memcached). Вы должны убедиться, что эти процессы завершены должным образом, иначе вы могли бы очень много сидеть там. Ваш интерфейсный PHP-скрипт может просто читать / записывать из / в очередь.

Проблема, с которой вы столкнулись, на самом деле основана на том, что HTTP не имеет состояния, но служба, к которой вы подключаетесь, имеет состояние. Таким образом, вы должны каким-то образом поддерживать состояние (для внешнего ресурса) на своем веб-сервере, что не очень легко сделать с помощью PHP.

1 голос
/ 16 сентября 2011

Изменить это:

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

за это!

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

;)

0 голосов
/ 21 июня 2010

Привет, вы можете создать conx для персистентного сервера и просто открыть новый conx с предварительно установленными параметрами в нексусе, а окончательность использовать js, чтобы сохранить часть этого .. стиль разработки не важен. Tnks

0 голосов
/ 04 ноября 2009

Мы можем сделать это, написав класс для подключения, чтения, записи и отключения, используя pfsockopen() и создав и сохранив объект этого класса в переменной сеанса. При хранении объекта вы должны его сериализовать, а когда вам понадобится, отменить его сериализацию. Переменные сеанса могут хранить только строковые данные.

...