לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #8  
ישן 04-09-2013, 22:31
  tbe tbe אינו מחובר  
 
חבר מתאריך: 03.01.12
הודעות: 149
בתגובה להודעה מספר 7 שנכתבה על ידי MatiM שמתחילה ב "אני לא מוצא איפה אתה שולח את..."

טוב אני נותן פה את הקוד
כמו שאתה תראה הפונקציה לא מופעלת כרגע, כנראה בגלל זה אתה לא רואה אותה באתר

קוד PHP:
 $(document).ready(function() {
    
    function 
exec_collect_els_to_update()
    {
        var 
baseUrl = $('#siteState').find('input[name=baseUrl]:hidden').val();
        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());
                    }
                    
                });
            }
        }
        
console.log(self_data);
        $.
ajax({
            
url        baseUrl+'live_update/update',
            
cache    false,
            
async    true,
            
type    'POST',
            
data    : {data:self_data},
            
error: function (data) {
                
console.log(data);
                
setTimeout(function() {
                    
exec_collect_els_to_update();
                }, 
20*1000);
            },
            
success    : function(data) {console.log(data);
            
                if(
data)
                {    
                    var 
json = $.parseJSON(data);
                    
                    if(
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();
                        }, 
3*1000);
                    }
                    else
                    {
                        
console.log('json error');
                        
setTimeout(function() {
                            
exec_collect_els_to_update();
                        }, 
20*1000);
                    }
                    
                }
                else
                {
                    
console.log('no data to search');
                }
            }
        });
    }
        
    (function() {
/*
        setTimeout(function() {
            exec_collect_els_to_update();
        }, 3*1000);
*/    
    
})();
    
}); 


פה יש את שתי הפונקציות העיקריות של ה polling

קוד PHP:
 function update()
    {
        if(isset(
$_POST['data']) && !empty($_POST['data']))
        {
            
$jsonArray $this->polling($_POST['data']);
            echo 
json_encode($jsonArray);exit;
        }
        else 
        {
            echo 
false;    
        }
    }
    
    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);
        }
    } 
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 07-09-2013, 21:30
צלמית המשתמש של Eran
  משתמש זכר Eran Eran אינו מחובר  
 
חבר מתאריך: 27.02.02
הודעות: 4,536
שלח הודעה דרך ICQ אל Eran
בתגובה להודעה מספר 8 שנכתבה על ידי tbe שמתחילה ב "טוב אני נותן פה את הקוד כמו..."



התשובה שלי היא כזאת:
ציטוט:
במקור נכתב על ידי MatiM
לולאה עם sleep זה לא טוב בשום מקום.
אם אתה רוצה לבצע בדיקה פעם ב15 שניות, אז תקרא לשרת ותבדוק אם יש מידע.
אם כן, תחזיר את המידע. אם לא, תחזיר false, ערך ריק או מה שרק תרצה - אבל תחזיר משהו!
[ברגע זה, הסקריפט יפסיק לרוץ, ובעל השרת שלך ישמח].
עכשיו תיצור טיימר בJS שימתין 15 שניות ויקרא שוב לפונקציה.


אני לא יודע על איזו מערכת אתה עובד, אבל יש לי תחושה שהיא ממש לא דורשת socketים.

רק אני אוסיף שבשביל עדכונים, אני היית מרחיק לכת לכיוון ה-10 דקות.
האופציה היחידה שהייתי חושב על 15 שניות ומטה זה אם באמת הייתי מצפה מהגולש להיות עם העיניים "על" ומבלי לדפדף בין הדפים.


ואולי עוד כמה טיפים.
1. מבחינת ה 15 שניות. לשרת יש הגבלה על זמן החיבור. כל שרת והמנהל-שרת שלו. נראה לי בברירת מחדל 30 שניות מקסימלי. ואם כך אז 15 שניות מראש נידון להכשל.
2. זיכרון מטמון. אני נתקלתי הרבה בקריאות AJAX ארורות שלא מעדכנות את הדפים למרות שכן היו אמורות לעדכן את הדף בתוכן חדש. זאת מכיוון שהם לקחו את המידע מזיכרון המטמון.
כדי לתקן זאת ניתן לשלוח חותמת זמן בסוף הדף אחרי ה"?".
3. אם אין לך שימוש ב POST אז תשתמש ב GET
_____________________________________

