filemtime php не работает
PHP filemtime () не работает — проблема с кешем?
Я вызываю filemtime () из файла PHP, выполняемого POST из приложения JavaScript / HTML. Он возвращает одну и ту же метку времени для отдельного тестового HTML-файла каждые две секунды, даже когда я редактирую тестовый файл с помощью текстового редактора и вижу изменение DTM в локальной файловой системе.
Если я перезагружу все приложение (Ctrl + F5), указанная временная метка останется прежней. Время от времени (один раз после 4 часов) метка времени меняется, но я не знаю, что делает это возможным.
PHP-часть моего кода выглядит так:
Этот код вызывается синхронным Ajax с заданным только именем PHP-файла, используя setInterval каждые 2 секунды.
Windows 10 Home, Apache 2.4.33, работающий локально для доступа по HTTP, PHP 7.0.30.
Поведение одинаково в Firefox, Chrome, Opera и Edge.
Решение
Примечание. Результаты этой функции кэшируются. Смотрите clearstatcache () для более подробной информации.
Похоже, что Windows делает некоторые записи кэширования …
stat (), с другой стороны, имеет дополнительное примечание:
Обратите внимание, что разрешение по времени может отличаться в разных файловых системах.
Возможно стоит проверить вывод статистики.
редактировать
Может быть, это ошибка, или Windows не играет хорошо, но вы также можете сделать shell_exec с командой Windows, показывающей DTM.
Другие решения
Новостиоказывается, это обычная ошибка в моем приложении. Я скопировал свой вызов Ajax и забыл отредактировать его, чтобы применить к тестовому файлу. Таким образом, он применялся к одному из моих файлов приложения, а DTM обновлялся только тогда, когда я редактировал этот файл приложения (FTAdjust.js).
Когда я указываю правильный тестовый файл, DTM прекрасно обновляется каждый раз, когда я редактирую его в другом процессе.
Иногда бывает трудно найти собственную ошибку, даже если она смотрит в лицо! Я продолжал искать везде, но там, где была ошибка.
Есть ли способ удалить поток из переполнения стека, так как он не имеет отношения к другим?
Почему home_url () не работает с filemtime () в WordPress?
Я хотел начать автоматическое изменение версии enqueue, чтобы мне не пришлось менять ее вручную после редактирования файла, поэтому я подумал об использовании filemtime() потянуть время, но по какой-то причине, когда я использую его с site_url() или же home_url это не работает:
но когда я прохожу
оно работает. Я исследовал и прочитал:
РЕДАКТИРОВАТЬ:
Дальнейшее тестирование я попробовал:
думая, что это может быть проблемой последовательности, но все еще не работает. Я переместил файл CSS в каталог темы и попытался:
В голову мне вернули то, что кажется правильным:
но файл Bootstrap не рендерится.
Решение
Я думаю, что причина в том, что функции файловой системы PHP не уходят из URL, а имеют абсолютные пути к файлам. Поэтому нам нужны и URL, и абсолютный путь к файлу, чтобы мы могли убедиться, что он существует, и получить временную метку файла:
Другие решения
Закрыть — я считаю, что проблема в том, что filemtime нужен ресурс пути к файлу, а вы пытаетесь передать ему веб-URL.
Я бы попробовал что-то вроде использования getcwd() вместо этого указать на файл.
Функция «home_url» выводит домашний URL, который нарушит ваш код. использование get_home_url() вместо этого, потому что эта функция возвращает значение, что означает, что вы можете сохранить его в переменной или вызвать его.
РЕДАКТИРОВАНИЕ
filemtime
(PHP 4, PHP 5, PHP 7, PHP 8)
filemtime — Возвращает время последнего изменения файла
Описание
Данная функция возвращает время последней записи блоков файла, иначе говоря, изменения содержания файла.
Список параметров
Возвращаемые значения
Ошибки
Примеры
Пример #1 Пример использования функции filemtime()
// Пример вывода: В последний раз файл somefile.txt был изменён: December 29 2002 22:16:23.
Примечания
Учтите, что обработка времени может отличаться в различных файловых системах.
Смотрите также
User Contributed Notes 30 notes
This is a very handy function for dealing with browser caching. For example, say you have a stylesheet and you want to make sure everyone has the most recent version. You could rename it every time you edit it, but that would be a pain in the ass. Instead, you can do this:
By appending a GET value (the UNIX timestamp) to the stylesheet URL, you make the browser think the stylesheet is dynamic, so it’ll reload the stylesheet every time the modification date changes.
To get the last modification time of a directory, you can use this:
Take note on the last dot which is needed to see the directory as a file and to actually get a last modification date of it.
This comes in handy when you want just one ‘last updated’ message on the frontpage of your website and still taking all files of your website into account.
«this is not (necessarily) correct, the modification time of a directory will be the time of the last file *creation* in a directory (and not in it’s sub directories).»
This is not (necessarily) correct either. In *nix the timestamp can be independently set. For example the command «touch directory» updates the timestamp of a directory without file creation.
Also file removal will update the timestamp of a directory.
Cheaper and dirtier way to code a cache:
= ‘URI to cache file’ ;
$cache_life = ‘120’ ; //caching time, in seconds
There’s a deeply-seated problem with filemtime() under Windows due to the fact that it calls Windows’ stat() function, which implements DST (according to this bug: http://bugs.php.net/bug.php?id=40568). The detection of DST on the time of the file is confused by whether the CURRENT time of the current system is currently under DST.
This is a fix for the mother of all annoying bugs:
else
$adjustment = 0 ;
A comment below states
«When using this function to get the modified date of a directory,
it returns the date of the file in that directory that was last modified.»
this is not (necessarily) correct, the modification time of a directory will be the time of the last file *creation* in a directory (and not in it’s sub directories).
If PHP’s integer type is only 32 bits on your system, filemtime() will fail on files over 2GB with the warning «stat failed». All stat()-related commands will exhibit the same behavior.
As a workaround, you can call the system’s stat command to get the modification time of a file:
Thanks to «mpb dot mail at gmail dot com» for his/her similar comment on stat().
While testing on Windows, I noticed that the precision of filemtime is just 1 second.
So if you use clearstatcache() and filemtime() to check if a file has been modified, it might fail to detect the change. The modifications just have to happen within less than a second.
(I ran into this with Apache on Windows XP.)
Here is a handy script to create a csv file with file names and the date when files in a given folder were inserted:
( «Pragma: public» );
header ( «Cache-Control: private» );
header ( «Content-Type: text/csv» );
header ( «Content-Disposition: attachment; filename=age-of-files.csv» );
i needed the ability to grab the mod time of an image on a remote site. the following is the solution with the help of Joe Ferris.
To find the oldest file in a directory :
$directory= «C:\\»;
if ($handle = opendir($directory)) <
It could be useful to determinate the timestamp of the newest file in a directory. (e.g. if you want to find out when the last change was made to your project).
Following function will help you:
concerning «notepad at codewalkers dot com»‘s code:
this code is pretty neat, but i just wanted to note that using the «HEAD»-method instead of the «GET»-method in the http-request might be preferrable, since then not the whole resource is being downloaded.
http/1.1 definiton snippet:
Section «9.4 HEAD»
the code would then be.
Also on 32-bit systems, filemtime() also does not work for files with modification time set beyond Jan 2038. It is the dreaded time_t overflow bug for unix seconds.
On windows you can set the system time to any arbitrary future date, and any new files you created or edited will automatically change to that future date.
If exec isn’t permitted for some reason, and if you could access the file via an web url (e.g. http://localhost/yourfile.txt), another workaround is to get the Last-Modified time from the HTTP headers (e.g. get_headers(url) ), and parse it as a DateTime object.
I have tested it and it works for years like 2050 and 3012.
Cheap and dirty way to code a cache:
= ‘URI to cache file’ ;
$cache_life = ‘120’ ; //caching time, in seconds
Here is a small but handy script that you can use to find which files in your server are modified after a date/time that you specify. This script will go through all folders in the specified directory recursively and echo the modified files with the last modified date/time.
//Starts Here
//Put here the directory you want to search for. Put / if you want to search your entire domain
$dir=’/’;
//Put the date you want to compare with in the format of: YYYY-mm-dd hh:mm:ss
$comparedatestr=»2006-08-12 00:00:00″;
$comparedate=strtotime($comparedatestr);
//I run the function here to start the search.
directory_tree($dir,$comparedate);
//This is the function which is doing the search.
function directory_tree($address,$comparedate)<
if($comparedate ‘.$last_modified_str;
echo «
«;
>
Please note that many of the functions below that people have provided to get files modified after a certain time in a directory will NOT get all files on a Windows operating system.
If you copy and paste any file inside the folder or into the folder from another folder (such as images that may be used but aren’t going to be modified right away), the modified time is not updated on these copied files, only the creation time.
You need to use filectime with filemtime to assure you get copied files that aren’t modified but are obviously new.
when working with swf files (flash animations), there is a nice way to avoid the browser cache. i used to do this by hand, then i used a random number, but with large animations while working online, it gets boring because the server always downloads the whole animation, even if there was no change.
but.
this will do the trick
The mentioned example:
works, however is not ideal from a performance point of view of serving static files through PHP, since it basically needs two perform two file system operations (file_exists and filemtime). A more effective way would be to only use filemtime and save the overhead of file_exists using:
filemtime(..) only works with files on your server.
$T=filesize(«index.php»); // Works.
$T=filesize(«/public_html/dir/index.php»); // Works.
But the following will not work.
$T=filesize(«https://mydomain.com/dir/index.php»); // Will not work. Same domain but using web address.
$T=filesize(«https://otherdomain.com/dir/index.php»); // Other domain, will not work.
To get file date for other sites try:
(Note: Time zone may be in G.M.T. and not your local timezone)
$ret = curl_getinfo($ch, CURLINFO_FILETIME);
curl_close($ch);
The second script above will ensure any updated image is guaranteed to replace its predecessor without forcing the browser to reload the image on every visit.
A little amendment to «tobias» post:
filemtime() returns false on failure so in the first example it will never display the date modified.
To get the modification date of some remote file, you can use the fine function by notepad at codewalker dot com (with improvements by dma05 at web dot de and madsen at lillesvin dot net).
But you can achieve the same result more easily now with stream_get_meta_data (PHP>4.3.0).
However a problem may arise if some redirection occurs. In such a case, the server HTTP response contains no Last-Modified header, but there is a Location header indicating where to find the file. The function below takes care of any redirections, even multiple redirections, so that you reach the real file of which you want the last modification date.
filemtime() not working in Windows PHP-CLI
I just got PHP-CLI working on my Windows machine so I could create scripts using PHP. However, I’m trying to write a script to cleanup my Firefox downloads folder of files older than X number of days, but I can’t seem to get the filemtime() function working.
Here is the function I wrote:
And upon running this I get the following error for every file:
From the research I’ve done, filemtime() should work in Windows. What am I doing wrong?
1 Answer 1
Warning: filemtime(): stat failed for E:\My Documents\Downloadsphp-5.3.0-nts-Win32-VC9-x86.msi in E:\_scripts\cleanupDownloads\cleanupDownloads.php on line 10
You’re missing a backslash \ between the directory and the filename. Don’t forget to escape it on Windows ( \\ ) or just use the forward slash ( / ) or PHP’s DIRECTORY_SEPARATOR constant.
edit
Not the answer you’re looking for? Browse other questions tagged windows php filemtime or ask your own question.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.16.40232
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
filemtime возвращяет неверную дату.
Ironfoundersson
Новичок
filemtime возвращяет неверную дату.
направьте меня пожалуйста к нужному врачу или подверите мой собственный диазноз.
ситуация следующяя, нистого ниссего (что по сути не возможно) сервер стал возвращять странную дату дял модификации файла.
она всегда минус 1 час с реальной даты.
1) date c консоли возвращяет
>> Tue May 5 23:20:22 EEST 2009
что есть правильной текущей датой и временем.
2) насколько я понимаю и вспоминаю из документации дейт без параметра использует текущий таймстам возвращенный системой.
echo date(«Y-m-d H:i:s»);
>>2009-05-05 23:20:54
// что есть так же правильно.
собственно в чем проблема.
только что модифицированый скрипт который собственно и выводит данные возвращяет время модификации минус 1 час.
clearstatcache();
echo date(«Y-m-d H:i:s»).’
‘;
echo date(«Y-m-d H:i:s», filemtime(__FILE__)).’
‘;
2009-05-05 23:22:58
2009-05-05 22:22:31
Либо я затупил и поставил временной пояс не тот (но проверяю всюду стоит Европа/Киев)
Либо дело в EEST восточноевропейском летнем времени
———
есть у когонибуть какие догадки в чем трабла быть может?
no_santa
Снегур
Ironfoundersson
Новичок
за меня нтпдейт переводит, собственно строка (вроде?) доказывающяя что используется летнее время
;;1) date c консоли возвращяет
;;>> Tue May 5 23:20:22 EEST 2009
;;что есть правильной текущей датой и временем.
php.spb.ru
Ironfoundersson
Новичок
Дмитрий, так как апдейтов я не делал уже долго и до вчера работало нормально, грешить на версию пхп я не буду. что то с окружением, с убунтой.
а зона в пхп ини указана, так что с него вязтки гладки.
——
touch(__FILE__);
echo date(«Y-m-d H:i:s», filemtime(__FILE__)).’
‘;
вернет правильную дату.
—
зы нашел такое описание
http://ua2.php.net/filemtime/#82179 что собственно и есть наш случай.
fixxxer
Ironfoundersson
Новичок
fixxxer
а хрен знает тогда
php.spb.ru
dimagolov
Новичок
при том, что в NTFS и, видимо, в *NUX-ах время создания/модификации храниться в GMT и для того, чтобы отобразить его нужна информация о таймзоне & DST.
File Times and Daylight Saving Time
You must take care when using file times if the user has set the system to automatically adjust for daylight saving time.
To convert a file time to local time, use the FileTimeToLocalFileTime function. However, FileTimeToLocalFileTime uses the current settings for the time zone and daylight saving time. Therefore, if it is daylight saving time, it takes daylight saving time into account, even if the file time you are converting is in standard time.
The FAT file system records times on disk in local time. GetFileTime retrieves cached UTC times from the FAT file system. When it becomes daylight saving time, the time retrieved by GetFileTime is off an hour, because the cache is not updated. When you restart the computer, the cached time that GetFileTime retrieves is correct. FindFirstFile retrieves the local time from the FAT file system and converts it to UTC by using the current settings for the time zone and daylight saving time. Therefore, if it is daylight saving time, FindFirstFile takes daylight saving time into account, even if the file time you are converting is in standard time.
The NTFS file system records times on disk in UTC. To account for daylight saving time when converting a file time to a local time, use the following sequence of functions instead of using FileTimeToLocalFileTime:
* FileTimeToSystemTime
* SystemTimeToTzSpecificLocalTime
* SystemTimeToFileTime