Как проверить что выводит переменная? PHP

12
D
На сайте с 28.06.2008
Offline
1008
734

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

Вчера заметил что это дело перестало работать, поле нашел функцию отвечающую за это

/**
* Функция очистки кеша 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;
?>

мне вывелось

/var/cache/nginx/site/6/23/98c7fc89f48fe6b25f0a8da545d98236

Но меня смущает что на всех других страницах выводит точно такой же путь

А на echo $data; выдает - Array

В этом коде я не могу понять что такое $value и откуда оно берется. Помогите с дебагом функции, как понять почему она не работает?

Skom
На сайте с 02.12.2006
Offline
157
#1

parse_url возвращает массив данных об урле.

Чтобы посмотреть, что там напарсилось, вместо echo надо print_r($data).

Если вывод в браузер, то лучше так

echo('<pre>');

print_r($data)

echo('</pre>');

Ну, или

foreach($data as $k=>$v) echo ("$k=$v<br/>");

Cras amet qui numquam amavit quique amavit cras amet
D
На сайте с 28.06.2008
Offline
1008
#2

Skom, на код

<?php
$data = parse_url($value);
$filename = md5('GET|site.ru|'.$data['path']);
print_r($data);
?>

выводит - Array ( [path] => )

Не понятно что такое $value

Skom
На сайте с 02.12.2006
Offline
157
#3

Значит в $value пусто, либо кривое какое-то значение.

D
На сайте с 28.06.2008
Offline
1008
#4

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 есть такой кусок

if(!empty($data['images']))
{
$ids = array();
foreach($data['images'] as $index => $value)
{
$ids[] = $index;
}

Если сделать поиск по grep -irl '$value' /var/www/site/administrator/components то $value встречается чуть ли не во всех компонентах

Skom
На сайте с 02.12.2006
Offline
157
#5


function clearCache($value)
{

Надо смотреть - откуда оно вызывается и что туда передаётся.

По всей видимости, тот самый урл, который вы хотите почистить.

Ищите откуда идёт обращение к clearCache

В данном случае, $value всего лишь локальная переменная функции и искать её во всех скриптах бессмысленно.

D
На сайте с 28.06.2008
Offline
1008
#6

Skom, вы правы!

Я вывел такой код:

<?php
$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;
?>

мне вывело (на тестовой странице)

/var/cache/nginx/site/d/ba/356a0f4b9422cf44543b8e614b588bad

а ее кеш лежит тут

/var/cache/nginx/site/c/04/d840acd78808e4dfb8c50bc20eb1c04c

Такое впечатление что Nginx как то по другому берет Хеш страницы.

Как это проверить?

Skom
На сайте с 02.12.2006
Offline
157
#7

А вы ничего в конфиге Nginx не ковыряли?

Или, там в урлах на сайте?

Или, возможно, сам Nginx обновился и по другому теперь хэш считает.

https://www.nginx.com/blog/nginx-caching-guide/

D
На сайте с 28.06.2008
Offline
1008
#8

Посмотрел в конфиге - хеш строится таким образом:

fastcgi_cache_key "$request_method|$host|$request_uri";

Ну и вроде бы это согласуется в этим - $filename = md5('GET|site.ru|'.$data['path']);

Или нет?

---------- Добавлено 08.02.2019 в 09:52 ----------

Попробовал еще так

<?php
$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 ----------

Так же решил посмотреть что выводит

<?php
echo $_SERVER['REQUEST_METHOD'].$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>

получил ожидаемое

GETsite.ru/test

---------- Добавлено 08.02.2019 в 10:02 ----------

Затем решил сравнить хеши

<?php
$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

Skom
На сайте с 02.12.2006
Offline
157
#9

Попробуйте поменять в функции

$filename = md5('GET|site.ru|'.$data['path']);

на

$filename = md5('GET|'.$data['host'].'|'.$data['path']);

Не видя все эти site.ru и как вы их запрашиваете, очень сложно о чём-то судить )

Апокалипсис
На сайте с 02.11.2008
Offline
391
#10

Я оставлю тут очень хорошую ссылку по дебагу на php: http://phpfaq.ru/debug

Записки нищего (http://zapiskinishego.ru) - мой личный блог Услуги php программиста. Очень нужна любая работа. Не покупают? Поведенческий аудит интернет-магазина за 5000 руб. (/ru/forum/990312)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий