الخادمُ الذي انحرفت ساعتُه يُنتج أخطاءً تبدو أيَّ شيءٍ إلّا ساعة: شهاداتٌ «ليست صالحةً بعد»، ودخولٌ يفشل بكلمة مرورٍ صحيحة، ومهامُّ جدولةٍ في الساعة الخطأ. ويستحقّ الاستبعادُ المبكّر لأنّه يكلّف أمرًا واحدًا.

timedatectl

شغّل المزامنة

timedatectl set-ntp true
timedatectl show -p NTPSynchronized --value

ثلاثُ ساعاتٍ وثلاثةُ إعدادات

  • النظام — أبقِه على UTC. فيصير كلُّ سجلٍّ وكلُّ طابعٍ مخزَّن بلا لبس.
  • PHP — date.timezone، ويؤثّر فيما تطبعه date() ولا شيءَ سواه.
  • MySQL — لها time_zone خاصّ بها، ويؤثّر في NOW() وCURRENT_TIMESTAMP.
date
php -r 'echo date("Y-m-d H:i:s T"), PHP_EOL;'
mysql -e "SELECT NOW(), @@global.time_zone, @@session.time_zone;"
فإن كتبت PHP طابعًا بالتوقيت المحلّيّ وخزّنت MySQL بـ UTC انحرفت كلُّ مقارنةٍ بمقدار الفارق — ولا يلاحظ أحدٌ إلّا مرّتين في السنة، حين يتغيّر الفارق. خزّن بـ UTC، وحوّل عند العرض.

ما ينكسر حين تخطئ الساعة

  • التشفير. فشهادةٌ تصلح من الغد تُرفَض اليوم. وخطأُ المتصفّح يسمّي الشهادة لا الساعة.
  • الرموزُ والتحقّقُ بخطوتين. فرمزُ TOTP مشتقٌّ من الوقت؛ وانحرافٌ فوق ثلاثين ثانية يجعل كلَّ رمزٍ خطأً.
  • الجدولة. فالمهامّ تعمل في الساعة الخطأ، أو مرّتين، أو لا تعمل البتّة عبر تغيير.
  • مقابلةُ السجلّات. فخادمان بينهما دقائق لا يمكن قراءتهما معًا البتّة.
اضبط النظام على UTC ولا تغيّره أبدًا. واعرض التوقيت المحلّيّ للناس في آخر لحظةٍ ممكنة — في المتصفّح، من ساعتهم هم.