אתה נמצא כאן יסודות השפה  >>  העברת נתונים ל-PHP  >>  שימוש ב-session

שימוש ב-session

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

כאשר מאתחלים session, PHP יוצרת קובץ session על השרת לפי מספר הזיהוי של המשתמש, ואת ה-session id (מספר הזיהוי) PHP שומרת בתוך עוגיה במחשב הלקוח או שולחת דרך ה-URL (תלוי בקונפיגורציה). אם קובץ ה-session כבר נמצא על השרת, אז PHP משחזרת את הנתונים השמורים ב-session לתוך המערך הגלובלי $_SESSION.

חשוב להבהיר כי המידע של המשתמש נשמר ב-session על השרת (בקובץ ה-session), וכל משתמש מקושר לקובץ ה-session הייחודי שלו לפי ה-session id (מספר הזיהוי) הייחודי שלו. ה-session id לא מאובטח בצורה טובה כשמשתמשים רק ב-sessions, ומשתמש אחר יכול "לגנוב" לך את מספר הזיהוי שלך, ולהשתמש בקובץ ה-session שלך! זאת הסיבה שלא ממש כדאי להעביר את ה-session id דרך ה-URL, כי זה פרוץ מדי. לעומת זאת, שמירת ה-session id בתוך עוגיה מקשה יותר על גניבת מספר הזיהוי שלך, אך לא מונעת את זה בוודאות. החיסרון של שימוש בעוגיות לשמירת ה-session id, הוא שהעוגיה יוצאת מתוקף רק כאשר סוגרים את הדפדפן (בדר"כ, תלוי בקונפיגורציה). לכן אם משתמש נכנס לאתר מסויים שעושה שימוש ב-session ויוצא ממנו, ונכנס שוב לאותו אתר דרך אותו הדפדפן (הכוונה היא שהוא לא סגר את הדפדפן ופתח אותו מחדש), אפילו לאחר שביקר בכמה אתרים נוספים, הוא ישתמש באותו session id, וכנראה שגם באותו קובץ ה-session שלו מהפעם הקודמת שביקר באתר (במידה וקובץ ה-session שלו עדיין בתוקף). כדי להגביר את האבטחה על ה-sessions, לא רק העוגיה של ה-session id יוצאת מתוקף, אלא גם קובץ ה-session על השרת "מתיישן" ויוצא מתוקף לאחר זמן מה (תלוי בקונפיגורציה).

כדי לאתחל session באופן מפורש משתמשים בפונקציה session_start(). אם בקונפיגורציה נקבע להשתמש בעוגיות, אז חייב לאתחל את ה-session לפני הוצאת פלט (לפני שה-headers נשלחים).

כדי להרוס את ה-session משתמשים בפונקציה session_destroy(), שמוחקת את קובץ ה-session מהשרת אך לא מוחקת את ה-session id מהעוגיה על שרת הלקוח. כשהורסים session, המשתנים שהועלו מתוך קובץ ה-session לפני-כן עדיין שמורים במערך הגלובלי $_SESSION. אם לא הורסים את ה-session באופן מפורש (עם הפונקציה session_destroy()), אז ה-session ייצא מתוקף לאחר פרק זמן מסויים (תלוי בקונפיגורציה, garbage collection), ו-PHP תהרוס אותו אוטומטית.

כדי לשמור משתנים ב-session ניתן להשתמש בפונקציה session_register() ששומרת רק משתנים גלובליים, בהנחה והאפשרות של register_globals מופעלת בקונפיגורציה (אם האפשרות הזו לא מופעלת בקונפיגורציה, אסור להשתמש בפונקציה זו). דרך שתמיד תעבוד כדי לשמור משתנים ב-session היא השמת ערכים במערך הגלובלי $_SESSION. אם משתמשים בפונקציה session_register(), אז הערך של המשתנה ששמרנו ב-session עדיין לא יתעדכן במערך הגלובלי $_SESSION.

כדי למחוק משתנים מ-session חייב להשתמש בפונקציה session_unregister(), בהנחה והאפשרות של register_globals מופעלת בקונפיגורציה (פונקציה זו תעבוד גם במקרה שהאפשרות הזו לא מופעלת בקונפיגורציה). אם האפשרות הזו לא מופעלת בקונפיגורציה, אז ניתן למחוק משתנים מ-session גם ע"י מחיקת ערכים מהמערך הגלובלי $_SESSION (בעזרת unset()). שימוש בפונקציה session_unregister(), גם מוחקת את הערך מהמערך הגלובלי $_SESSION.

נביא דוגמא כיצד ליצור session, לשמור ולמחוק בו נתונים. הדוגמא הבאה סופרת כמה פעמים מעלים את הדף מאותו הדפדפן, ובכל פעם שמגיעים ל-5 מוחקים את המשתנה מה-session:

<?php
  session_start();
/*מאתחל את ה-session.
אם בקונפיגורציה קובעים להשתמש בעוגיות,
חייב לאתחל את ה-session לפני הוצאת פלט,
לפני שה-headers נשלחים.
*/

  if (isset($_SESSION['counter_load'])
/*אם המשתנה counter_load שמור ב-session.*/
)
  {
     echo "Session was found!<BR>";
     $_SESSION['counter_load']++;
/*מקדם את המשתנה של ה-session ב-1.
הקידום גם שומר את הערך המקודם חזרה במשתנה.
*/

     echo "You've been in this page <B>".$_SESSION['counter_load']
/*גישה למשתנים של ה-session
נעשית דרך המערך הגלובלי $_SESSION.
*/
."</B> times.<BR>";
     if ($_SESSION['counter_load']>=5)
/*אם מספר הביקורים בדף זה הוא לפחות 5.*/

     {
        session_unregister("counter_load");
/*מוחק את המשתנה counter_load מה-session.
הערך $_SESSION['counter_load'] גם נמחק.
(זו הדרך הכי בטוחה למחיקת משתנה מ-session).
*/

        echo "You've visited this page at least 5 times. Deleted the session variable.<BR>";
     }
  }
  else //if first time in this page
  
{
     $_SESSION['counter_load']=1;
/*שומר משתנה בשם counter_load ב-session.
(זו הדרך הכי בטוחה לשמור משתנה ב-session).
*/

     echo "Session wasn't found!<BR>It's is your <B>first</B> time in this page.<BR>";
     echo "Created a session variable.<BR>";
  }
?>

אם משתמשים בעוגיות, אז ה-session id נשמר בתוך עוגיה ועולה בכל פעם שנכנסים לאתר והעוגיה תקפה. אבל לא כל הדפדפנים תומכים בעוגיות, ולכן יהיה חייב להעביר את ה-session id דרך ה-URL. ניתן לקבוע דרך הקונפיגורציה להעביר את ה-session id באופן אוטומטי לכל דף באתר. אך אם תרצה להעביר את ה-session id באופן מפורש דרך ה-URL, משתמשים בקבוע שמוגדר מראש, SID, שמכיל את המחרוזת בתבנית של: "<session_name>=<session_id>". את המחרוזת הזו אנו שמים ללא שינוי היישר בתוך ה-URL, לדוגמא:

<A href="http://www.mysite.com/users/login.php?<?= SID; ?>">Automatic Login</A>


תגובות בנושא

לא לשכוח 03-12-02 01:02
 dan salomon
#76

If you are using PHP on a Windows system, make sure to set the session.save_path in the php.ini to your temp directory (e.g. c:\windows\temp). Otherwise php will crash when calling session_start()

שאלה 01-11-02 07:01
 [ללא שם]
#548

איך אני עושה שאם יוצאים מהדף/עוברים לדף אחר
אז זה מוחק את כל הsession (של אותו משתמש שהיה בדף)?

מחיקת session 01-11-02 12:01
 אלי חן (מנהל)
#550

אין ממש צורך להרוס את ה-session ביציאה, כי ל-session יש זמן תוקף (כמו לעוגיה).. אם לא חוזרים אל אותו session לאחר זמן מסויים, אז ה-session יימחק באופן אוטומטי.
אבל אם בכל זאת רוצים למחוק את ה-session בצורה ידנית, אז ניתן לעשות זאת עם הפונקציה session_unset ואחריו לקרוא לפונקציה session_destroy.

שאלה. 01-12-03 03:02
 [ללא שם]
#658

האם יש קשר בין session_cache_limiter
ו session_cache_expire לheaders של expires וכו',
ואם אני מגדיר session_cache_Expire
30 דקות לדוגמא, זאת אומרת, אז גם ה expires של
העמוד יהיה 30 דקות?, זה יכול ליצור בעיה.

לסיכום, האם יש קשר ישיר בין הדברים?
אשמח לקבל הבהרה...

חשוב: זמן תוקף של session 01-12-03 05:00
 אלי חן (מנהל)
#662

קובץ ה-session כידוע נוצר על צד השרת ובו יכולים לשמור מידע עבור כל משתמש בנפרד. אבל מתי הקובץ מאבד את התוקף שלו?

כל session מקבל SID ייחודי, שמגיע אל צד הלקוח ובדר"כ נשמר כעוגיית session. ה-session מאבד את תוקפו כאשר העוגיה מאבדת את תוקפה. תוקף זה נקבע באמצעות הפונקציה session_cache_expire (בדקות).
הפונקציה session_cache_limiter קובע למי מותר לשמור את הדף בזיכרון המטמון שלו. ערך public אומר שגם המשתמש וגם שרתי ה-proxy יכולים לשמור את הדף בזיכרון המטמון שלהם. ערך private אומר שרק המשתמש יכול לשמור את הדף בזיכרון המטמון שלו. וערך nocache אומר שאסור לשמור את הדף בזיכרון המטמון.

מתי קובץ ה-session נמחק מהשרת?
קובץ ה-session שנוצר בשרת לא נשאר לכל הזמן, אלא יש לו תוחלת חיים שנקבעת בקובץ ה-ini של PHP(הכניסה session.gc_maxlifetime). ערך זה קובע את מספר השניות שאחריו ניתן למחוק את קובץ ה-session. הזמן מחושב מזמן הגישה האחרון לקובץ ה-session (כלומר, השימוש האחרון ב-session).

בעיה בין שילוב עוגיה וסשן 05-12-03 01:01
 [ללא שם]
#857

אני לא מצליח לשלב גם עוגיה וגם סשן באותו זמן...
הוא כותב לי:
Warning: session_start(): Cannot send session cookie - headers already sent
ומתחת לזה עוד אררור:
Warning: session_start(): Cannot send session cache limiter - headers already sent

איך ניתן לסדר את הבעיה?

headers 05-12-03 02:00
 אלי חן (מנהל)
#860

headers הם פריטי מידע שנשלחים בין הדפדפן לשרת ומגדירים כיצד יש להשתמש בדף שנשלח.

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

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

(גם ירידת שורה מחוץ לתגי הפתיחה וסיום של PHP נחשבים לשליחת פלט.. דאג לכך שאתה פותח את תגי ה-PHP בראש הדף, גם בקבצי ה-include שלך.)

בעיה 08-12-03 22:01
 אלעד נחום
#1085

im starting a session in the first page and saving data in vars inside the session but when i go o another page the datas are erased.
what should i do?

שאלה קטנה 09-12-03 02:02
 [ללא שם]
#1092

כאשר מעבירים ב PHP
SESSION האם חייבים תמיד להעביר SID או לטעון אותו בכל דף מחדש כדי להעביר את הנתונים מדף לדף?
אני יודע שב ASP הSESSION לא צריך להטען כל פעם מחדש. ולא צריך להעביר SID כמו שבPHP
אני רוצה שתבהיר את הנושא קצת יותר. תודה.

בעיה עם ה session 09-12-03 16:02
 אייל
#1118

הפרמטרים של ה SESSION אינם נשמרים בין דף לדף, יש לי קובץ אחד לביצוע לוגין אשר בו session_start();
if (isset($_SESSION['user'])) ..
במידה ולא בוצע לוגין נבצע ונישמור את הuser ב session תחת $_SESSION['user' כאשר אני עובר דף או מבצע ריענון לדף לא קיים ערך ל session'user'

בעיות בשמירת session 09-12-03 18:02
 אלי חן (מנהל)
#1137

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

קינפוג נכון של session:
בקובץ ה-ini של PHP יש לעבור על כל המחלקה של הגדרות session (כניסות בשם session.*).. שני הדברים העיקריים שגורמים לבעיות הן שתי הכניסות הבאות:
session.save_path - וודאו כי הנתיב הרשום בכניסה זו הוא ספריה על המחשב שלכם, ושיש עליו הרשאות קריאה-כתיבה לכולם. (ברירת המחדל של זה הוא הנתיב /tmp שאינו קיים כלל בווינדוס, לכן צרו לכם ספרית session משלכם ורשמו אותה בכניסה הנ"ל, או השתמשו בספרית ה-TEMP של ווינדוס - c:windowstemp).
session.use_cookies - וודאו שערך הכניסה הוא "1". זה גורם ל-SID להישמר בעוגיה, ואז אין צורך להעביר את ה-SID דרך ה-URL. נתמך כמעט בכל הדפדפנים ויותר בטוח.
[רצוי לעבור גם על כל השאר ליתר ביטחון].

התחלת session:
את ה-session יש להתחיל לפני שליחת ה-header-ים, שקורית אוטומטית עם הוצאת הפלט הראשון. אם יש כאלו שרוצים לאתחל את ה-session אוטומטית עם כל כניסה לדף, אז שנו בקובץ ה-INI את ערכו של session.auto_start ל "1".


לדף הקודםשימוש בעוגיות -הקודם
לתחילת הדףלתחילת הדף
הבא- מחלקות ואובייקטיםלדף הבא