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

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

Tyler 04-12-15 21:40

לעצור לולאת foreach וסקריפט PHP באמצע..
 
אוקי אז יש לי מערכת פשוטה שמורכבת מhtml,js וphp

בhtml יש תיבת טקסט שהכותרת שלה היא "נקודות" וכפתור של "שלח".
הכפתור שולח את הנתונים שהוקלדו בתיבת טקסט לjs שמעביר אותם לphp.

הphp בתחילת הקובץ מוגדר בכך שיש קובץ טקסט מסוים על השרת users.txt, באותו קובץ טקסט יש אלפי שמות משתמשים שמפוצלים בשורות:
dan
ben
eric
yosi

הphp בודק שקובץ הטקסט אינו ריק, מקבל את הנתון שהוקלד בתיבת הטקסט בHTML, ומתחיל בלולאת foreach עבור כל שם משתמש שבקובץ טקסט, ויוצר קובץ טקסט חדש שמכיל את שם המשתמש ומספר הנקודות שהוא קיבל, ובנוסף גם שולח מספר פקודות לAPI באתר אחר.

בסופו של דבר כל המשתמשים אמורים לעבור בAPI + להיות נוכחיים בקובץ טקסט החדש שיווצר שיכלול גם את שם המשתמש וגם את הנקודות שהוקלדו עבור כולם.

כלומר אם הקלדתי בדף INDEX כ100 נקודות ולחצתי על "שלח", אז לאחר 10 דקות, יהיה לי קובץ טקסט חדש על השרת בשם .new_users.txt ויכלול בתוכו:
dan 100
ben 100
eric 100
yosi 100

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

לא משנה מה עשיתי:
- סגרתי את חלון הדפדפן
- שיניתי את שם התיקיה שמכילה את המערכת על השרת
- מחקתי את כל התיקיה מהשרת

הסקריפט פשוט לא נעצר.. ולא נשאר לי מה לעשות חוץ מלחכות לסיומו.

אני מעוניין להוסיף ליד כפתור ה"שלח" עוד כפתור של "עצור" שבמידת הצורך אני אוכל לעצור את הסקריפט כשאני ארצה.

כי במידה ואני מוחק את התיקיה שמכילה את המערכת, אז פשוט התיקיה נוצרת מחדש, בתוכה נוצר קובץ הTXT החדש שמכיל את השם משתמש + הנקודות שהולקדו (new_users.txt) וזהו.. ואני לא מבין איך זה הגיוני, הרי אפילו קובץ הPHP נמחק מהשרת וקובץ הTXT הראשי (users.txt) שממנו נלקחים שמות המשתמשים מלכתחילה נמחק מהשרת..

איך אוכל לעצור את התהליך בצורה הכי פשוטה בלי להכנס לעצירת תהליכי שרת בshell וapache וכו'.

תודה.

Programnnd 05-12-15 00:46

תעשה כפתור שאם תלחץ עליו הוא יחזיר ערך של EXIT או RETURN או DIE מה שמתאים ללולאה והוא יעצור את כל הלולאה ..
או שתעשה לך הודעת ALERT לאישור השליחה משהו בסגנון:
רשמת : 200 נקודות אתה בטוח שברצונך לשלוח טופס זה ? כן / לא
רק לאחר בחירת התשובה הפקודות יתחילו לרוץ שזה נראה לי יותר נחמד .

while1 05-12-15 13:13

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

(דוגמא דומה - אם אתה שולח קובץ להדפסה במדפסת, אחרי שהמדפסת מתחילה לעבוד אתה יכול לצאת/למחוק את הקובץ וההדפסה עצמה תמשיך! :D )


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

ואז בתוך הלולאה, תבדוק
קוד:

if(file_exists("kill_script"){
unlink("kill_script");
die();
}


ככה, בכל מעבר של הלולאה, זה יבדוק: אם הקובץ קיים - זה ימחק אותו (כדי שיאפשר לך להריץ שוב בפעמים הבאות) ויעצור לגמרי את הסקריפט.
אם הקובץ לא קיים - הלולאה תמשיך לרוץ :)

Tyler 06-12-15 11:40

ציטוט:

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

(דוגמא דומה - אם אתה שולח קובץ להדפסה במדפסת, אחרי שהמדפסת מתחילה לעבוד אתה יכול לצאת/למחוק את הקובץ וההדפסה עצמה תמשיך! :D )


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

ואז בתוך הלולאה, תבדוק
קוד:

if(file_exists("kill_script"){
unlink("kill_script");
die();
}


ככה, בכל מעבר של הלולאה, זה יבדוק: אם הקובץ קיים - זה ימחק אותו (כדי שיאפשר לך להריץ שוב בפעמים הבאות) ויעצור לגמרי את הסקריפט.
אם הקובץ לא קיים - הלולאה תמשיך לרוץ :)

תודה רבה, זה נראה פתרון מעולה ופשוט ומהירות הלולאה לא תושפע :)


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

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