php strtotime дает другой результат на 64-битной - PullRequest
3 голосов
/ 26 мая 2011

У меня есть PHP-функция с именем _to_unix_timestamp () код:

function _to_unix_timestamp($param){
    if ($timestamp = strtotime($param)){
        return $timestamp;
    }
    return (int) $param;
}

Код работает на моем сервере разработки (32 бита)
но при развертывании моего приложения на производственном сервере (64 бита)
вывод этой функции немного отличается

пример

 // expected to be "int(1306400175)" but the output is "int(-56632154432)" 
 var_dump(_to_unix_timestamp("1306400175"));

на моем сервере разработки выводится int (1306400175)
но на производственном сервере вывод будет int (-56632154432)

просто информация сервер разработки (32 бита) =
Linux glustervm 2.6.18-164.el5xen # 1 SMP четверг 3 сентября 04:47:32 EDT 2009 i686 i686 i386 GNU / Linux
PHP 5.2.9

рабочий сервер (64 бита) =
Linux minicapella 2.6.18-164.15.1.el5.centos.plusxen # 1 SMP Wed 17 марта 20:32:20 EDT 2010 x86_64 x86_64 x86_64 GNU / Linux
PHP 5.2.13

Теперь функция работает хорошо после добавления

//append "> 0"
if ($timestamp = strtotime($param) > 0){

Но я хочу знать, почему вывод отличается?

Спасибо за ваш совет
-rizkyabdilah

1 Ответ

3 голосов
/ 26 мая 2011

Strtotime работает, читая то, что вы даете ему в виде строки, и пытайтесь найти дату где-нибудь в нем.Поэтому, когда вы передали его "1306400175", он попытался найти формат YEAR-MONTH-DAY-HOUR -..., он знает, что ему соответствует, и, поскольку он, вероятно, находит что-то , он возвращает вам значениесоответствует дню, который, как он думает, он обнаружил.

Другими словами, он просто не работает так, как вы думаете, например, если вы выполните strtotime ("1400"), он вернет отметку времени, соответствующую TODAY в14:00.Таким образом, ваш код на самом деле терпит неудачу как в 32, так и в 64 битах, причина в том, что это другой результат, вероятно, потому, что целочисленное переполнение, когда его значение превышает PHP_INT_MAX (он достигает максимально возможных значений, которые он может иметь, поэтому он возвращается к минимальномуможет иметь), что отличается от 32-х и 64-х битных PHP.

Фактическим исправлением для вашей функции будет проверка того, что параметр не является числом перед передачей его в strtotime:

if (!is_numeric($param) && ($timestamp = strtotime($param)) {

Несмотря на то, что вам нужно убедиться, что вы действительно хотите разобрать строку даты / времени (например, «2011-04-08 14:00») в соответствующую метку времени.

...