خب سلام. امشب میخوام اولین مطلب این وبلاگ رو منتشر کنم و قاعدتا همونجور که از قدیم گفتن، بچه اول مال کلاغهاست.مساله اینه که من تقریبا یک هفته پیش در پادکستی به نام PHP Internal News اپیزودی رو گوش کردم که این عنوان رو داشت.fsync: Buffers All The Way Down
چند ماهی هست که با MySQL سر و کله میزنم و به لطف کتاب High Performance MySQL: Optimization, Backups, Replication, and More کمی با ساختار و نحوه کارکردش آشنا شدم. آخرین قسمت از کتاب رو که داشتم میخوندم، در مورد نحوه ذخیره سازی داده روی دیسک بود و از تابع fsync اسم برده بود.
وقتی چشمم به عنوان این اپیزود از پادکست رسید حدس زدم باید اطلاعات جالبی در موردش بهم بده. و خب حدسم صحیح بود.تابع fsync تا اونجا که من فهمیدم برای اطمینان حاصل کردن از نوشته شدن داده روی دیسک به کار میره و برخلاف سایر زبان ها، در PHP پیاده سازی نشده.
تصورم این بود که خب چیز مهمی رو از دست ندادم و احتمالا خیلی کم با نبود این تابع مواجه بشم. که اینجا حدسم اشتباه بود و خیلی زود، یعنی در واقع همین امروز با عدم وجود تابع fsync در PHP مواجه شدم. ماجرا از این قرار هست که برای جلوگیری از race condition در یک حلقه بینهایت، با استفاده از Cache لاراول، یک Lock رو در فایل مینویسم.
منتها سرعت اجرای حلقه از سرعت نوشته شدن Lock در دیسک بسیار بیشتر هست. پس قاعدتا وقتی فرمان نوشتن به دیسک ارسال میشه، دیسک این فرمان رو اجرا میکنه، منتها در buffer خودش مینویسه. وقتی حلقه میخواد دوباره اجرا بشه، ابتدا وجود Lock رو بررسی میکنه ولی چون Lock هنوز نوشته نشده، پس به اجرا شدن ادامه میده.
فرصت بسیار خوبی هست تا تابع fsync رو به Cache لاراول در قالب یک PR اضافه کرد. مسلما کسی که بتونه این کار رو بکنه نشوندهنده دانش خوبش در PHP و لاراول هست و رزومه خوبی براش میشه.