2010-02-15 12 views
8

Los verdaderos contenidos completos del archivo:¿Es esto un error de php, o algo está mal con mi configuración de huso horario/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(); 
} 

El constructor acepta una cadena DateTime, que debería lanzar una excepción si no puede analizarlo. Esto funciona muy bien en mi máquina local, pero en uno de mis servidores remotos no se detecta la excepción (y de nuevo, me soy utilizando try/catch y el código exactamente el mismo):

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

ajustes del servidor remoto donde la excepción no se detecta:

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

Mis ajustes locales donde ejerza su trabajo:

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 nivel local, se detecta la excepción y pri Apaga el error. El date.timezone en ambos no tiene valor.

¿Tal vez solo son las zonas horarias de mi sistema interno las que están apagadas? Mi casilla local es Ubuntu y mi control remoto es CentOS, probablemente sean inconsistentes, pero ¿PHP no debería atrapar la excepción?

FYI No puedo actualizar PHP en el cuadro de control remoto ya que no tengo derechos de administrador.

Respuesta

10

Mi apuesta es en un error de PHP. Sé que PHP solía tener problemas para capturar las excepciones lanzadas en los constructores, y eso parece ser lo que está sucediendo aquí.

Debido a que es un error, sus opciones son

  1. actualización de la versión PHP del servidor; usted ha dicho que esto no es una opción
  2. Uso strtotime() para encontrar la fecha o, si necesita o desea acceder al estilo orientado a objetos de DateTime, detectar el error con strtotime()

Por ejemplo:

<?php 

try { 

    if (@strtotime($str) !== false) { 
     $x = new DateTime($str); 
    } else { 
     throw new Exception("Failed to parse string ({$str})"); 
    } 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Incluso podría intentar extender la clase DateTime, y anular el constructor con el código anterior, excepto que en lugar del nuevo DateTime usaría parent :: __ construct() . Recuerde que el prototipo tiene que ser el mismo, por lo que su construcción debe tomar dos parámetros (string $ str, DateTimeZone $ timezone = null).Esto tiene el beneficio adicional de determinar si el error de excepción atrapable __construct() es la fuente de sus problemas. – Frankie

+0

Sí, actualmente uso strtotime y me aseguro de que no falle, y luego lo paso al constructor DateTime. Intentaré extenderlo. –

+0

Puede reproducir esto en PHP 5.5.9ubuntu. – CarstenSchmitz

1

No estoy seguro sobre el tema exacto, pero intente configurar la zona horaria de utilizar esta función:

date_default_timezone_set('Europe/London'); // or whatever timezone 

y ver si esto funciona.

+0

El servidor que no capta la excepción ya tiene un conjunto (Zona horaria predeterminada América/Chicago). –

+0

Sí, ya probé esto antes y no pareció hacer nada. –

+0

esto es un problema extraño entonces, veamos cuál es la solución para él entonces – Sarfraz

0

me encontré con un problema similar, se capaz de solucionar con

date('date format', $str); 
date("Y-m-d", $news->created); 

la esperanza de que ayude a alguien.

Cuestiones relacionadas