08-09-2013, 00:02
|
|
|
חבר מתאריך: 03.01.12
הודעות: 149
|
|
עברתי ל websockets
אני חושב שיש לי בעיה הבנתית קלה
אני מעביר פה את הקוד
זה ה JS הפוקציה אוספת נתונים של אלמנטים מה DOM
הפונקציה socket.send(data_string); שולחת את הנתונים לשרת
קוד PHP:
var socket;
var host = "ws://localhost:8000/creatives.co.il/realtime/update";
var socket = new WebSocket(host);
console.log('Socket Status: '+socket.readyState);
socket.onopen = function(){
console.log('Socket Status: '+socket.readyState+' (open)');
setTimeout(function() {
exec_collect_els_to_update();
}, 1*1000);
}
socket.onmessage = function(msg){
console.log('Received: '+msg.data);
update_server_collect_els(msg.data);
}
socket.onclose = function(){
console.log('Socket Status: '+socket.readyState+' (Closed)');
}
function exec_collect_els_to_update()
{
var self_data = [];
var els = [
'live_update'
];
var els_exec = [];
for(var i in els)
{
var el = $('.'+els[i]);
if(el.length > 0)
{
el.each(function() {
if(els_exec[$(this).data().box_class] == 1)
{
}
else
{
els_exec[$(this).data().box_class] = 1;
self_data.push($(this).data());
}
});
}
}
var data_string = JSON.stringify(self_data);
socket.send(data_string);
}
function update_server_collect_els(data)
{
if(data)
{
var IS_JSON = true;
try
{
var json = $.parseJSON(data);
}
catch(err)
{
IS_JSON = false;
console.log('NOT A JSON = ' +err);
}
if(IS_JSON)
{
for(var k in json)
{
if($('.'+json[k].box_class).length)
{
$('.'+json[k].box_class).data('time', json[k].time);
switch (json[k].method)
{
case 'prepend':
{
$('.'+json[k].box_class).prepend(json[k].data);
}
break;
case 'html':
{
$('.'+json[k].box_class).html(json[k].data);
}
break;
default:
{
$('.'+json[k].box_class).append(json[k].data);
}
break;
}
}
}
exec_collect_els();
setTimeout(function() {
exec_collect_els_to_update();
}, 5*1000);
}
else
{
console.log('json error');
setTimeout(function() {
exec_collect_els_to_update();
}, 30*1000);
}
}
else
{
console.log('no data to search');
}
}
הכל עובד סבבה, הנתונים נשלחים, חוץ ממשהו לא ברור מתווספים לפעמים כל מיני תווים להודעה שדפדפן שולח
הקוד הזה פותר את בעית התווים
קוד PHP:
$message = explode(']', $message);
$message = $message[0];
$message .= ']';
זאת הפוקציה שפועלת מתי שנשלח מהדפדפן משהו
קוד PHP:
public function process ($user, $message)
{
$message = explode(']', $message);
$message = $message[0];
$message .= ']';
echo "User = ". $user->socket ."\n";
echo "START Message\n";
echo $message;
echo "\nEND Message\n";
$post = json_decode($message, true);
if(isset($post) && !empty($post))
{
$jsonArray = $this->polling($post);
$this->send($user, json_encode($jsonArray));
}
else
{
echo false;
$this->send($user, false);
}
//The uri component say /a/b/c
echo "Requested resource : " . $user->requestedResource . "\n";
}
זאת הפונקציה שלוחת את ההודעה של הדפדפן ומחפשת ב DB נתונים חדשים
קוד PHP:
private function polling($post_data)
{
$jsonArray = array();
while (true)
{
$break = false;
foreach ($post_data as $value)
{
$data = false;
$current_time = time();
switch ($value['type'])
{
case 'update_feed':
{
$data = $this->update_feed($value['time'], $current_time, $value['el']);
}
break;
case 'user_msg_notif':
{
$data = $this->user_msg_notif($value['time'], $current_time, $value['el']);
}
break;
case 'user_alert_notif':
{
$data = $this->user_alert_notif($value['time'], $current_time, $value['el']);
}
break;
case 'feed_msg':
{
$data = $this->feed_msg($value['time'], $current_time, $value['el']);
}
break;
}
if($data)
{
$break = true;
$jsonArray[] = array( 'box_class' => $value['box_class'],
'method' => $value['method'],
'time' => $current_time,
'data' => $data);
}
}
if($break)
{
return $jsonArray;
}
sleep(15);
}
}
וברמת העיקרון את צריך לקבל בחזרה מתי שיש שינוי תשובה לקוד הזה
קוד PHP:
socket.onmessage = function(msg){
console.log('Received: '+msg.data);
update_server_collect_els(msg.data);
}
|