3

PHP で MSN クライアントを作成しています。サーバーに接続して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 は、接続が利用可能なままであると言います。ただし、これは AJAX 経由で呼び出される status.php ($_SESSION["cid"] は無視してください) です。

<?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["socket"] に保存されます。なぜ機能しないのかわかりません。

Windows XP Professional SP2 をサーバーとして使用し、WAMP (Apache、MySQL、および PHP) サーバーを使用しています。

誰でも私を助けることができますか?ありがとう!

4

4 に答える 4

5

pfsockopen() はリソースを返します。リソースは、後で存在しない可能性がある外部リソースへのハンドルに過ぎないため、セッションにリソースを保存することはできません。

同じページを再度リクエストすると、同じパラメーターで pfsockopen() を再度呼び出すことで接続を再利用できる可能性がありますが、これについては保証がないと思います。おそらくこれは実用的ではありません。おそらく、ユーザー セッションごとに 1 つの接続が必要です。

リモートサーバーに接続するバックグラウンド PHP プロセスを開始し、イベントをキュー (データベースまたは memcached など) に読み書きすることができます。これらのプロセスが適切に終了していることを確認する必要があります。フロントエンドの PHP スクリプトは、キューに対して読み書きするだけです。

あなたが抱えている問題は、実際には HTTP がステートレスであることに基づいていますが、接続しているサービスはステートフルです。そのため、何らかの方法で Web サーバー上で (外部リソースの) 状態を維持する必要がありますが、これは PHP で行うのは非常に簡単なことではありません。

于 2009-07-31T16:14:51.380 に答える
1

これを変える:

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

このため!

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

;)

于 2011-09-15T20:04:21.350 に答える
0

こんにちは、サーバーpersistans conxを作成し、nexusの前の設定パラメーターで新しいconxを開くだけで、jsを使用してこの一部を保存できます..開発のスタイルは重要ではありません。Tnks

于 2010-06-21T06:32:57.833 に答える