За последние 24 часа нас посетили 21735 программистов и 1022 робота. Сейчас ищут 716 программистов ...

Преобразуйте код, который при нажатии на кнопку обновлял данные

Тема в разделе "Сделайте за меня", создана пользователем vasiliygilbert, 7 июн 2017.

Метки:
  1. vasiliygilbert

    vasiliygilbert Новичок

    С нами с:
    22 апр 2017
    Сообщения:
    21
    Симпатии:
    0
    Есть пример кода:
    PHP:
    1. <form method="POST">
    2.   <button name="checkI">Refresh Inventory</button>
    3.   </form>
    4.   <? if(isset($_POST['checkI'])){  
    5.   $a = "http://steamcommunity.com/id/bennysgaming/";
    6.  
    7. $get_content = file_get_contents("$a/inventory/json/730/2");
    8. $content = $get_content;
    9. file_put_contents('cache.html', $content);
    10.      }
    11. $data_image = (array) json_decode($get_content) -> rgInventory;
    12. $count_content = count($data_image);
    13. $data_content = (array) json_decode($get_content, TRUE);
    14. echo "Total items: $count_content <br><br>";
    15. for ($i=0; $i<$count_content; $i++) {
    16. $element_name = array_shift($data_content[rgInventory]);
    17. $name_item = "$element_name[classid]_$element_name[instanceid]";
    18. echo "<img src='http://steamcommunity-a.akamaihd.net/economy/image/";
    19. print_r($data_content['rgDescriptions'][$name_item]['icon_url']);
    20. echo "' style='width:90px; height:90px; float:left; margin: 5px; outline: 1px solid black;'>";
    21.                                    
    22. } ?>
    Который при нажатии на кнопку каждый раз обновляет инвентарь из CSGO, но мне не нравится 1) Если обновить страницу, то вылазит предупреждение: Подтвердите отправку формы 2) После 4-5 тыкания по кнопке, вылазит ошибка
    Warning: file_get_contents(http://steamcommunity.com/id/bennysgaming//inventory/json/730/2) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 429 Unknown in V:\home\x.ru\www\myprofileB.php on line 112
    ВВ общем, мне нужно данный код преобразовать, что-бы не было этих недочетов.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    замени на протокол https
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Высылай после работы скрипта перенаправление, либо делай запрос GET-ом. Потому что по-хорошему запрос на получение данных - это GET. Это буквальный перевод слова "GET".

    Стимовская защита от ддосящих ботов, скорее всего. Если частота запросов слишком высокая, сервер шлет тебя нахер. Это ок. Ограничить частоту запросов - задача трудновыполнимая. Обязательно найдется пользователь, который будет постоянно дергать рефреш.

    Просто кешируй результаты последнего запроса в файл и, при новом, проверяй, послал тебя сервер нахер или нет. Если нет - то отображай новый результат, и сразу кешируй. Если послал - то доставай страничку из кэша.
    --- Добавлено ---
    Тут это не при чем.
     
  4. vasiliygilbert

    vasiliygilbert Новичок

    С нами с:
    22 апр 2017
    Сообщения:
    21
    Симпатии:
    0
    PHP:
    1. if(isset($_POST['checkI'])){  
    2.   $a = $user['user_steamprofileurl'];
    3.   if (file_exists('cache.html') && time() - filemtime('cache.html') < 3600) {
    4.     $get_content = file_get_contents('cache.html');
    5.     } else {
    6. $get_content = file_get_contents("$a/inventory/json/730/2");
    7. $content = $get_content;
    8. file_put_contents('cache.html', $content);
    9.      }
    10. $data_image = (array) json_decode($get_content) -> rgInventory;
    11. $count_content = count($data_image);
    12. $data_content = (array) json_decode($get_content, TRUE);
    13. echo "Total items: $count_content <br><br>";
    14. for ($i=0; $i<$count_content; $i++) {
    15. $element_name = array_shift($data_content[rgInventory]);
    16. $name_item = "$element_name[classid]_$element_name[instanceid]";
    17. echo "<img src='http://steamcommunity-a.akamaihd.net/economy/image/";
    18. print_r($data_content['rgDescriptions'][$name_item]['icon_url']);
    19. echo "' style='width:90px; height:90px; float:left; margin: 5px; outline: 1px solid black;'>";
    20.                                     }
    Теперь если кеш файла не существует, то он создается и туда вносятся данные, а если существует, то из него берутся данные. Но это для одного пользователя, а если их будет несколько?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А данные уникальны для каждого? Если да, то хранить файлик временный для каждого пользователя свой. Либо храни этот кэш в виде текста в сессии. Заодно не надо будет париться по части инвалидации. Сдохла сессия - сдох кэш.
     
  6. vasiliygilbert

    vasiliygilbert Новичок

    С нами с:
    22 апр 2017
    Сообщения:
    21
    Симпатии:
    0
    Не, не вариант, если будет, к примеру, 20 000 уникальных идиотов,нажавших на кнопку, то и файлов создастся много

    Есть пример этой реализации? или напиши в моем коде, ибо я не понимаю, как это сделать
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Вот ты переменную $content пишешь в файл cache.html.
    А ты не пиши ее в файл ты пиши ее в сессию. Сессиями умеешь пользоваться? Открывать-закрывать, писать в нее? Или тут подробнее нужно остановиться? Если умеешь, то просто сначала пиши в сессию, а потом, если запрос накрылся, доставай данные не из файла, а из сессии. И пуляй пользователю.
     
  8. vasiliygilbert

    vasiliygilbert Новичок

    С нами с:
    22 апр 2017
    Сообщения:
    21
    Симпатии:
    0
    Лучше подробней остановись. Я куки могу создать.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Не, руками ничего создавать не надо. Если вкратце, то:
    1) Сессия - это механизм, позволяющий сохранять для конкретного пользователя инфу между запросами к серверу.
    2) Ее надо открыть. При это тебе будет доступен массив $_SESSION. В него можно писать что хочешь. После отработки скрипта, php сохранит этот массив в файлик во временную папку. Протухшие сессии php сам будет удалять. При этом php сам выставит пользователю сессионную куку.
    3) При повторном запросе снова стартуем сессию - если php видит сессионную куку, он проверяет, есть ли для нее подходящий файл сессии. Если есть - открывает и выгружает все в массив $_SESSION. Вуаля - он снова у нас есть. С тем же содержимым, что и прежде. Отлично!

    Вот и вся специфика.
    1) Запустил.
    2) Получил массив. Работаешь с ним.
    3) возврат к пункту 1.

    Писать можешь в него как угодно, просто $_SESSION['какой-то там ключ'] = 'какие-то там данные'.

    Ну и вот тебе дока на эту тему - https://php.net/manual/ru/session.examples.basic
     
  10. vasiliygilbert

    vasiliygilbert Новичок

    С нами с:
    22 апр 2017
    Сообщения:
    21
    Симпатии:
    0
    Смотри, что я придумал: 1) Если сессия не существует, то создать ее, записав значения $content 2) Получить данные для одного пользователя и записать их в БД, затем удалить сессию 3) Взять данные с БД и вывести пользователю инвентарь. Все-равно возникает вопрос,
    --- Добавлено ---
    Стоп, не увидел
    Как реализовать, что запрос накрылся?
    PHP:
    1. $a = 'Warning: file_get_contents(http://steamcommunity.com/id/bennysgaming//inventory/json/730/2) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 429 Unknown in V:\home\x.ru\www\myprofileB.php on line 112';
    2. if ( $a == Ошибке, которую я не знаю, как вывести ) {
    3. Код
    4. }
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А ты проверяй наличие ошибки в file_get_contents, оберни это в try{}catch{}, например.