[התמונה הבאה מגיעה מקישור שלא מתחיל ב https ולכן לא הוטמעה בדף כדי לשמור על https תקין: http://fresh.clanteam.com/list.png]

[התמונה הבאה מגיעה מקישור שלא מתחיל ב https ולכן לא הוטמעה בדף כדי לשמור על https תקין: http://fresh.clanteam.com/?https://2010-uploaded.fresh.co.il/2010/09/21/52868411.gif,http://www.boredpanda.com/blog/wp-content/themes/mimbo2.2/images/subscribe-panda-605px.png]

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 07-09-2013, 23:02
  tbe tbe אינו מחובר  
 
חבר מתאריך: 03.01.12
הודעות: 149
עברתי ל websockets
בתגובה להודעה מספר 1 שנכתבה על ידי tbe שמתחילה ב "websocket server"

אני חושב שיש לי בעיה הבנתית קלה

אני מעביר פה את הקוד


זה ה 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($messagetrue);
    
        if(isset(
$post) && !empty($post))
        {
            
$jsonArray $this->polling($post);
            
$this->send($user,  json_encode($jsonArray));
        }
        else 
        {
            echo 
false;    
            
$this->send($userfalse);
        }
        
         
        
//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);
        } 
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #15  
ישן 12-09-2013, 22:13
צלמית המשתמש של Eran
  משתמש זכר Eran Eran אינו מחובר  
 
חבר מתאריך: 27.02.02
הודעות: 4,536
שלח הודעה דרך ICQ אל Eran
בתגובה להודעה מספר 14 שנכתבה על ידי tbe שמתחילה ב "אוקי אני מתחיל מהתחלה 1- מה..."

1. אני מניח שקראת או אם עדיין לא, אתה יכול לקרוא על כך רבות באינטרנט
בכללי זה דרך של יישום (הדפדפן במקרה הזה) לתקשר עם יישומים אחרים ברשת
הקוד החדש שלך בעצם כמעט זהה לקוד הקודם שלך

2. כל הקוד כבר הבאת. אז אני אנסה להיות ספציפי בשינויים שאנחנו מצפים שתעשה בקוד:

js:
נחזור לקוד הראשון שלך שכתבת (זה עם ה ajax).
אם הבנתי אותו נכון, הוא עובד נפלא. אל תיגע בו.
php:
תמחק את לולאת ה while ואת ה sleep.

זהו! זאת הייתה כל הכוונה.
תיסלם אידק!
_____________________________________

[התמונה הבאה מגיעה מקישור שלא מתחיל ב https ולכן לא הוטמעה בדף כדי לשמור על https תקין: http://fresh.clanteam.com/list.png]

[התמונה הבאה מגיעה מקישור שלא מתחיל ב https ולכן לא הוטמעה בדף כדי לשמור על https תקין: http://fresh.clanteam.com/?https://2010-uploaded.fresh.co.il/2010/09/21/52868411.gif,http://www.boredpanda.com/blog/wp-content/themes/mimbo2.2/images/subscribe-panda-605px.png]

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #19  
ישן 16-09-2013, 06:05
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 17 שנכתבה על ידי Eran שמתחילה ב "אני די בטוח שה facebook..."

ברירת המחדל שאתה מציין נשמעת פחות או יותר כמו מה שאני זוכר... אבל בכל שרת שמכבד את עצמו (ובוודאי במשותפים) - סביר להניח שהמספר גבוה יותר.

ככה או ככה, websocket / long polling אלו דברים שמנהל השרת חייב להסכים להם. גם הדרך לעשות את זה חשובה, ובעומסים בסדרי גודל שבהם אי אפשר להשתמש ב AJAX רגיל כי "זה יותר מדי קריאות לשרת", אם לצטט את פותח האשכול, בהחלט ייתכן שגם websocket / long polling (אם כלל אפשריים מבחינת הגדרות השרת, ושוב אני חוזר לעניין השרתים המשותפים) - לא יהוו שיפור מבחינת העומס, בייחוד אם הם לא נעשים נכון, שהרי אז, הם יכולים לבזבז אפילו יותר משאבים...

אם במקרה, רק במקרה, חושב פותח האשכול ש"מנהל השרת לא ידע" / "לא ישים לב", וכיוצ"ב, אני ממליץ לו להכין מראש חשבון אצל חברת אירוח אתרים אחרת (שם הוא כנראה יחזור ל AJAX...), כי יבעטו אותו in no time אם הוא יעשה abuse שתופס את כל משאבי השרת כמו שהוא מתכנן כאן...

כמובן שגם ב AJAX ניתן לצרוך יותר מדי משאבים; אני לא אומר שלא. אתה לא יכול לעשות עומס ברמה של פייסבוק/גוגל על Shared Hosting (וגם לא על שרת פרטי בודד, אם זה באמת עומס בדרגה של פייסבוק/גוגל). זה לא עובד ככה. ואין באמת דבר כזה חבילת "Unlimited". אחרת פייסבוק וגוגל היו יושבים כולם על שרת בודד. המציאות היא שהם צריכים מאות אלפי שרתים כדי לטפל בכמות הגולשים שלהם והעומס שהגולשים מייצרים.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #21  
ישן 16-09-2013, 06:50
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 20 שנכתבה על ידי tbe שמתחילה ב "היי תודה על התגובה..."

אני לא יודע מה פירוש "להיה"

אני אומר שאין "ארוחות חינם". לעדכון "בזמן אמת" (או ליתר דיוק, קרוב לזמן אמת. אין דבר כזה זמן אמת. בכל מקרה יש זמן עיבוד וזמן מעבר ברשת, במינימום) - יש מחיר.

כדי לעשות מה שפייסבוק עושים ב scale שהם עושים אותו, צריך משהו הרבה יותר מתוחכם ממה שאתה בונה (למיטב זכרוני, אתה משתמש ב CSV כדי לאחסן מידע, ועושה חיפושים שלא ניתן להשתמש בהם באינדקסים במסד הנתונים, אז לדעתי תשכח אפילו מ scale שהוא עשירית פרומיל מפייסבוק...).

באופן כללי, לאתר דינאמי "גדול" (ואל תבקש ממני להגדיר "גדול") - לעולם לא תתאים חבילת אחסון ב Shared Hosting, ותצטרך מינימום שרת פרטי משל עצמך - וגם מספיק רוחב פס...

לידיעתך, האתר שאתה גולש בו עכשיו, שאין בו שום דבר שנשלח לגולשים בזמן אמת, צריך שרת פרטי...
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #23  
ישן 16-09-2013, 07:31
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 22 שנכתבה על ידי tbe שמתחילה ב "בקיצר מה שאתה אומר כדי לעשות..."

אני לא יודע כמה משאבים תצטרך, זה תלוי בכמות הגולשים שלך, ובמה אתה עושה בצד השרת... אין נוסחת קסם. אתה צריך להבין מה אתה עושה.

זה אולי ידהים אותך, אבל תא אחד (אני חושב שאתה מתכוון ל"טור אחד") - יכול להאיט את האתר שלך (יחד עם כל השרת שלך, אם מסד הנתונים שלך על אותו השרת) - למהירות אפסית, שתחרפן אותך. ואני עדיין חושב שהשוואת מחרוזות וסריקת את כל השיחות עבור כל המשתמשים בכל פעם היא פעולה הרבה יותר איטית מלתת ID ייחודי לשיחה ואז לעשות SELECT לפי ID משתמש וטבלת קישור בין ID ייחודי לשיחה לרשימת משתמשים ואז JOIN לטבלת שיחות שבה יש טור של עדכון אחרון של כל שיחה כדי למשוך את כל השיחות האחרונות שהתעדכנו עבור אותו משתמש.... וכיוון שזו תהיה טבלה ענקית (אם תגיע למימדי פייסבוק, מה שאני בספק), לעשות עליה partitioning ולפזר אותה על הרבה שרתים... אבל לך תדע, אולי אני טועה.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 20:27

הדף נוצר ב 0.26 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר