Я делаю 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).
Может кто-нибудь мне помочь? Благодаря!
pfsockopen () возвращает ресурс. Вы не можете хранить ресурсы в сеансе, поскольку они просто обрабатывают внешние ресурсы, которые могут быть недоступны позже.
Если вы снова запросите одну и ту же страницу, вы можете снова использовать соединение, снова вызвав pfsockopen () с теми же параметрами, но я не думаю, что у вас есть гарантия этого, и, вероятно, это будет непрактично, поскольку для этого вы возможно, требуется одно соединение на сеанс пользователя.
Вы можете запустить фоновые PHP-процессы, которые подключаются к удаленному серверу, а также читать / записывать события в очередь (возможно, базу данных или memcached). Вы должны убедиться, что эти процессы закончены правильно, иначе вы могли бы быстро много сидеть там. Ваш внешний PHP-скрипт может просто читать / записывать из / в очередь.
Проблема, которая у вас есть, действительно основана на том, что HTTP не является апатридом, но служба, к которой вы подключаетесь, является состоятельной. Таким образом, вам нужно как-то поддерживать состояние (для внешнего ресурса) на вашем веб-сервере, что не очень легко сделать с PHP.
Измените это:
$socket2 = pfsockopen($server2[0], (int)$server2[1]); $_SESSION["socket"] = $socket;
для этого!
$socket2 = pfsockopen($server2[0], (int)$server2[1]); $_SESSION["socket"] = $socket2 /* WITH "2" */;
😉
Привет, вы можете создать сервер persistans conx и просто открыть новый conx с установленными параметрами prev в nexus и окончательно использовать js, чтобы сохранить некоторую часть этого .. стиль разработки не важен. Tnks
Мы можем сделать это, написав класс для подключения, чтения, записи и отключения с помощью pfsockopen()
и создания и сохранения объекта этого класса в переменной сеанса. При хранении объекта вы должны сериализовать его, и когда вам это нужно, отсканируйте его. Переменные сеанса могут хранить только строковые данные.