Есть пример кода: PHP: <form method="POST"> <button name="checkI">Refresh Inventory</button> </form> <? if(isset($_POST['checkI'])){ $a = "http://steamcommunity.com/id/bennysgaming/"; $get_content = file_get_contents("$a/inventory/json/730/2"); $content = $get_content; file_put_contents('cache.html', $content); } $data_image = (array) json_decode($get_content) -> rgInventory; $count_content = count($data_image); $data_content = (array) json_decode($get_content, TRUE); echo "Total items: $count_content <br><br>"; for ($i=0; $i<$count_content; $i++) { $element_name = array_shift($data_content[rgInventory]); $name_item = "$element_name[classid]_$element_name[instanceid]"; echo "<img src='http://steamcommunity-a.akamaihd.net/economy/image/"; print_r($data_content['rgDescriptions'][$name_item]['icon_url']); echo "' style='width:90px; height:90px; float:left; margin: 5px; outline: 1px solid black;'>"; } ?> Который при нажатии на кнопку каждый раз обновляет инвентарь из 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 ВВ общем, мне нужно данный код преобразовать, что-бы не было этих недочетов.
Высылай после работы скрипта перенаправление, либо делай запрос GET-ом. Потому что по-хорошему запрос на получение данных - это GET. Это буквальный перевод слова "GET". Стимовская защита от ддосящих ботов, скорее всего. Если частота запросов слишком высокая, сервер шлет тебя нахер. Это ок. Ограничить частоту запросов - задача трудновыполнимая. Обязательно найдется пользователь, который будет постоянно дергать рефреш. Просто кешируй результаты последнего запроса в файл и, при новом, проверяй, послал тебя сервер нахер или нет. Если нет - то отображай новый результат, и сразу кешируй. Если послал - то доставай страничку из кэша. --- Добавлено --- Тут это не при чем.
PHP: if(isset($_POST['checkI'])){ $a = $user['user_steamprofileurl']; if (file_exists('cache.html') && time() - filemtime('cache.html') < 3600) { $get_content = file_get_contents('cache.html'); } else { $get_content = file_get_contents("$a/inventory/json/730/2"); $content = $get_content; file_put_contents('cache.html', $content); } $data_image = (array) json_decode($get_content) -> rgInventory; $count_content = count($data_image); $data_content = (array) json_decode($get_content, TRUE); echo "Total items: $count_content <br><br>"; for ($i=0; $i<$count_content; $i++) { $element_name = array_shift($data_content[rgInventory]); $name_item = "$element_name[classid]_$element_name[instanceid]"; echo "<img src='http://steamcommunity-a.akamaihd.net/economy/image/"; print_r($data_content['rgDescriptions'][$name_item]['icon_url']); echo "' style='width:90px; height:90px; float:left; margin: 5px; outline: 1px solid black;'>"; } Теперь если кеш файла не существует, то он создается и туда вносятся данные, а если существует, то из него берутся данные. Но это для одного пользователя, а если их будет несколько?
А данные уникальны для каждого? Если да, то хранить файлик временный для каждого пользователя свой. Либо храни этот кэш в виде текста в сессии. Заодно не надо будет париться по части инвалидации. Сдохла сессия - сдох кэш.
Не, не вариант, если будет, к примеру, 20 000 уникальных идиотов,нажавших на кнопку, то и файлов создастся много Есть пример этой реализации? или напиши в моем коде, ибо я не понимаю, как это сделать
Вот ты переменную $content пишешь в файл cache.html. А ты не пиши ее в файл ты пиши ее в сессию. Сессиями умеешь пользоваться? Открывать-закрывать, писать в нее? Или тут подробнее нужно остановиться? Если умеешь, то просто сначала пиши в сессию, а потом, если запрос накрылся, доставай данные не из файла, а из сессии. И пуляй пользователю.
Не, руками ничего создавать не надо. Если вкратце, то: 1) Сессия - это механизм, позволяющий сохранять для конкретного пользователя инфу между запросами к серверу. 2) Ее надо открыть. При это тебе будет доступен массив $_SESSION. В него можно писать что хочешь. После отработки скрипта, php сохранит этот массив в файлик во временную папку. Протухшие сессии php сам будет удалять. При этом php сам выставит пользователю сессионную куку. 3) При повторном запросе снова стартуем сессию - если php видит сессионную куку, он проверяет, есть ли для нее подходящий файл сессии. Если есть - открывает и выгружает все в массив $_SESSION. Вуаля - он снова у нас есть. С тем же содержимым, что и прежде. Отлично! Вот и вся специфика. 1) Запустил. 2) Получил массив. Работаешь с ним. 3) возврат к пункту 1. Писать можешь в него как угодно, просто $_SESSION['какой-то там ключ'] = 'какие-то там данные'. Ну и вот тебе дока на эту тему - https://php.net/manual/ru/session.examples.basic
Смотри, что я придумал: 1) Если сессия не существует, то создать ее, записав значения $content 2) Получить данные для одного пользователя и записать их в БД, затем удалить сессию 3) Взять данные с БД и вывести пользователю инвентарь. Все-равно возникает вопрос, --- Добавлено --- Стоп, не увидел Как реализовать, что запрос накрылся? PHP: $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'; if ( $a == Ошибке, которую я не знаю, как вывести ) { Код }