私はPHPウェブソケットの初心者です。私はデータベースストレージを使ってリアルタイムチャットを作成しようとしています。私はかなりうまくやっていましたが、今は一つの問題に立っています。 user1がuser2にメッセージを送信し、user2が最初にサイトに来たとき(localhosteで最初にリロード)、「リアルタイム」にならないという問題があります。ラツチェットウェブソケットを使ったPHPリアルタイムチャット
さらに詳しく説明します。
ここに私のserver.phpです。それはpracticlyラチェットチュートリアルと同じである:pusher.phpで
$loop = React\EventLoop\Factory::create();
$pusher = new \Pusher();
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
$pull->on('message', array($pusher, 'onBlogEntry'));
$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\IoServer(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new Ratchet\Wamp\WampServer($pusher))), $webSock);
$loop->run();
は(私は他の非重要なものを省略)、これらの方法で最も重要です:私のプレゼンタークラスで
protected $subscribedTopics = array();
protected $myID = array();
public function onSubscribe(ConnectionInterface $conn, $data) {
$this->subscribedTopics[json_decode($data)->teamID] = $data;
$this->myID[json_decode($data)->userID] = $data;
}
public function onBlogEntry($entry) {
$entryData = json_decode($entry, true);
if ((!array_key_exists($entryData['team_id'], $this->subscribedTopics)) ||
(!array_key_exists($entryData['to_user_id'], $this->myID))
) {
return;
}
$teamID = $this->subscribedTopics[$entryData['team_id']];
$teamID->broadcast($entryData);
}
私は単純な形をしています。ユーザーがこのフォームを送信すると、このコードは次のとおりです。私の問題に戻って、だから、
var myJSON = '{'
+ '"teamID" : {$teamId},' //this I get from the presenter
+ '"userID" : {$userId}' //this I get from the presenter
+ '}';
var conn = new ab.Session('ws://localhost:8080',
function() {
conn.subscribe(myJSON, function(topic, data) {
if (data.from_user_id == mypartnerIdA) {
//here I edit the DOM
}
});
},
function() {
console.warn('WebSocket connection closed');
},
{'skipSubprotocolCheck': true}
);
:
$this->chatPartner = $values['to_user_id']; //this I get from the form
$this->redrawControl('msg'); //here I redraw my layout
$this->messages_model->addMessage($values); //here I send data to database
$context = new \ZMQContext();
$socket = $context->getSocket(\ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($values));
その後、ビューに私はこのJavaScriptコードを持っています。私は2人のユーザーをシミュレートします。 User1はこのページを再読み込みします。ここではjavascript接続が最初にあります。 User2は彼の後にこのページをリロードします。 User1がuser2にメッセージを送信すると、メッセージはすぐに(リアルタイム)表示されます。しかし、user2がuser1にメッセージを送信すると、このメッセージはすぐには表示されません。このメッセージは、次のページの再読み込み後にのみ表示されます。
私の質問はです - これを修正するにはどうすればよいですか? user2のメッセージをリアルタイムで作成するにはどうすればいいですか?このコードを修正するにはどうしたらいいですか?
男、ありがとう、私は信じていない、誰かが私をここで助けてください:)) – mrow
あなたがもっと知りたい場合は、私に教えてください – mitchken