Forum und email

טיפול בהתחברות

Note: החל מגירסה 3.0.7 והלאה.

מבפנים חיבור ב PHP הוא במצב התמדה. יש שלושה סטטוסים אפשריים :

  • 0 - NORMAL
  • 1 - ABORTED
  • 2 - TIMEOUT

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

יש ביכולתך להחליט האם אחרי אירוע של ניתוק המשתמש , הסקריפט ירוץ עד סופו או יעצר, לפעמים תרצה שהסקריפט ימשיך לרוץ עד תומו, אבל בד"כ ,וזוהי גם ברירת המחדל, הסקריפט יעצר עם ניתוק המשתמש. אפשר לשנות את ההתנהגות הזאת דרך ההגדרה ignore_user_abort php.ini או דרך ההגדרה המתאימה בקונפיגורציה של אפצ'י, "php_value ignore_user_abort" או עם הפונקציהignore_user_abort() . אם לא תגיד ל PHP להתעלם מנטישה של הקליינט , הסקריפט שלך יחוסל. האופציה היחידה היא, לרשום " פונקצית כיבוי " ( shutdown function) בעזרת register_shutdown_function(). כשיש פונקצית כיבוי, במקרה ומשתמש המרוחק התנתק, בפעם הבאה שהסקריפט ינסה להוציא משהו לפלט, PHP תגלה שהקשר התנתק ,ותקרא לפונקצית הכיבוי, הפונקציה תיקרא גם במקרה והסקריפט הסתיים בצורה נורמלית, כך שכדי להבחין בין קריאה לפונקציה בצורה נורמלית לקריאה במקרה של התנתקות פתאומית , יש להשתמש בפונקציתconnection_aborted() . הפונקציה מחזירה אמת אם היה ניתוק חיצוני כפוי.

הסקריפט שלך יכול להיעצר ,גם ע"י ,הטיימר המובנה שבכל סקריפט, זמן ברירת המחדל לריצה של סקריפט הוא 30 שניות. ניתן לשנות את הזמן הזה , בהגדרה max_execution_time php.ini , או דרך ההגדרה המתאימה בקונפיגורציה של אפצ'י "php_value max_execution_time" או עם הפונקציה set_time_limit() . כשתם הזמן בטיימר הסקריפט יעצר ואם קיימת פונקצית כיבוי היא תיקרא, בשביל לדעת אם סיבת עצירת הסקריפט היתה בגלל שימוש בטיימר, יש להשתמש בפונקציה connection_timeout(). הפונקציה מחזירה אמת אם הניתוק היה בגלל תום זמן הריצה שהוגדר.

הערה : יש אפשרות שגם מצב ABORTED וגם מצב TIMEOUT , יהיו פעילים באותו הזמן, למשל אם הרצת סקריפט, והגדרת ל PHP להתעלם מכיבוי כפוי, ולהמשיך את ריצת הסקריפט, המתשמש שהתנתק גרם לדגל ABORTED, להיות דלוק, והסקריפט שהמשיך לרוץ כול להעיצר ע"י מגבלת זמן הריצה ולהדליק גם את דגל TIMEOUT .במקרה כזה פונקית הכיבוי שלך , אם יצרת כזאת, תגלה שגם connection_timeout() וגםconnection_aborted() מחזירים אמת. אפשר גם לבדוק את שני המצבים בקריאה לאחת לפונקציה , connection_status(). הפונקציה הזאת מחזירה שדה ביטים, של המצב הפעיל, למשל במקרה כזה הפונקציה תחזיר את הערך 3.