הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   הורדה משרת אחר, והצגת הורדה מהשרת שלי. (https://hosts.co.il/forums/showthread.php?t=101453)

איציק ברבי 09-12-12 14:58

הורדה משרת אחר, והצגת הורדה מהשרת שלי.
 
דברים שאני רוצה לציין מראש,

* חובה שיהיה דרך PHP.

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

הקוד הזה מבצע את זה בצורה טובה, אבל הבעיה היא מהירות ההורדה.

PHP קוד:

function download($url,$name){ 
        
$ch curl_init($url);
        
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
        
$mh curl_multi_init();
        
$active null;
        
curl_multi_add_handle($mh,$ch);
        do {
            
$mrc curl_multi_exec($mh$active);
        } while (
$mrc == CURLM_CALL_MULTI_PERFORM);
        while (
$active && $mrc == CURLM_OK) {
            if (
curl_multi_select($mh) != -1) {
                do {
                    
$mrc curl_multi_exec($mh$active);
                } while (
$mrc == CURLM_CALL_MULTI_PERFORM);
            }
            
header('Content-Description: File Transfer');
            
header("Content-Disposition: attachment; filename=".$name);  
            
readfile(curl_multi_getcontent($ch));        
        }
        
curl_multi_remove_handle($mh$ch);
        
curl_multi_close($mh);
    } 

ניסיתי לבצע הורדה פשוטה באמצעות שליחת בקשה בcURL והוצאת הפלט דרך readfile (curl_exec()) ולא דרך curl_get_multicontent()...

אשמח אם משהו יוכל לעזור לי, תודה!

אדיר 09-12-12 15:07

עד כמה איטי זה?
ניסית להוריד ישירות מהשרת (ללא PHP) והגעת למהירויות גבוהות יותר?
ניסית להריץ את זה על שרת אחר והגעת למהירויות גבוהות יותר?
ניסית לנטר את התעבורה בזמן אמת ולראות על איזה מהירות השרת מוריד את הקובץ?

השאלה היא האם אתה בטוח שהמהירות האיטית שאתה חווה בהכרח קשורה לקוד(?).

בניה 09-12-12 15:09

אני הייתי עושה את זה עם curl writer function
http://php.net/manual/en/function.curl-setopt.php

חפש את CURLOPT_WRITEFUNCTION

בגדול אתה כותב פונקציה שמדפיסה )echo( את מה שהיא קיבלה בפרמטר השני, ואז מחזירה את ה
strlen שלו.

אין צורך להשתמש בurl_multi

בנוגע למהירות - קח בחשבון שהשרת שלך מוריד מהשרת המרוחק ואז שולח ללקוח.
זה דבר שיקר יחסית במשאבים וברוחב פס.

ותבדוק את השימוש ב CURLOPT_BUFFERSIZE, אולי זה יכול להשפיע על המהירות.

איציק ברבי 09-12-12 15:32

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 865285)
עד כמה איטי זה?
ניסית להוריד ישירות מהשרת (ללא PHP) והגעת למהירויות גבוהות יותר?
ניסית להריץ את זה על שרת אחר והגעת למהירויות גבוהות יותר?
ניסית לנטר את התעבורה בזמן אמת ולראות על איזה מהירות השרת מוריד את הקובץ?

השאלה היא האם אתה בטוח שהמהירות האיטית שאתה חווה בהכרח קשורה לקוד(?).

הנסיון שלי עם שליחת בקשה רגילה באמצעות curl, היה בסביבות ה 400KB לשנייה.
המהירות שלי היא 12MB.


ציטוט:

נכתב במקור על ידי בניה (פרסם 865287)
אני הייתי עושה את זה עם curl writer function
http://php.net/manual/en/function.curl-setopt.php

חפש את CURLOPT_WRITEFUNCTION

