il reale, intero contenuto del file:Si tratta di un bug di php o di qualcosa che non va nelle mie impostazioni di fuso orario/PHP?
<?php
error_reporting(E_ALL);
ini_set(display_errors, 'on');
try {
//$x = strtotime('blah');
$x = new DateTime('lol');
} catch (Exception $e) {
echo $e->getMessage();
}
Il costruttore DateTime accetta una stringa, che dovrebbe generare un'eccezione se non è possibile analizzarlo. Questo funziona bene sulla mia macchina locale, ma su uno dei miei server remoti l'eccezione non viene catturato (e ancora una volta, io sono utilizzando try/catch e il codice esattamente lo stesso):
Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct() [function.DateTime---construct]: Failed to parse time string (lol) at position 0 (l): The timezone could not be found in the database' in /var/www/html/site_com/rez/date.php:9 Stack trace: #0 /var/www/html/site_com/rez/date.php(9): DateTime->__construct('lol') #1 {main} thrown in /var/www/html/site_com/rez/date.php on line 9
le impostazioni del server remoto in cui l'eccezione non viene catturato:
PHP Version 5.2.5
date date/time support enabled "Olson" Timezone Database Version 2007.9 Timezone Database internal Default timezone America/Chicago
Directive Local Value Master Value date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone no value no value
mie impostazioni locali in cui funziona:
PHP 5.2.10
date date/time support enabled "Olson" Timezone Database Version 0.system Timezone Database internal Default timezone System/Localtime
Directive Local Value Master Value date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone no value no value
A livello locale, cattura l'eccezione e pri nts l'errore. Il date.timezone
su entrambi non ha valore.
Forse sono solo i fusi orari del mio sistema interno disattivati? La mia casella locale è Ubuntu e il mio telecomando è CentOS, sono probabilmente incoerenti ma PHP non dovrebbe ancora rilevare l'eccezione?
FYI Non riesco ad aggiornare PHP sul box remoto poiché non ho diritti di amministratore.
Si potrebbe anche provare ad estendere la classe DateTime e a sovrascrivere il costruttore con il codice sopra, tranne invece di nuovo DateTime si utilizzerebbe parent :: __ construct() . Ricorda che il prototipo deve essere lo stesso, quindi il tuo costrutto dovrebbe prendere due parametri (stringa $ str, DateTimeZone $ timezone = null).Questo ha l'ulteriore vantaggio di determinare se il bug di eccezione uncatchable di __construct() sia la fonte dei tuoi problemi. – Frankie
Sì, attualmente sto usando strtotime e mi assicuro che non abbia esito negativo, quindi lo inserisco nel costruttore DateTime - cercherò di estenderlo. –
È possibile riprodurre questo in PHP 5.5.9ubuntu. – CarstenSchmitz