Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: czechsys 12. 04. 2023, 16:19:26
-
php.ini:
root@testphp:/opt# grep timezone /etc/php/8.?/cli/php.ini
/etc/php/8.1/cli/php.ini:; Defines the default timezone used by the date functions
/etc/php/8.1/cli/php.ini:; https://php.net/date.timezone
/etc/php/8.1/cli/php.ini:;date.timezone =
/etc/php/8.2/cli/php.ini:; Defines the default timezone used by the date functions
/etc/php/8.2/cli/php.ini:; https://php.net/date.timezone
/etc/php/8.2/cli/php.ini:;date.timezone =
Skript:
cat /opt/date.php
<?php
$date = date('Y-m-d H:i:s');
echo $date;
echo "\n";
?>
Testy:
root@testphp:/opt# /usr/bin/php8.2 /opt/date.php
2023-04-12 14:00:22
root@testphp:/opt# /usr/bin/php8.1 /opt/date.php
2023-04-12 16:00:26
root@testphp:/opt# timedatectl
Local time: Wed 2023-04-12 16:00:34 CEST
Universal time: Wed 2023-04-12 14:00:34 UTC
RTC time: Wed 2023-04-12 14:00:35
Time zone: Europe/Prague (CEST, +0200)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
root@testphp:~# apt-cache policy php8.2-cli
php8.2-cli:
Installed: 8.2.4-1+0~20230409.18+debian11~1.gbp556b04
Candidate: 8.2.4-1+0~20230409.18+debian11~1.gbp556b04
Version table:
*** 8.2.4-1+0~20230409.18+debian11~1.gbp556b04 990
990 https://packages.sury.org/php bullseye/main amd64 Packages
100 /var/lib/dpkg/status
root@testphp:~# apt-cache policy php8.1-cli
php8.1-cli:
Installed: 8.1.17-1+0~20230409.38+debian11~1.gbp0c3ecb
Candidate: 8.1.17-1+0~20230409.38+debian11~1.gbp0c3ecb
Version table:
*** 8.1.17-1+0~20230409.38+debian11~1.gbp0c3ecb 990
990 https://packages.sury.org/php bullseye/main amd64 Packages
100 /var/lib/dpkg/status
Je to bug ci ne? Nemuzu najit v release notes php8.2, co by se k tomu dalo priradit.
-
Ja mam v gentoo config per verzi, takze mozna ti vypadl konfiguracni radek? -- vidim ze asi ne.
Udelej si tedy dump runtime nastaveni - treba z ini_get_all a udelej diff
https://www.php.net/manual/en/function.ini-get-all.php
Pripadne ten timezone zkontroluj pres date_default_timezone_get
https://www.php.net/manual/en/function.date-default-timezone-get.php
-
Ak timezone nieje nastavena cez date_default_timezone_set() a ani v php.ini (tvoj pripad) tak defaultna timezona je UTC, takze 8.2 to ma spravne.
-
Je dobre vzdy pouzit casovu zonu:
date('Y-m-d H:i:s T') alebo pouzit gmdate('Y-m-d H:i:s') ktore vzdy pracuje s GMT. Bolo by vam ihned jasne o aky cas ide. Ak by ten cas videl niekto z inej casovej zony, tak by uz vobec nevedel ktora bije...
-
Koukám správně, že v php.ini jsou oba řádky s proměnnou "date.timezone =" zakomentované?
Tzn. se použije nějaký compile-time default?
Vidím dva balíčky, které mají v názvu "debian", různé číslo verze, ale stejné datum... to vznikne jak? Je to přirozená vlastnost nějakého upstream build systému, nebo jste si je kompiloval a balil sám? (vrtá mi hlavou možná další souvislost třeba s locale v okamžiku kompilace)
-
Koukám správně, že v php.ini jsou oba řádky s proměnnou "date.timezone =" zakomentované?
Tzn. se použije nějaký compile-time default?
Default je UTC (https://www.php.net/manual/en/datetime.configuration.php)
-
Koukám správně, že v php.ini jsou oba řádky s proměnnou "date.timezone =" zakomentované?
Tzn. se použije nějaký compile-time default?
Vidím dva balíčky, které mají v názvu "debian", různé číslo verze, ale stejné datum... to vznikne jak? Je to přirozená vlastnost nějakého upstream build systému, nebo jste si je kompiloval a balil sám? (vrtá mi hlavou možná další souvislost třeba s locale v okamžiku kompilace)
vzdyt je v tom vypisu videt ze je to z packages.sury.org...Takze zadna kompilace.
-
Ak timezone nieje nastavena cez date_default_timezone_set() a ani v php.ini (tvoj pripad) tak defaultna timezona je UTC, takze 8.2 to ma spravne.
Tim jste nevysvetlil, proc to ma 8.1 jinak.
-
Ja mam v gentoo config per verzi, takze mozna ti vypadl konfiguracni radek? -- vidim ze asi ne.
Udelej si tedy dump runtime nastaveni - treba z ini_get_all a udelej diff
https://www.php.net/manual/en/function.ini-get-all.php
Pripadne ten timezone zkontroluj pres date_default_timezone_get
https://www.php.net/manual/en/function.date-default-timezone-get.php
8.1 ini_get_all();
[date.timezone] => Array
(
[global_value] =>
[local_value] =>
[access] => 7
)
8.1 date_default_timezone_get():
2023-04-13 08:47:47
string(13) "Europe/Berlin"
8.2 ini_get_all():
[date.timezone] => Array
(
[global_value] => UTC
[local_value] => UTC
[access] => 7
)
8.2 date_default_timezone_get:
2023-04-13 06:47:44
string(3) "UTC"
-
Ve verzi 8.1 se pri nenastaveni date.timezone vzalo nastaveni systemu a PHP vyhazovalo varovani:
It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
Je tedy otazka, jestli nemate skryta varovani.
Od verze 8.2 je toto varovani pryc a pouziva se UTC jako default.
-
Ono tam bylo dlouhou dobu warning, ktery znel takto:
Strict Standards: date(): It is not safe to rely on the system's timezone settings.
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/New_York' for 'EDT/-4.0/DST' instead in /filelocation right here/system/libraries/Log.php on line 86
Samozrejme kdyz mas ty chybove hlasky potlaceny (produkcni nasazeni), tak se to da prehlidnout. Ale kdyz jsem je mel povoleny, nebo presmerovany do error logu a hlidal to, tak jsem si tohoto nekolikrat vsiml a donutilo me to explicitne upravit php.ini - coz je asi dobre nastavena politika, kdyz chces mit neco spolehliveho.
Pokud muzes experimentovat, mohl bys zapnout:
error_reporting = E_ALL
display_errors = stderr
U sebe nemam nastaveno v .ini nic, a obe verze produkuji UTC:
$ echo '<?php echo date("Y-m-d H:i:s T\n"), date_default_timezone_get(), "\n"; ?>' | /usr/bin/php8.1
2023-04-13 07:55:02 UTC
UTC
$ echo '<?php echo date("Y-m-d H:i:s T\n"), date_default_timezone_get(), "\n"; ?>' | /usr/bin/php8.2
2023-04-13 07:55:04 UTC
UTC
-
Zapnul jsem zobrazovani chyb:
root@testphp:/etc/php/8.1/cli# grep display_errors /etc/php/8.?/cli/php.ini
/etc/php/8.1/cli/php.ini:; display_errors
/etc/php/8.1/cli/php.ini:;display_errors = Off
/etc/php/8.1/cli/php.ini:display_errors = On
/etc/php/8.1/cli/php.ini:; separately from display_errors. We strongly recommend you set this to 'off'
/etc/php/8.2/cli/php.ini:; display_errors
/etc/php/8.2/cli/php.ini:;display_errors = Off
/etc/php/8.2/cli/php.ini:display_errors = On
/etc/php/8.2/cli/php.ini:; separately from display_errors. We strongly recommend you set this to 'off'
root@testphp:/etc/php/8.1/cli# grep error_reporting /etc/php/8.?/cli/php.ini
/etc/php/8.1/cli/php.ini:; error_reporting
/etc/php/8.1/cli/php.ini:;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
/etc/php/8.1/cli/php.ini:error_reporting = E_ALL
/etc/php/8.2/cli/php.ini:; error_reporting
/etc/php/8.2/cli/php.ini:;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
/etc/php/8.2/cli/php.ini:error_reporting = E_ALL
root@testphp:/etc/php/8.1/cli# /usr/bin/php8.1 /opt/date.php
2023-04-13 10:08:44
string(13) "Europe/Berlin"
root@testphp:/etc/php/8.1/cli# /usr/bin/php8.2 /opt/date.php
2023-04-13 08:08:48
string(3) "UTC"
Doplnil jsem do date parametr "T":
root@testphp:/opt# cat date.php
<?php
$date = date('Y-m-d H:i:s T');
echo $date;
echo "\n";
var_dump(date_default_timezone_get());
echo "\n";
?>
root@testphp:/opt# /usr/bin/php8.1 /opt/date.php
2023-04-13 10:11:26 CEST
string(13) "Europe/Berlin"
root@testphp:/opt# /usr/bin/php8.2 /opt/date.php
2023-04-13 08:11:28 UTC
string(3) "UTC"
root@testphp:/etc/php/8.1/cli# cat /etc/timezone
Europe/Prague
Dalsi zajimavost, proc vraci php timezone Europe/Berlin, kdyz mam nastaveno Europe/Prague :-)
-
Ve verzi 8.1 se pri nenastaveni date.timezone vzalo nastaveni systemu a PHP vyhazovalo varovani:
It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
Je tedy otazka, jestli nemate skryta varovani.
Od verze 8.2 je toto varovani pryc a pouziva se UTC jako default.
Tohle by bylo zrejme to, co hledam, ale kde je takovahle zmena zapsana? nejaky release notes/commit?
-
Dalsi zajimavost, proc vraci php timezone Europe/Berlin, kdyz mam nastaveno Europe/Prague :-)
To je asi duvod, proc se nemelo spolehat na spravnou detekci ze systemu :-)
-
Tohle by bylo zrejme to, co hledam, ale kde je takovahle zmena zapsana? nejaky release notes/commit?
Priznam se, ze ted jsem zmaten. U sveho tvrzeni jsem vychazel ze zmeny dokumentace default hodnoty (https://github.com/php/doc-en/commit/4bf21e8867650755d5dea13e01049d2825486ea2), ktera probehla minuly rok.
Kdyz jsem se ale podival na PR (https://github.com/php/doc-en/pull/1238), na ktery odkazuje, tak tam se zminuje commit (https://github.com/php/php-src/commit/b22caa81ee2797572279fc9aff0918c01f708de5), ktery je z roku 2015.
-
root@testphp:/etc/php/8.1/cli# cat /etc/timezone
Europe/Prague
Dalsi zajimavost, proc vraci php timezone Europe/Berlin, kdyz mam nastaveno Europe/Prague :-)
php.ini nie je jediny konfigurak ktory php pouzije. Kludne to mozes mat prepisane niekde inde.
Ked tak si vypis ktore konfiguraky natahuje:
/usr/bin/php8.1 --ini
/usr/bin/php8.2 --ini
-
root@testphp:/etc/php/8.1/cli# cat /etc/timezone
Europe/Prague
Dalsi zajimavost, proc vraci php timezone Europe/Berlin, kdyz mam nastaveno Europe/Prague :-)
php.ini nie je jediny konfigurak ktory php pouzije. Kludne to mozes mat prepisane niekde inde.
Ked tak si vypis ktore konfiguraky natahuje:
/usr/bin/php8.1 --ini
/usr/bin/php8.2 --ini
root@testphp:~# /usr/bin/php8.1 --ini
Configuration File (php.ini) Path: /etc/php/8.1/cli
Loaded Configuration File: /etc/php/8.1/cli/php.ini
Scan for additional .ini files in: /etc/php/8.1/cli/conf.d
Additional .ini files parsed: /etc/php/8.1/cli/conf.d/10-opcache.ini,
/etc/php/8.1/cli/conf.d/10-pdo.ini,
/etc/php/8.1/cli/conf.d/20-calendar.ini,
/etc/php/8.1/cli/conf.d/20-ctype.ini,
/etc/php/8.1/cli/conf.d/20-exif.ini,
/etc/php/8.1/cli/conf.d/20-ffi.ini,
/etc/php/8.1/cli/conf.d/20-fileinfo.ini,
/etc/php/8.1/cli/conf.d/20-ftp.ini,
/etc/php/8.1/cli/conf.d/20-gettext.ini,
/etc/php/8.1/cli/conf.d/20-iconv.ini,
/etc/php/8.1/cli/conf.d/20-phar.ini,
/etc/php/8.1/cli/conf.d/20-posix.ini,
/etc/php/8.1/cli/conf.d/20-readline.ini,
/etc/php/8.1/cli/conf.d/20-shmop.ini,
/etc/php/8.1/cli/conf.d/20-sockets.ini,
/etc/php/8.1/cli/conf.d/20-sysvmsg.ini,
/etc/php/8.1/cli/conf.d/20-sysvsem.ini,
/etc/php/8.1/cli/conf.d/20-sysvshm.ini,
/etc/php/8.1/cli/conf.d/20-tokenizer.ini
root@testphp:~# /usr/bin/php8.2 --ini
Configuration File (php.ini) Path: /etc/php/8.2/cli
Loaded Configuration File: /etc/php/8.2/cli/php.ini
Scan for additional .ini files in: /etc/php/8.2/cli/conf.d
Additional .ini files parsed: /etc/php/8.2/cli/conf.d/10-opcache.ini,
/etc/php/8.2/cli/conf.d/10-pdo.ini,
/etc/php/8.2/cli/conf.d/20-calendar.ini,
/etc/php/8.2/cli/conf.d/20-ctype.ini,
/etc/php/8.2/cli/conf.d/20-exif.ini,
/etc/php/8.2/cli/conf.d/20-ffi.ini,
/etc/php/8.2/cli/conf.d/20-fileinfo.ini,
/etc/php/8.2/cli/conf.d/20-ftp.ini,
/etc/php/8.2/cli/conf.d/20-gettext.ini,
/etc/php/8.2/cli/conf.d/20-iconv.ini,
/etc/php/8.2/cli/conf.d/20-phar.ini,
/etc/php/8.2/cli/conf.d/20-posix.ini,
/etc/php/8.2/cli/conf.d/20-readline.ini,
/etc/php/8.2/cli/conf.d/20-shmop.ini,
/etc/php/8.2/cli/conf.d/20-sockets.ini,
/etc/php/8.2/cli/conf.d/20-sysvmsg.ini,
/etc/php/8.2/cli/conf.d/20-sysvsem.ini,
/etc/php/8.2/cli/conf.d/20-sysvshm.ini,
/etc/php/8.2/cli/conf.d/20-tokenizer.ini
Zadny rozdil...
-
Hele, a ono to je nejaky Debian / Ubuntu, protoze to distribuce dokazou nekdy pekne zm**at, jsem stahnul source package z:
https://packages.ubuntu.com/lunar/php8.1-cli
A vidim tam soubor: ./patches/0022-Use-system-timezone.patch - ktery natajnacku cuca TZ ze systemovyho locale.
A taky obsahuje velice vystizny popis v hlavicce, ze to lidem radi rozbijeme napric nazoru upstreamu:
From: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Date: Sat, 2 May 2015 10:26:56 +0200
Subject: Use system timezone
Upstream don't want this patch. See
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=730771 for a summary.
This delta is recovered from previous versions of the system timezone patch in
Debian, and appears to have inadvertently been dropped. Author unknown.
To be used in tandem with use_embedded_timezonedb.patch and use_embedded_timezonedb_fixes.patch.
---
ext/date/php_date.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 9844618..1a30313 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -545,6 +545,23 @@ static char* guess_timezone(const timelib_tzdb *tzdb)
DATEG(timezone_valid) = 1;
return DATEG(default_timezone);
}
+ /* Try to guess timezone from system information */
+ {
+ struct tm *ta, tmbuf;
+ time_t the_time;
+ char *tzid = NULL;
+
+ the_time = time(NULL);
+ ta = php_localtime_r(&the_time, &tmbuf);
+ if (ta) {
+ tzid = timelib_timezone_id_from_abbr(ta->tm_zone, ta->tm_gmtoff, ta->tm_isdst);
+ }
+ if (! tzid) {
+ tzid = "UTC";
+ }
+
+ return tzid;
+ }
/* Fallback to UTC */
return "UTC";
}
Imho v 8.2 tento patch mozna uz neni a pochopili ze vnaset odlisnosti nestoji za to.. takze s 8.2 sedi PHP dokumentace uz presne.
-
Je to sice debian 11, ale php je z packages.sury.org/php
V release notes pro packages.debian.org je v release notes akorat info o prechod na 8.2 :D No uz je to tak nejak fuk, holt se to nastavi nekterym z uvedenych zpusobu a nebude se uz spolehat na automaticke vyuziti systemovych nastaveni.
-
Po zkušenostech raději tahám datum a čas z databáze. Už se mi totiž stalo, že se čas v PHP a v databázi rozešly a bylo to docela nepříjemné.