בירור | בדיקה האם קוד מסויים עובד ברקע
-
יש לי קוד PHP שכותב לקובץ בימות המשיח ע"י לקיחת הטקסט הקיים בקובץ, עיבוד והעלאה מחדש
הבעיה היא שאם יקרה שהקוד יופעל פעמיים באותו שניה אז אחד משניהם לא ייקלט, כי שניהם לקחו טקסט אחד וכל אחד עיבד את מה שהוא רצה לעבד ומחזיר את מה שיצא אחרי העיבוד שלו כך שמה שיהיה בסופו של דבר בקובץ הוא מה שהקוד השני עיבד אבל התיקון של הקוד הראשון נשמט
השאלה האם אפשר לעשות איזשהוא בדיקה האם הקוד עובד כבר עוד פעם, ואם כן שיחכה עד שיסיים לעבוד ואז הוא יתחיל?
מקווה שהובנתי... -
@yossiz זה ממש רעיון טוב ואני גם הוספתי לולאת while שמחכה 5 שניות בין ריצה לריצה עד שהקובץ ייפתח
שאלתי את GPT מה עושים אם יש כמה תהליכים שמחכים - יכול להיות שבסוף כולם ידחפו לפני מי שהיה הראשון
אז הוא הביא לי את זה$fp = fopen('/tmp/php-commit.lock', 'r+'); $max_attempts = 10; // מספר מקסימלי של ניסיונות $attempts = 0; while (!flock($fp, LOCK_EX | LOCK_NB)) { if (++$attempts >= $max_attempts) { error_log("Could not acquire lock after $max_attempts attempts."); fclose($fp); exit("Could not acquire lock after $max_attempts attempts."); } // המתן זמן אקראי בין 5 ל-15 שניות ונסה שוב $wait_time = rand(5, 15); error_log("Attempt $attempts failed. Waiting $wait_time seconds before retrying."); sleep($wait_time); } // ... do stuff fclose($fp); error_log("Lock acquired and file processed.");
אבל אני עדיין חושב שזה לא מספיק כי אם הקוד לוקח שני שניות, אז יכול להיות שבשני שניות הללו יהיו שלוש קריאות והשלישי בסוף יידחף לפני הראשון ובסוף יווצר מצב שפקודה שנשלחה לפני דקה עוד לא בוצעה למעשה...
יש מה לעשות לזה? -
@ששא כתב בבירור | בדיקה האם קוד מסויים עובד ברקע:
מה עושים אם יש כמה תהליכים שמחכים - יכול להיות שבסוף כולם ידחפו לפני מי שהיה הראשון
לא הבנתי את השאלה שלך.
ממה נפשך, אם הסדר בין הפעולות חשוב, אז בכל מקרה אתה בבעיה כי בתעבורת רשת אי אפשר לסמוך שהבקשה שנשלחה ראשונה הגיעה ראשונה
ואם הסדר לא משנה, לא הבנתי מה הבעיה בכלל -
@yossiz כתב בבירור | בדיקה האם קוד מסויים עובד ברקע:
ממה נפשך, אם הסדר בין הפעולות חשוב, אז בכל מקרה אתה בבעיה כי בתעבורת רשת אי אפשר לסמוך שהבקשה שנשלחה ראשונה הגיעה ראשונה
זה חשוב לי
אבל אתה אומר שממילא אין מה לעשות, אז אין מה לעשות...@yossiz כתב בבירור | בדיקה האם קוד מסויים עובד ברקע:
אגב, זה טעות להשתמש במקרה שלך בדגל LOCK_NB
הדגל הזה מיועד למי שרוצה שהפונקציה תיכשל אם הקובץ נעול.זה מה שנתנו בדוגמא שהבאת, אבל במחשבה שניה זה נעשה לתקוע את הקוד ואני הרי רוצה לחכות אז אכן עדיף להוריד את זה ואז לא צריך בית חולים ליד הגשר...
תודה על הסבת תשומת הלב
-
@ששא כתב בבירור | בדיקה האם קוד מסויים עובד ברקע:
אבל אתה אומר שממילא אין מה לעשות, אז אין מה לעשות...
אם יש כמה שניות בין שליחה לשליחה, רוב הסיכויים שהם יגיעו לפי הסדר, אני רק סבור שאם זה חשוב מאוד, אז כדאי לוודא בצורה יותר בטוחה שהם יטופלו לפי הסדר
(אם נניח שאתה בטוח שהבקשות הגיעו לפי הסדר), לגבי שאלת שחרור הנעילה של הקובץ לפי הסדר, עיין כאן דברים מחכימים
-
@ששא לא פירטת איזה סוג עיבוד אתה עושה לטקסט אבל אם כל מה שאתה עושה זה להוסיף תוכן או לשנות תוכן של key value תוכל להשתמש בקריאה לעדכון קובץ ext.ini בשלוחה X ובגמר הפעולה לשכפל אותו לשלוחת Y עם שם הקובץ הרלוונטי. כך בעצם יוצא שאתה רק דוחף עדכון לקובץ ולא מעלה אותו כל פעם מחדש.