Forum und email

קישור מתמשך (עקשני) לבסיס הנתונים.

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

Note: יש הרחבות נוספות שמספקות קישור מתמשך למשל: IMAP extension.

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

למה?

זה קשור לצורה שבה שרתי רשת עובדים, יש שלוש צורות עיקריות של טיפול ביצור דפי רשת ע"י PHP בידי שרתים.

השיטה הראשונה היא להתשמש ב PHP כמו עוטף CGI (CGI "wrapper"). בשיטה הזאת נוצרת ונהרסת, ידית של מפענח PHP בשביל כל בקשת דף, בגלל שהידית נהרסת עם כל בקשה, גם כל המשאבים נהרסים יחד איתה , (כולל גם קישור לבסיס הנתונים) כלומר, אין שום ווח משימוש בקישור מתמשך על שרת כזה, הוא פשוט לא מתמשך!

השיטה השניה ,הפופולרית ביותר , היא להריץ את PHP כמודול בשרת מסוג multiprocess web server, כרגע הכוונה רק לאפצ'י (Apache). multiprocess server - הוא שרת שיש לו תהליך אבא אחד ראשי (the parent) שמתאם בין תהליכי בנים (its children) שלמעשה עושים את העבודה של של לחלק דפי רשת. כל בקשה שמגיעה ממשתמש , נמסרת לאחד מתהליכי הבנים, שאינו מטפל במשתמש אחר , זה אומר שכשלקוח מבקש בקשה נוספת הוא עלול להיות משויך לאחד מתהליכי הבנים, לאו דווקא לתהליך ששירת אותו לפני זה. קישור מתמשך דואג שאם תהליך בן מסוים התחבר לבסיס הנתונים, וביקש מידע, אותו תהליך בן עצמו , יוכל להתקשר לשרת שנית בעזרת הקישור שכבר קיים, במקרה ושוב הוא ירצה מידע מאותו בסיס נתונים.

השיטה האחרונה היא, להשתמש ב PHP כתוסף תוכנה (plug-in) בשרת מרובה תהליכונים (multithreaded web server). כרגע PHP 4 תומכת ב ISAPI, WSAPI, ו NSAPI על מערכת הפעלה חלונות, כשכולם מאפשרים ל PHP להיות תוסף תוכנה על שרתים כדוגמת Netscape FastTrack (iPlanet), Microsoft's Internet Information Server (IIS), and O'Reilly's WebSite Pro. התנהגות הקישור זהה להתנהגות על שרתים, שהוזכרו בסעיף הקודם. שים לב שתמיכה ב SAPI אינה קיימת ב PHP 3.

אם בעצם לקישור מתמשך, אין ממש השפעה על יכולות הביצוע, בשביל מה צריך אותו?

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

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

Warning

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

לסיכום : קישור מתמשך נועד להיות מקביל לקישור רגיל, כלומר אפשר תמיד להחליף קישור מתמשך בקישור רגיל ,ללא השפעה על הדרך שבה הסקריפט יעבוד, כנראה אבל זה ישפיע על היעילותשבה יעבוד הסקריפט

ראה גםfbsql_pconnect(), ibase_pconnect(), ifx_pconnect(), imap_popen(), ingres_pconnect(), msql_pconnect(), mssql_pconnect(), mysql_pconnect(), ociplogon(), odbc_pconnect(), ora_plogon(), pfsockopen(), pg_pconnect(), ו sybase_pconnect().