الخادمُ الذي انحرفت ساعتُه يُنتج أخطاءً تبدو أيَّ شيءٍ إلّا ساعة: شهاداتٌ «ليست صالحةً بعد»، ودخولٌ يفشل بكلمة مرورٍ صحيحة، ومهامُّ جدولةٍ في الساعة الخطأ. ويستحقّ الاستبعادُ المبكّر لأنّه يكلّف أمرًا واحدًا.
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 ولا تغيّره أبدًا. واعرض التوقيت المحلّيّ للناس في آخر لحظةٍ ممكنة — في المتصفّح، من ساعتهم هم.