filemtime(): stat failed for

85
11 декабря 2021, 06:00

Пытаюсь получить время последнего изменения html-файлов для скрипта, генерирующего карту сайта.

Пробовала так:

$last = filemtime($str_url);

Или так:

$tim = date ("F d Y H:i:s.", filemtime($str_url));

И постоянно получаю вот такие ошибки для каждого url из проверяемого массива:

PHP Warning:  filemtime(): stat failed for https://site.ru in /var/www/.../.../.../site.ru/src/sitemap14.php on line 247   
January 01 1970 03:00:00.PHP Warning:  filemtime(): stat failed for /var/www/.../.../.../site.ru/base.html in /var/www/.../.../.../site.ru/src/sitemap14.php on line 247            
January 01 1970 03:00:00.PHP Warning:  filemtime(): stat failed for /var/www/.../.../.../site.ru/base1.html in /var/www/.../.../.../site.ru/src/sitemap14.php on line 247  

В этой 247 строке как раз:

$tim = date ("F d Y H:i:s.", filemtime($str_url));  

Переменная $str_url - типа string, как и необходимо для функции filemtime(); Сама переменная выводится (проверяла print_r($str_url))

Подскажите, пожалуйста, в чем ошибка и как ее исправить?

Спасибо.

P.S. Уточнила насчет необходимых прав. Ответили, что никие дополнительные права в моем случае не нужны.

Переменная $str_url содержит результат функции strval($url) - строковые значения урлов сайта вида: /var/www/логин_у_хостера/data/www/site.ru/имя_файла

P.P.S. В качестве эксперимента попробовала написать так:

$tim = date ("F d Y H:i:s.", @filemtime($str_url)

В результате получила для каждого значения переменной, кроме последних 2: January 01 1970 03:00:00. А для последних двух - реальное время изменения файлов: April 29 2019 00:03:41. April 14 2019 19:13:31.

Чудеса с этой filemtime()...

Answer 1

тут пишут:

int filemtime ( string $filename )

Данная функция возвращает время последней записи блоков файла, иначе говоря, изменения содержания файла.

Речь идёт о файле. А в вашей ошибке речь о веб-странице:

PHP Warning: filemtime(): stat failed for https://site.ru in /var/www/...

Как вы знаете, этой страницы физически не существует на сервере, она генерируется php на момент запроса. Значит и данных о времени её изменения нет. Это, кстати, можно проверить, чекая http-заголовок ответа Last-Modified (его сервер отсылает с другими заголовками в ответ на запрос файла):

$headers = get_headers('https://www.php.net/images/logos/php-logo.svg', 1); // file
echo 'get_headers ' . date("Y-m-d H:i:s", strtotime($headers['Last-Modified']));
// 2017-04-19 18:20:03
$headers = get_headers('https://php.ru/manual/wrappers.http.html', 1); // web page
echo 'get_headers ' . date("Y-m-d H:i:s", strtotime($headers['Last-Modified']));
// Notice: Undefined index: Last-Modified 
// 1970-01-01 03:00:00

Поэтому вы, делая так @filemtime($str_url), получали January 01 1970 03:00:00. Вы подовляли вывод шибок filemtime с помощью оператора @, и date() вам показывал время начала эпохи Линух (ну, и +3ч на часовой пояс вашего сервера). А вот последние два - я полагаю - файлы, по ним вы получили верные значения.

Вариант для вас - кешировать страницы. В таком случае на первый запрос https://site.ru будет создаваться физический html файл. Единственный минус - необходимость очистки кешей после каждого изменения контента, руками или скриптом.

Если сайт на WP и прочих - ищите екстеншены, решающие подобные вопросы.

READ ALSO
Как подставить значение?

Как подставить значение?

Как получить данные из формы для подстановки в запрос? Здравствуйте

191
Блокирует и не отправляются заявки

Блокирует и не отправляются заявки

По отправке форм, обращается программа через ajax к php файлу:

116
Как подключить файл стилей к определенной странице на WordPress?

Как подключить файл стилей к определенной странице на WordPress?

Например, у меня есть главная страница, на которой должен быть подключен только maincss, а на странице товара product-page

226
Как сделать пагинацию в рубриках WordPress?

Как сделать пагинацию в рубриках WordPress?

Есть файл который выводит посты относятсящиеся к определённым рубрикамСодержимое фала: https://pastebin

236