Vấn đề nhức nhối trên Production lúc 2 giờ sángTệp nhật ký của bạn đang "gào thét". Thay vì dữ liệu sạch sẽ, bạn thấy một làn sóng cảnh báo lặp đi lặp lại. Đây là một vấn đề production kinh điển: một cấu hình sai sót duy nhất đang làm đầy tệp nhật ký lỗi của bạn thêm 500MB và che lấp các lỗi thực sự dưới một núi nhiễu. PHP đang phàn nàn vì nó không thể tìm thấy múi giờ đáng tin cậy cho hàm date() của mình.
PHP Warning: date(): It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function.
Đây không phải là một lỗi nghiêm trọng (fatal error), nhưng nó làm hỏng hệ thống giám sát của bạn. Kể từ khi phát hành PHP 5.3 vào năm 2009, bộ máy PHP đã thực thi nghiêm ngặt việc xử lý thời gian rõ ràng. Nó từ chối đoán dựa trên các thiết lập hệ điều hành không thể dự đoán trước. Nếu bạn không cho PHP biết chính xác múi giờ nào cần sử dụng, nó sẽ đưa ra cảnh báo để buộc tính nhất quán trên các môi trường máy chủ khác nhau.
Tại sao điều này lại xảy raNếu không có múi giờ được xác định, PHP sẽ sử dụng biến môi trường TZ của hệ thống hoặc đồng hồ cục bộ. Nếu những thông tin này có vẻ đáng ngờ hoặc bị thiếu, cảnh báo sẽ được kích hoạt. Việc xác định rõ ràng múi giờ đảm bảo ứng dụng của bạn hoạt động giống nhau cho dù nó đang chạy trên trung tâm dữ liệu ở New York hay vùng đám mây ở Singapore.
Bước 1: Cách khắc phục vĩnh viễn (Chỉnh sửa php.ini)Giải pháp mạnh mẽ nhất là thiết lập chỉ thị date.timezone trên toàn cầu. Điều này đảm bảo mọi tập lệnh trên máy chủ của bạn đều sử dụng cùng một điểm tham chiếu.
- Xác định vị trí tệp cấu hình. Chạy lệnh
php -i | grep "Loaded Configuration File"từ terminal của bạn. Các máy chủ web như Nginx (FPM) hoặc Apache thường sử dụng các tệp cấu hình khác với CLI. Ví dụ, hãy kiểm tra/etc/php/8.3/fpm/php.iniso với/etc/php/8.3/cli/php.ini.- Mở tệp với quyền root:sudo nano /etc/php/8.3/fpm/php.ini- Tìm phần [Date]. Phần này thường nằm ở khoảng dòng 940. Tìm kiếm dòng;date.timezone =.- Bỏ dấu chú thích và thiết lập múi giờ của bạn:[Date] date.timezone = "UTC"Mẹo nhỏ: Sử dụng "UTC" cho máy chủ để tránh nhầm lẫn về Giờ tiết kiệm ánh sáng ban ngày (Daylight Saving Time), hoặc tìm khu vực của bạn trong danh sách chính thức.- Khởi động lại các dịch vụ của bạn:```
Cho Nginx/PHP-FPM
sudo systemctl restart php8.3-fpm
Cho Apache
sudo systemctl restart apache2
```### Bước 2: Cách khắc phục ở cấp độ ứng dụngNgười dùng hosting chia sẻ (shared hosting) không thể can thiệp vào php.ini có thể khắc phục điều này trực tiếp trong mã nguồn. Điều này cũng lý tưởng cho các ứng dụng đa người thuê nơi người dùng sống ở các khu vực khác nhau. Thêm dòng này vào tệp bootstrap của bạn (như index.php hoặc config.php) trước khi gọi bất kỳ hàm nào liên quan đến thời gian:
<?php
date_default_timezone_set('America/Los_Angeles');
// Các lệnh gọi hàm date của bạn giờ đây sẽ không còn cảnh báo
echo date('Y-m-d H:i:s');
?>
Bước 3: Khắc phục cho môi trường Docker hoặc CLINếu bạn đang chạy một tập lệnh thực thi một lần hoặc một ứng dụng được container hóa, hãy truyền múi giờ dưới dạng biến môi trường. PHP sẽ tôn trọng biến TZ nếu cấu hình toàn cầu bị thiếu.
# Chạy tập lệnh cục bộ với một múi giờ cụ thể
TZ="Europe/Paris" php my_script.php
# Trong Dockerfile của bạn
ENV TZ=UTC