בגדול אתה כותב פונקציה שמדפיסה )echo( את מה שהיא קיבלה בפרמטר השני, ואז מחזירה את ה
strlen שלו.

אין צורך להשתמש בurl_multi

בנוגע למהירות - קח בחשבון שהשרת שלך מוריד מהשרת המרוחק ואז שולח ללקוח.
זה דבר שיקר יחסית במשאבים וברוחב פס.

ותבדוק את השימוש ב CURLOPT_BUFFERSIZE, אולי זה יכול להשפיע על המהירות.

אשמח אם תיתן לי דוגמא פשוטה, שאוכל לעבוד איתה..

--- בדקתי קצת בגוגל, לא הבנתי איך להשתמש בה, באיזה צורה ולמה להשתמש בה.

אשמח לקטע קוד שיסביר לי בקצרה שיוכל להבהיר לי את העניין הזה וגם למה דווקא כדאי להשתמש בה?(WRITE_FUNCTION)

בניה 09-12-12 16:32

זה אמור לעבוד:
http://pastebin.com/82za8MXw

WRITE_FUNCTION בגדול זה אומר שCURL לא שומר בעצמו את המידע שיורד(במקרה הזה קובץ) אלא שולח לך אותו בחלקים חלקים(תוך כדי ההורדה)
ואתה צריך לעשות איתו מה שאתה רוצה(נניח לשמור לקובץ) ולהחזיר לו את מספר הבייטים שהספקת לשמור.
במקרה שלנו במקום לשמור לקובץ אנחנו עושים ECHO כדי לשלוח למשתמש תוך כדי ההורדה של השרת שלנו משרת המקור.
אפשר לעשות כל מיני טוייקים של הDOWNLOAD SPEED משרת המקור (אפשר גם לעקוב אחריה) ולעשות אופטימציה לכל התהליך

איציק ברבי 09-12-12 20:05

ציטוט:

נכתב במקור על ידי בניה (פרסם 865292)
זה אמור לעבוד:
http://pastebin.com/82za8MXw

WRITE_FUNCTION בגדול זה אומר שCURL לא שומר בעצמו את המידע שיורד(במקרה הזה קובץ) אלא שולח לך אותו בחלקים חלקים(תוך כדי ההורדה)
ואתה צריך לעשות איתו מה שאתה רוצה(נניח לשמור לקובץ) ולהחזיר לו את מספר הבייטים שהספקת לשמור.
במקרה שלנו במקום לשמור לקובץ אנחנו עושים ECHO כדי לשלוח למשתמש תוך כדי ההורדה של השרת שלנו משרת המקור.
אפשר לעשות כל מיני טוייקים של הDOWNLOAD SPEED משרת המקור (אפשר גם לעקוב אחריה) ולעשות אופטימציה לכל התהליך

למה אתה מתכוון ל טוויקים של download speed?

וניסיתי את הקוד שלך, הוא שולח לי את הקובץ להורדה רק לאחר שככל הנראה הוא נטען לגמרי, והוא מוחזר כקובץ ריק(0 Bytes).

Steve-Web 09-12-12 20:53

איצי בעבר נתקלתי בקוד שאדיר ^^ הכין שפעל במהירות טובה בשרת מסויים ובשרת אחר באותו מצב כמו שאתה מגדיר כרגע , אני מניח שהבעיה כמו שאדיר אמר בשרת ולא בדיוק בקוד. (הקוד היה מבוסס על LEECH מאתרים)

איציק ברבי 09-12-12 20:58

ציטוט:

נכתב במקור על ידי Steve-Web (פרסם 865318)
איצי בעבר נתקלתי בקוד שאדיר ^^ הכין שפעל במהירות טובה בשרת מסויים ובשרת אחר באותו מצב כמו שאתה מגדיר כרגע , אני מניח שהבעיה כמו שאדיר אמר בשרת ולא בדיוק בקוד. (הקוד היה מבוסס על LEECH מאתרים)

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

אדיר 09-12-12 21:19

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

בהצלחה :).

איציק ברבי 09-12-12 21:26

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 865285)
עד כמה איטי זה?
ניסית להוריד ישירות מהשרת (ללא PHP) והגעת למהירויות גבוהות יותר?כן ניסיתי להוריד ישירות מהשרת והגעתי למהירות המקסימלית שלי.
ניסית להריץ את זה על שרת אחר והגעת למהירויות גבוהות יותר?אין בידי שרת אחר, כרגע אני מנסה על המחשב שלי ועל אחסון שקיבלתי מחר שיושב על שרת ייעודי.
ניסית לנטר את התעבורה בזמן אמת ולראות על איזה מהירות השרת מוריד את הקובץ?כיצד אני מבצע כזה דבר? עם wireshark?

^^ זה מוזר מכוון וניסיתי עם readfile() והגעתי לכמעט חצי מהירות הורדה מהקיימת שלי,

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


^^^


כל הזמנים הם GMT +2. הזמן כעת הוא 20:12.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