Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: czechsys 12. 04. 2023, 16:19:26

Název: PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: czechsys 12. 04. 2023, 16:19:26
php.ini:
Kód: [Vybrat]
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:
Kód: [Vybrat]
cat /opt/date.php
<?php

$date 
date('Y-m-d H:i:s');
echo 
$date;
echo 
"\n";
?>

Testy:
Kód: [Vybrat]
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

Kód: [Vybrat]
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.
Název: Re:php8.2 nevraci ve funkci date cas s timezone
Přispěvatel: RDa 12. 04. 2023, 16:28:41
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
Název: Re:php8.2 nevraci ve funkci date cas s timezone
Přispěvatel: user398 12. 04. 2023, 17:21:19
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.
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Death Walker 13. 04. 2023, 00:14:34
Je dobre vzdy pouzit casovu zonu:
Kód: [Vybrat]
date('Y-m-d H:i:s T') alebo pouzit
Kód: [Vybrat]
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...

Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: František Ryšánek 13. 04. 2023, 07:51:36
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)
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Rob Ros 13. 04. 2023, 08:12:38
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)
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: czechsys 13. 04. 2023, 08:38:12
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.
Název: Re:php8.2 nevraci ve funkci date cas s timezone
Přispěvatel: czechsys 13. 04. 2023, 08:38:47
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.
Název: Re:php8.2 nevraci ve funkci date cas s timezone
Přispěvatel: czechsys 13. 04. 2023, 08:48:20
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();
Kód: [Vybrat]
    [date.timezone] => Array
        (
            [global_value] =>
            [local_value] =>
            [access] => 7
        )

8.1 date_default_timezone_get():
Kód: [Vybrat]
2023-04-13 08:47:47
string(13) "Europe/Berlin"


8.2 ini_get_all():
Kód: [Vybrat]
    [date.timezone] => Array
        (
            [global_value] => UTC
            [local_value] => UTC
            [access] => 7
        )

8.2 date_default_timezone_get:
Kód: [Vybrat]
2023-04-13 06:47:44
string(3) "UTC"
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Rob Ros 13. 04. 2023, 09:42:47
Ve verzi 8.1 se pri nenastaveni date.timezone vzalo nastaveni systemu a PHP vyhazovalo varovani:

Kód: [Vybrat]
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.
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: RDa 13. 04. 2023, 09:56:51
Ono tam bylo dlouhou dobu warning, ktery znel takto:

Citace
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:
Kód: [Vybrat]
error_reporting = E_ALL
display_errors = stderr

U sebe nemam nastaveno v .ini nic, a obe verze produkuji UTC:

Kód: [Vybrat]
$ 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
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: czechsys 13. 04. 2023, 10:14:12
Zapnul jsem zobrazovani chyb:
Kód: [Vybrat]
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

Kód: [Vybrat]
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":
Kód: [Vybrat]
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";
?>


Kód: [Vybrat]
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"

Kód: [Vybrat]
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 :-)
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: czechsys 13. 04. 2023, 10:16:53
Ve verzi 8.1 se pri nenastaveni date.timezone vzalo nastaveni systemu a PHP vyhazovalo varovani:

Kód: [Vybrat]
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?
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Rob Ros 13. 04. 2023, 10:22:09
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 :-)
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Rob Ros 13. 04. 2023, 10:33:57
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.
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Death Walker 13. 04. 2023, 15:35:05

Kód: [Vybrat]
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:
Kód: [Vybrat]
/usr/bin/php8.1 --ini

/usr/bin/php8.2 --ini
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: czechsys 17. 04. 2023, 11:32:02

Kód: [Vybrat]
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:
Kód: [Vybrat]
/usr/bin/php8.1 --ini

/usr/bin/php8.2 --ini

Kód: [Vybrat]
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...
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: RDa 17. 04. 2023, 11:57:08
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:

Kód: [Vybrat]
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.
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: czechsys 17. 04. 2023, 12:15:57
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.
Název: Re:PHP 8.2 nevrací ve funkci date čas s timezone
Přispěvatel: Kit 17. 04. 2023, 13:12:14
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é.