Функция PHP filemtime возвращает отрицательное значение или очень большое значение

Я создаю плагин WordPress и вижу, что на некоторых серверах для определенных файлов stat (или filemtime), возвращающее неверное значение mtime. В некоторых случаях это отрицательное значение или очень большое значение (более 3 миллиардов).

В FTP я вижу, что метка времени верна.

Ответ 1

Когда вы получаете отрицательные числа в любой временной метке PHP, это всего лишь количество секунд до эпохи Unix, и это не ограничивается filemtime

Пример A

echo strtotime("1950-1-1"); // Outputs  -631155600
                                        ^------- negative value

Пример B

Вывод отрицательных значений не означает, что вы не можете отформатировать его правильно, если попробуйте

echo date("Y-m-d",-631155600); // Output  1950-01-01

Наконец

FTP I can see that the timestamp is correct though

Ваше FTP-приложение, безусловно, не является PHP и имеет собственную внутреннюю систему дат. его система Date может не использовать отрицательные значения в timestamp

Ответ 2

Если я правильно вас понимаю, очень большое значение - это то, что вы ищете - это временная марка Unix.

Вы попробовали что-то вроде этого?

date ("F d Y H:i:s.", filemtime($filename))

filemtime возвращает количество секунд, прошедших с 1 января 1970 года, что действительно должно быть очень большим значением; вам нужно преобразовать эти секунды в нечто, читаемое человеком, используя что-то вроде приведенного выше примера.

Если, с другой стороны, вы знаете об этом, и вы считаете, что ваша большая ценность по-прежнему неправа, может быть полезно опубликовать пример указанного значения вместе с датой, которую вы ожидаете от него.

Ответ 3

Когда ваш сервер запускает демон ntp, это может быть результатом установки времени в запросе. Это происходит e.x. для журналов apache и других вещей, которые также зависят от системных функций unix.

Ответ 4

Какой размер файлов, возвращающих отрицательное значение для файла?

Здесь говорится: http://php.net/manual/en/function.stat.php: "Поскольку тип целочисленного типа PHP подписан, а на многих платформах используются 32-битные целые числа, некоторые функции файловой системы могут возвращать неожиданные результаты для файлов размером более 2 ГБ."

Ответ 5

Текущее значение временной метки unix составляет около 1 356 197 722, поэтому миллиард является разумным.

Хотя это вряд ли будет проблемой, стоит знать http://php.net/manual/en/function.clearstatcache.php и использовать его перед вызовом filemtime().