امسال ساعت رسمی کشور تغییری نداشت اما سرور های جهانی مطابق هر سال برای تغییر ساعت تنظیم شده بودند، مشکلات متعددی در خصوص این مسئله برای سرور های لینوکسی و ویندوزی که time zone آن ها به صورت خودکار برروی Asia/Tehran تنظیم بوده است، به وجود آورده است.
مشکلاتی که میتوانست زمان ثبت شده سفارشات سایت ها، زمانی که برای هر لاگ در سرور های ثبت می شده است، ساعت کلیه رخداد های ثبت شده در سرور و … را یک ساعت جلوتر نمایش دهد.
جهت اصلاح زمان سرور ها و غیرفعال سازی حالت تابستانه (Daylight Saving Time) برروی آن ها مطابق با سیستم عامل سرور و نرم افزار های آن راهکار هایی که به شرح زیر است فراهم شده است تا چالش های ساعت سرور هم رفع شده و از اختلال های احتمالی جلوگیری کند:
سیستم عاملهای Windows 10 , Windows Server 2011,2016,2019,2022
برروی سیستم عامل های ویندوزی تنها کافیست (Daylight Saving Time) را غیرفعال کنیم که جهت این امر می بایست cmd (command line) ویندوز را با استفاده از دکمه های ترکیبی window + r و تایپ cmd باز کرده و سپس دستور زیر را در آن وارد کنیم:
tzutil /s "Iran Standard Time_dstoff"
در صورتیکه از سیستم عامل های لینوکسی استفاده می کنید بسته به distribution نصب شده برروی سرور می توانید اصلاحات زمانی را انجام دهید.
اگر در سرور خود از php استفاده می کنید نیاز است ماژول timezonedb را با استفاده از pecl برای نسخه های php نصب شده برروی سرور خود نصب و فعال کنید و سپس در php.ini های نسخه ها timezone را برروی Asia/Tehran قرار دهید تا ساعت php نیز اصلاح شود.
دستورات لازم برای نصب Timezonedb برروی دایرکت ادمین:
/usr/local/phpXY/bin/pecl install timezonedb
نکته:
در دستور بالا بجای XY نسخه php مدنظر را باید قرار داد.
به طور مثال در صورتی که مایل به نصب برای php نسخه ۷.۴ هستید دستور زیر را وارد کنید
/usr/local/php74/bin/pecl install timezonedb
جهت تست پس از انجام موارد می توانید از قطعه کد زیر در php استفاده کنید.
<?php
echo "The time is " . date("h:i:sa P") . "\n";
?>قطعه کد فوق را می بایست در یک فایل php ذخیره کرده و سپس با استفاده از php آن ها را اجرا کرد.
به طور مثال:
php /home/time.php
همچنین میتوان کد را درون یک فایل در مسیر public_html هاست قرار داد و سپس از طریق مرورگر آدرس domain.com/time.php را فراخوانی نمود تا کد اجرا شود.
با اجرای کد فوق زمان php نمایش داده خواهد شد.
باتوجه به اینکه برروی سیستم عامل های لینوکسی مختلف و کنترل پنل های مختلف روش غیرفعال سازی (Daylight Saving Time) متفاوت بوده و هر کدام چالش های خود را دارد، اسکریپتی اماده شده است تا مطابق با نوع کنترل پنل و سیستم عامل سرور تغییرات لازم جهت اصلاح ساعت در php و سرور را انجام می دهد.
اسکریپت برروی کنترل پنل های DirectAdmin، cPanel و سیستم عامل های Cloudlinux و centos و ubuntu قابل اجرا می باشد:
#!/usr/bin/env sh
#======================================================#
# Scipts: Disable DST in Server #
# Verson: 1.0 #
#======================================================#
# set -x
# check os!
detectLinux()
{
if [ ! -x "$(command -v lsb_release)" ]; then
yum install redhat-lsb-core -y --skip-broken
apt-get install -y lsb-release --skip-broken
fi
LINUX=$(lsb_release -i | awk '{print $3}');
}
# DirectAdmin
if [ -e /usr/local/directadmin/directadmin ] ; then
yum update -y
apt update -y
chattr -i /etc/resolv.conf
y | cp /etc/resolv.conf /etc/resolv.conf.org
echo "nameserver 185.51.200.2" > /etc/resolv.conf
wget https://raw.githubusercontent.com/poralix/directadmin-utils/master/php/php-extension.sh -O /usr/local/directadmin/scripts/custom/php-extension.sh
chmod 750 /usr/local/directadmin/scripts/custom/php-extension.sh
/usr/local/directadmin/scripts/custom/php-extension.sh install timezonedb &
wait
y | cp /etc/resolv.conf.org /etc/resolv.conf
fi
# cloudlinux
yum update -y
apt update -y
detectLinux;
if [[ "$LINUX" == "CloudLinux" && $is_governor_installed -eq "0" ]] ; then
/opt/alt/php56/usr/bin/pecl install timezonedb &
wait
/opt/alt/php72/usr/bin/pecl install timezonedb &
wait
/opt/alt/php73/usr/bin/pecl install timezonedb &
wait
/opt/alt/php74/usr/bin/pecl install timezonedb &
wait
/opt/alt/php80/usr/bin/pecl install timezonedb &
wait
/opt/alt/php81/usr/bin/pecl install timezonedb &
wait
/opt/alt/php82/usr/bin/pecl install timezonedb &
wait
sudo perl -pi -e 's/;extension=timezonedb.so/extension=timezonedb.so/' /opt/alt/php*/link/conf/default.ini && sudo service lsws restart
fi
# cPanel
if [ -e /usr/local/cpanel/cpanel ] ; then
yum update -y
yum install -y ea-php*-php-devel
sh <(curl -s https://litespeedtech.com/packages/cpanel/buildtimezone.sh)
perl -pi -e 's/date.timezone = .*/date.timezone = \"Asia\/Tehran\"/' /opt/cpanel/ea-php*/root/etc/php.ini
perl -pi -e 's/date.timezone = .*/date.timezone = \"Asia\/Tehran\"/' /usr/local/php*/lib/php.ini
systemctl restart httpd
systemctl restart php-fpm*
systemctl restart nginx
systemctl restart lsws
fi
# testing
cat > /root/time.php << EOF
<?php echo "The time is " . date("h:i:sa P") . "\n"; ?>
EOF
php /root/time.php
rm -f /root/time.php
این قطعه کد به صورت خودکار کنترل پنل را تشخیص داده و مطابق با نوع کنترل پنل تنظیمات را انجام می دهد.
عالی بود
لطف شما نسبت به ایران سرور مایه مباهات ماست.
برای اندورید راهی هست؟
دستی بخوایم درست کنم مشکل داره باز
بله، در اندروید میتوانید از مسیر **Settings > System > Date & Time** منطقه زمانی را تغییر دهید. اگر گزینهها غیرفعال یا خاکستری بودند، ابتدا گزینه “Automatic time zone” را خاموش کنید. در برخی گوشیها ممکن است مسیر کمی متفاوت باشد.
امکانش هست در رابطه با نصب Timezonedb بروی داکر هم بگید؟
بله حتماً، برای نصب افزونه Timezonedb در محیط داکر (بهخصوص برای PHP)، معمولاً باید اون رو هنگام ساخت ایمیج با استفاده از Dockerfile نصب کنید. اگر از یک ایمیج پایه مثل `php:apache` یا `php:fpm` استفاده میکنید، میتونید با اضافه کردن خط زیر در Dockerfile، افزونه رو نصب کنید:
RUN pecl install timezonedb && docker-php-ext-enable timezonedbاین دستور باعث میشه افزونه Timezonedb به PHP اضافه بشه. بعد از ساخت مجدد کانتینر، با دستور `php -m` میتونید بررسی کنید که افزونه فعال شده یا نه. این کار برای برنامههایی مفیده که نیاز به دادههای دقیق منطقه زمانی دارند.