За последние 24 часа нас посетили 17465 программистов и 1715 роботов. Сейчас ищут 1687 программистов ...

Кэш

Тема в разделе "PHP для новичков", создана пользователем Panich, 28 фев 2013.

  1. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Сайт: www.lu4ick.ru
    Ещё два дня назад всё было замечательно, но со вчерашнего дня картинки пароля на странице перестали изменяться пока не сбросишь кеш в браузере насильно (картинка в разделе "связаться"). А если обратиться на прямую, то всё замечательно: http://lu4ick.ru/code/my_codegen.php.
    Подскажите как побороть проблему...спасибо!
     
  2. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    У меня всё норм, хром
    Под другими браузерами может быть, достаточно впихнуть рандомный айди в get параметры урла картинки чтобы было например так
    Код (Text):
    1. <img class="" src="code/my_codegen.php?r=85423742423">
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    заголовки ответа:

    Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Connection:Keep-Alive
    Content-Type:image/png
    Date:Thu, 28 Feb 2013 06:09:25 GMT

    Expires:Mon, 26 Jul 1997 05:00:00 GMT
    Keep-Alive:timeout=5, max=97
    Last-Modified:Thu, 01 Jan 1970 02:46:40 GMT
    Pragma:no-cache

    Server:Apache/2.2.23 (FreeBSD) PHP/5.4.11 mod_ssl/2.2.23 OpenSSL/0.9.8x DAV/2
    Transfer-Encoding:chunked
    X-Powered-By:pHP/5.4.11



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

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Я обратился сначала к хостеру и у него такая же проблема, а значит Вам скорее повезло!
    Все строчки, что Ganzal посоветовал в самое начало страницы добавил, но так и не помогло...
    siiXth, если я так сделаю, то это же не на долго спасёт ситуацию или ошибаюсь?
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вообще-то ничего не надо добавлять - ваш скрипт и так этими строками отвечает браузеру. я вам их привел чтоб вы ничего не меняли в коде - код рабочий. почему возникают проблемы с кэшированием - надо искать между сервером и клиентом
     
  6. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Так вот если бы всё было так просто я бы и не писал сюда, но всё что знал уже перепробовал...
    Прошу теперь помощи от более знающих товарищей. Проверено уже на 4 компах - у них тоже код не меняется, а на прямую при обращении к картинке всё замечательно...
     
  7. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    это железный вариант
    по сути данный гет должен быть связан с кодом на картинке, к нему посылается хеш, он выдаёт по этому хешу определённую картинку, всё это на хешах и токенах, но я не знаю какая у вас реализация. гет параметр даёт записывать в кеш картинку по каждому гету, но так как там рандом или связь - картинка при каждой загрузке будет с новым гетом качаться с сервера так как её не будет в кеше. а про засорение кеша думать не стоит - современные браузеры давно его чистят периодически даже не обращая внимания на заголовки, да и в кеше у любого юзера и так полно дряни.

    Добавлено спустя 1 минуту 29 секунд:
    вы не представляете какую херню я наблюдал у людей под палёными браузерами. дайте полную справку о браузерах на каких есть такая трабла.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    братуха ну будь проще а
    тебе ответ уже был дан. попробуй сначала.
     
  9. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Код такой:
    Код (Text):
    1. <?php
    2. $DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
    3. define("code_dir", "my_codegen/");
    4. function generate_code()
    5. {            
    6. $hours = date("H");    
    7. $mouns = date("m");            
    8. $year_day = date("z");
    9. $minuts = substr(date("H"),0,1);
    10. $str = $hours . $mouns . $year_day . $minuts;
    11. $str = md5(md5($str));
    12. $str = strrev($str);
    13. $str = substr($str, 2, 5);
    14. $array_mix = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
    15. srand ((float)microtime()*1000000);
    16. shuffle ($array_mix);
    17. return implode("", $array_mix);
    18. }
    19. function img_code()
    20. {
    21. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                  
    22. header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT");
    23. header("Cache-Control: no-store, no-cache, must-revalidate");        
    24. header("Cache-Control: post-check=0, pre-check=0", false);          
    25. header("Pragma: no-cache");                                          
    26. header("Content-Type:image/png");
    27. $linenum = 2;
    28.     $img_arr = array(
    29.     "codegen.png",
    30.     "codegen0.png"
    31.     );
    32. $font_arr = array();
    33. $font_arr[0]["fname"] = "verdana.ttf";
    34. $font_arr[0]["size"] = 16;
    35. $font_arr[1]["fname"] = "times.ttf";
    36. $font_arr[1]["size"] = 16;
    37. $n = rand(0,sizeof($font_arr)-1);
    38. $img_fn = $img_arr[rand(0, sizeof($img_arr)-1)];
    39. $im = imagecreatefrompng (code_dir . $img_fn);
    40.     for ($i=0; $i<$linenum; $i++)
    41.     {
    42.     $color = imagecolorallocate($im, rand(0, 150), rand(0, 100), rand(0, 150));
    43.     imageline($im, rand(0, 20), rand(1, 50), rand(150, 180), rand(1, 50), $color);
    44.     }
    45.     $color = imagecolorallocate($im, rand(0, 200), 0, rand(0, 200));
    46.     imagettftext ($im, $font_arr[$n]["size"], rand(-4, 4), rand(10, 45), rand(20, 35), $color, code_dir.$font_arr[$n]["fname"], generate_code());
    47.     for ($i=0; $i<$linenum; $i++)
    48.     {
    49.     $color = imagecolorallocate($im, rand(0, 255), rand(0, 200), rand(0, 255));
    50.     imageline($im, rand(0, 20), rand(1, 50), rand(150, 180), rand(1, 50), $color);
    51.     }
    52.     ImagePNG ($im);
    53.     ImageDestroy ($im);
    54. }
    55. img_code();
    56. ?>
    И попробовал Ваш способ-он лишь раз изменил код и потом опять завис...браузеры все выдают одно и то же (мазила, опера, хром, осёл)!

    Добавлено спустя 45 секунд:
    попробовал уже...написал ответ выше!
     
  10. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Код (Text):
    1. <img class="" src="code/my_codegen.php">
    не вижу изменений
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Last-modified почему 1000? ставьте реальное время сервера
     
  12. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    я убрал уже...вот обратно вернул...
    - что бы кэш обнулять каждый раз...
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да? с чего бы это? модификация 1970 год, протухает в 1997 году. вопрос от кэша - изменилось с 1970 года? какие-то кэши видят что протухло в 1997, а какие-то - что не изменилось с 1970.
    уберите эти 10000 и сервер будет подставлять свою дату и будет так: изменилось "сейчас", протухло 1997 следовательно кэшировать уже не нужно. повторный запрос: изменилось с "сейчас"? да, так как протухло еще в 1997.

    вообще вам реально проще не в механизме conditional-get разбираться а просто вставить рандомный токен в вызов скрипта.
     
  14. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    - вот тут понять у меня знаний вообще не хватает уж извините!
    - значит вместо:
    Код (Text):
    1. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                  
    2. header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT");
    3. header("Cache-Control: no-store, no-cache, must-revalidate");        
    4. header("Cache-Control: post-check=0, pre-check=0", false);          
    5. header("Pragma: no-cache");                                          
    6. header("Content-Type:image/png");
    я пишу:
    Код (Text):
    1. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                  
    2. header("Cache-Control: no-store, no-cache, must-revalidate");        
    3. header("Cache-Control: post-check=0, pre-check=0", false);          
    4. header("Pragma: no-cache");                                          
    5. header("Content-Type:image/png");
    Правильно понял?

    Добавлено спустя 3 минуты 11 секунд:
    Самое интересное, что ещё позавчера всё работало же...
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не, убрать надо только 10000 из header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT");

    и еще есть http_date() которая возвращает строку в требуемом RFC-2616 формате. то есть header('Last-Modified: ' . http_date()); и все

    да ничего страшного. ветка же для новичков) вам уже написали как надо сделать - в сгенерированном HTML вызов картинки должен обрести вид:
     
  16. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    я это сделал уже давно-не помогло!Я вообще не могу понять как это поможет, если цифры и буквы являются результатом динамического php кода!
    Пишу так:
    Код (Text):
    1. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                  
    2. header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    3. header("Cache-Control: no-store, no-cache, must-revalidate");        
    4. header("Cache-Control: post-check=0, pre-check=0", false);          
    5. header("Pragma: no-cache");                                          
    6. header("Content-Type:image/png");
    ?

    Добавлено спустя 6 минут 27 секунд:
    выдаёт ошибку:
    Код (Text):
    1. Call to undefined function http_date()
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну как бы интернет не первый год работает. есть стандарты по которым работают серверы и клиенты. когда вы не добавляете параметров то браузер будет стараться считать ресурс статическим и будет стремиться его кэшировать. если появляется GET-запрос - динамическим и закэшировать его можно будет только с соответствующими заголовками. POST-запрос вообще не кэшируется и всегда подтверждается.

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

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    После добавления ?r=85423742423 код меняется единожды и опять замирает.
    Такая ситуация у меня на работе, дома, у хостеров, у товарища, тем более буквально два дня назад всё было замечательно...ума не приложу, что можно сделать...
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну ты врунишка =)

    сделай сейчас ещё раз и давай я посмотрю, будет кешироваться или нет.

    Добавлено спустя 1 минуту 19 секунд:
    код должен быть КАЖДЫЙ РАЗ РАЗНЫЙ. тебе сказали сделай рандом.

    <img class="" src="code/my_codegen.php?r=<?php echo rand(0,999999);?>">
     
  20. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Пробуй!
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  22. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (Text):
    1. Request URL:http://www.lu4ick.ru/code/my_codegen.php?r=%3C?php%20echo%20rand(0,999999);?%3E
    отлично, чо)
     
  23. Panich

    Panich Активный пользователь

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Так я не правильно сделал?Что не так?
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а ты понимаешь вообще что тут написано:
    <img class="" src="code/my_codegen.php?r=<?php echo rand(0,999999);?>">
     
  25. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да вообще этого вполне будет достаточно. но. у вас на странице иногда не одна капча а несколько. пока будет отдаваться последняя - первая уже будет невалидна. тут много чего придется переписать...