- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Несколько лет назад кодер делавший мне сайт на джумле в админке одного из написанных им компонентов сделал мульку - я вставляю в поле урл страницы, кеш которой мне нужно очистить и жмакаю кнопочку и кеш только этой страницы очищается.
Вчера заметил что это дело перестало работать, поле нашел функцию отвечающую за это
* Функция очистки кеша Nginx
*
* CommentsHelperQuery::clearCache('http(s)://*');
*
* @param string $value
* @return
*/
function clearCache($value)
{
jimport('joomla.filesystem.file');
if(!empty($value))
{
$data = parse_url($value);
$filename = md5('GET|site.ru|'.$data['path']);
JFile::delete('/var/cache/nginx/site/'.substr($filename, -1).'/'.substr($filename, -3, 2).'/'.$filename);
return true;
}
return false;
}
Насколько я понял данная функция эмулирует работу кеша Nginx - т.е. на основании урла генерирует путь до файла который нужно удалить.
Теперь я хочу проверить а правильный ли путь она генерирует.
Так как все это дело в админке, решил я вывести этот код на те страницы, кеш которых мне нужно очищать.
Вставил туда такой код
<?php
$data = parse_url($value);
$filename = md5('GET|site.ru|'.$data['path']);
$fileput = ('/var/cache/nginx/site/'.substr($filename, -1).'/'.substr($filename, -3, 2).'/'.$filename);
echo $fileput;
?>
мне вывелось
Но меня смущает что на всех других страницах выводит точно такой же путь
А на echo $data; выдает - Array
В этом коде я не могу понять что такое $value и откуда оно берется. Помогите с дебагом функции, как понять почему она не работает?
parse_url возвращает массив данных об урле.
Чтобы посмотреть, что там напарсилось, вместо echo надо print_r($data).
Если вывод в браузер, то лучше так
echo('<pre>');
print_r($data)
echo('</pre>');
Ну, или
foreach($data as $k=>$v) echo ("$k=$v<br/>");
Skom, на код
$data = parse_url($value);
$filename = md5('GET|site.ru|'.$data['path']);
print_r($data);
?>
выводит - Array ( [path] => )
Не понятно что такое $value
Значит в $value пусто, либо кривое какое-то значение.
Skom, а как найти что такое $value ?
Я сделал поиск по файлам:
root@fin ~ # grep -irl '$value' /var/www/site/administrator/components/com_comments
/var/www/site/administrator/components/com_comments/models/item.php
/var/www/site/administrator/components/com_comments/helpers/query.php
query.php - это файл с функцией из 1 поста
а в item.php есть такой кусок
{
$ids = array();
foreach($data['images'] as $index => $value)
{
$ids[] = $index;
}
Если сделать поиск по grep -irl '$value' /var/www/site/administrator/components то $value встречается чуть ли не во всех компонентах
Надо смотреть - откуда оно вызывается и что туда передаётся.
По всей видимости, тот самый урл, который вы хотите почистить.
Ищите откуда идёт обращение к clearCache
В данном случае, $value всего лишь локальная переменная функции и искать её во всех скриптах бессмысленно.
Skom, вы правы!
Я вывел такой код:
$url = 'https://site.ru/test';
$data = parse_url($url);
$filename = md5('GET|site.ru|'.$data['path']);
$fileput = ('/var/cache/nginx/site/'.substr($filename, -1).'/'.substr($filename, -3, 2).'/'.$filename);
echo $fileput;
?>
мне вывело (на тестовой странице)
а ее кеш лежит тут
Такое впечатление что Nginx как то по другому берет Хеш страницы.
Как это проверить?
А вы ничего в конфиге Nginx не ковыряли?
Или, там в урлах на сайте?
Или, возможно, сам Nginx обновился и по другому теперь хэш считает.
https://www.nginx.com/blog/nginx-caching-guide/
Посмотрел в конфиге - хеш строится таким образом:
fastcgi_cache_key "$request_method|$host|$request_uri";
Ну и вроде бы это согласуется в этим - $filename = md5('GET|site.ru|'.$data['path']);
Или нет?
---------- Добавлено 08.02.2019 в 09:52 ----------
Попробовал еще так
$url = 'https://site.ru/test';
$data = parse_url($url);
$filename = md5('GET|site.ru|'.$data['path']);
$fileput = ('/var/cache/nginx/site/'.substr($filename, -1).'/'.substr($filename, -3, 2).'/'.$filename);
print_r($data);
?>
получил - Array ( [scheme] => https [host] => site.ru [path] => /test )
---------- Добавлено 08.02.2019 в 09:59 ----------
Так же решил посмотреть что выводит
echo $_SERVER['REQUEST_METHOD'].$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
получил ожидаемое
GETsite.ru/test
---------- Добавлено 08.02.2019 в 10:02 ----------
Затем решил сравнить хеши
$url = 'https://site.ru/test';
$data = parse_url($url);
$filename = md5('GET|site.ru|'.$data['path']);
$fileput = ('/var/cache/nginx/site/'.substr($filename, -1).'/'.substr($filename, -3, 2).'/'.$filename);
echo $filename;
?>
<br>
<?php
echo md5($_SERVER['REQUEST_METHOD']|.$_SERVER['HTTP_HOST']|.$_SERVER['REQUEST_URI']);
?>
И получил два одинаковых хеша, но они не совпадают с реальных хешем страницы кеша которую сгенерировал Nginx
Попробуйте поменять в функции
$filename = md5('GET|site.ru|'.$data['path']);
на
$filename = md5('GET|'.$data['host'].'|'.$data['path']);
Не видя все эти site.ru и как вы их запрашиваете, очень сложно о чём-то судить )
Я оставлю тут очень хорошую ссылку по дебагу на php: http://phpfaq.ru/debug