یکی از مشکلاتی که ممکن است در سرورهای لینوکسی دارای کنترلپنل cPanel مشاهده شود، اختلاف ساعت نمایشدادهشده در PHP با ساعت واقعی است.برای مثال، ممکن است منطقه زمانی PHP روی Asia/Tehran تنظیم شده باشد، اما زمان نمایشدادهشده در سایت چند ساعت با زمان واقعی اختلاف داشته باشد.در چنین شرایطی، ممکن است تصور شود مشکل از تنظیمات Timezone در PHP است؛ درحالیکه گاهی مشکل اصلی از تنظیم نبودن ساعت سیستمعامل یا همگام نبودن آن با سرورهای NTP ناشی میشود.در این آموزش، نحوه بررسی و رفع مشکل اختلاف ساعت PHP در سرورهای CloudLinux 8 را مرحلهبهمرحله بررسی میکنیم.
۱. بررسی تنظیمات ساعت PHP
ابتدا باید مطمئن شویم منطقه زمانی PHP بهدرستی تنظیم شده است.برای این کار میتوان از کد زیر استفاده کرد:
<?php
echo "PHP Version: " . PHP_VERSION . "<br>";
echo "PHP Timezone: " . date_default_timezone_get() . "<br>";
echo "PHP Date: " . date('Y-m-d H:i:s') . "<br>";
echo "PHP Timestamp: " . time() . "<br>";
echo "UTC Date: " . gmdate('Y-m-d H:i:s') . "<br>";
?>
اگر خروجی مشابه زیر باشد:
PHP Timezone: Asia/Tehran
PHP Date: ۱۴۰۵/۰۸/۰۸ 12:08:10
UTC Date: ۱۴۰۵/۰۸/۰۸ 08:38:10
مشخص است که منطقه زمانی PHP روی تهران تنظیم شده و اختلاف ۳ ساعت و ۳۰ دقیقهای با UTC نیز بهدرستی اعمال شده است.بنابراین باید ساعت پایه سیستمعامل را نیز بررسی کنیم.
۲. بررسی ساعت سیستمعامل لینوکس
با دسترسی SSH و کاربر root دستورات زیر را اجرا میکنیم:
date
برای مشاهده ساعت UTC:
date -u
همچنین برای بررسی وضعیت تنظیمات زمان سیستم:
timedatectl status
در خروجی این دستور باید موارد زیر بررسی شوند:
-
Local time: ساعت محلی سرور
-
Universal time: ساعت UTC
-
Time zone: منطقه زمانی سیستمعامل
-
System clock synchronized: وضعیت همگامسازی ساعت
-
NTP service: وضعیت سرویس همگامسازی زمان
اگر ساعت سیستمعامل با زمان واقعی اختلاف داشته باشد، حتی با تنظیم صحیح Timezone در PHP نیز زمان نمایشدادهشده در سایت اشتباه خواهد بود.
۳. بررسی سرویس NTP در CloudLinux 8
در سیستمعامل CloudLinux 8، سرویس Chrony برای همگامسازی ساعت با سرورهای NTP استفاده میشود.ابتدا وضعیت نصب بودن بسته Chrony را بررسی میکنیم:
rpm -q chrony
سپس وضعیت سرویس را مشاهده میکنیم:
systemctl status chronyd
اگر سرویس در وضعیت failed یا inactive باشد، ممکن است ساعت سیستمعامل بهدرستی همگامسازی نشود.برای بررسی وضعیت فایلهای سرویس نیز میتوان از دستور زیر استفاده کرد:
systemctl list-unit-files | grep chronyd
۴. بررسی علت اجرا نشدن Chrony
برای مشاهده خطاهای ثبتشده توسط سرویس:
journalctl -u chronyd -n 100 --no-pager
این دستور آخرین گزارشهای سرویس Chrony را نمایش میدهد.
در برخی شرایط ممکن است خطاهایی مانند زیر مشاهده شوند:
Failed to start NTP client/server.
Read-only file system
این خطا نشان میدهد سرویس هنگام اجرا با مشکل دسترسی به فایلسیستم مواجه شده است.در چنین شرایطی باید وضعیت فایلسیستم، محدودیتهای سرویس و گزارشهای سیستم بررسی شوند.
۵. بررسی تنظیمات سرورهای NTP
فایل اصلی تنظیمات Chrony در CloudLinux 8 معمولاً در مسیر زیر قرار دارد:
/etc/chrony.conf
برای مشاهده منابع زمانی تعریفشده:
grep -nE '^(pool|server|peer)' /etc/chrony.conf
در صورتی که سرورهای NTP فعلی در دسترس نباشند، میتوان از منابع زمانی معتبر دیگری استفاده کرد.
برای ویرایش فایل:
nano /etc/chrony.conf
برای نمونه میتوان از تنظیمات زیر استفاده کرد:
server time.cloudflare.com iburst
pool 2.pool.ntp.org iburst
این تنظیمات دو منبع زمانی برای همگامسازی ساعت معرفی میکنند.توجه داشته باشید که اگر در فایل تنظیمات منابع قدیمی و غیرقابلدسترسی وجود دارند، باید وضعیت آنها نیز بررسی شود.همچنین بهتر است در صورت وجود NTP داخلی از طرف دیتاسنتر یا شرکت ارائهدهنده سرور، از همان منبع استفاده شود.
۶. بررسی دسترسی شبکه به سرور NTP
پروتکل NTP معمولاً از UDP پورت 123 استفاده میکند.بنابراین باید اطمینان حاصل کنیم که فایروال سرور یا محدودیتهای شبکه دیتاسنتر مانع ارتباط خروجی با این پورت نشده باشند.برای بررسی اولیه DNS سرور NTP:
getent ahosts time.cloudflare.com
نکته مهم: خطای اتصال به سرویس rdate روی TCP پورت 37 به معنی مسدود بودن NTP نیست؛ زیرا این دو سرویس از پروتکلها و پورتهای متفاوتی استفاده میکنند.
۷. راهاندازی سرویس Chrony
پس از بررسی تنظیمات و اطمینان از صحت فایل پیکربندی، سرویس را اجرا میکنیم:
systemctl start chronyd
برای اطمینان از اجرای صحیح سرویس:
systemctl status chronyd --no-pager
اگر سرویس با موفقیت اجرا شده باشد، باید وضعیت زیر را مشاهده کنیم:
Active: active (running)
برای فعال بودن سرویس پس از راهاندازی مجدد سرور نیز میتوان از دستور زیر استفاده کرد:
systemctl enable chronyd
۸. بررسی همگامسازی ساعت با NTP
پس از اجرای موفق Chrony، باید مطمئن شویم که سرور واقعاً به منابع زمانی متصل شده است. برای مشاهده وضعیت همگامسازی:
chronyc tracking
در خروجی این دستور، مقدار زیر اهمیت زیادی دارد:
Leap status: Normal
برای مشاهده منابع زمانی:
chronyc sources -v
اگر کنار یکی از منابع علامت ^* مشاهده شود، یعنی آن منبع بهعنوان منبع زمانی انتخابشده است.
در نهایت وضعیت کلی ساعت سیستم را بررسی میکنیم:
timedatectl status
در حالت مطلوب باید مقدار زیر را مشاهده کنیم:
System clock synchronized: yes
۹. بررسی نهایی ساعت PHP
پس از برطرف شدن مشکل همگامسازی ساعت سیستمعامل، مجدداً کد تست PHP را اجرا میکنیم.
<?php
echo "PHP Timezone: " . date_default_timezone_get() . "<br>";
echo "PHP Date: " . date('Y-m-d H:i:s') . "<br>";
echo "UTC Date: " . gmdate('Y-m-d H:i:s') . "<br>";
?>
در این مرحله ساعت PHP باید با ساعت صحیح سیستمعامل هماهنگ باشد و اختلاف زمانی ناشی از عقب یا جلو بودن ساعت سرور برطرف شده باشد.
جمعبندی
در این مقاله ، مشکل اختلاف ساعت سایت با وجود تنظیم صحیح منطقه زمانی PHP رخ داده بود.بررسیها نشان دادند که مشکل از همگام نبودن ساعت سیستمعامل با منابع زمانی NTP و اجرا نشدن سرویس Chrony بود. با بررسی تنظیمات Chrony، راهاندازی مجدد سرویس و اطمینان از اجرای صحیح آن، مشکل برطرف شد. بنابراین هنگام مواجهه با اختلاف ساعت PHP، همیشه لازم نیست تنظیمات PHP یا فایل php.ini را تغییر دهیم. بهتر است ابتدا ساعت سیستمعامل و وضعیت سرویس NTP بررسی شود.
نکته : در سرورهای اشتراکی، تغییر دستی ساعت سیستمعامل میتواند روی Cron Jobها، لاگها، زمان اجرای اسکریپتها و سرویسهای دیگر تأثیر بگذارد. بنابراین بهتر است اصلاح ساعت از طریق همگامسازی صحیح NTP انجام شود.