PHP bir oturumda pfsockopen

3 Cevap php

PHP bir MSN istemcisi yapıyorum. Ben MSN için bir sunucu ve günlükleri bağlanır bu kodu var:

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

Şimdi başka bir sayfaya (AJAX/status.php) bu soket kullanmanız gerekir. php.net bağlantı mevcut kalır diyor. Ancak, bu AJAX denir, (sadece ["CID"] $ _SESSION görmezden) status.php olduğunu:

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

Durumu değiştirmek hangi. Ben bu hatayı alıyorum:

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

Benim soket kalıcı olduğunu ve id oturum değişkeni $ _SESSION ["soket"] kaydedilir bulunuyor. Bu işe yaramazsa neden anlamıyorum.

Ben WAMP (Apache, MySQL ve PHP) sunucusu ile, sunucu olarak Windows XP Professional SP2 kullanın.

Herkes bana yardımcı olabilir misiniz? Teşekkürler!

3 Cevap

pfsockopen () bir kaynak verir. Onlar sadece daha sonra orada olmayabilir dış kaynaklara kolları olduğu gibi Oturumunda kaynakları saklayamazsınız.

Eğer tekrar aynı sayfayı talep ederseniz size aynı parametrelerle tekrar) (pfsockopen çağırarak bağlantıyı yeniden alabilirsiniz, ama bu herhangi bir garantisi var sanmıyorum, ve muhtemelen bu gibi pratik olmayacaktır Muhtemelen kullanıcı oturum başına bir bağlantı istiyorum.

Sen uzak sunucuya bağlanmak plan PHP süreçlerini başlatmak ve bir sıra (belki bir veritabanı veya memcached) içine / yazma olayları okuyabilir. Aksi takdirde hızlı bir sürü oturuyor olabilir bu süreçlerin düzgün sonlandırıldı emin olurdu. Ön-uç PHP komut dosyası sonra sadece / gelen kuyruğuna okuma / yazma yapabilirsiniz.

Eğer varsa sorun gerçekten HTTP vatansız olmanın dayanmaktadır, ancak hizmet durum bilgisi olan bağlanıyorsunuz. Yani bir şekilde PHP ile yapmak çok kolay bir şey değil ki, sizin sunucunuza (dış kaynak için) durumunu korumak zorundayız.

Bu değiştirin:

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

Bunun için!

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

;)

Biz, bağlanmak, okumak, yazmak ve bir sınıf yazarak bunu yapabilirsiniz pfsockopen() kullanarak ve bir oturum değişkeni bu sınıfın nesnesi oluşturma ve depolama kesin. Nesneyi saklarken bunu seri hale getirmek gerekir ve ihtiyacınız olduğunda geri unserialize. Oturum değişkenleri yalnızca dize veri saklayabilir.