Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117

Почему возникают ошибки при отсутствии ошибок?

11.09.2025, 00:37. Показов 1336. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые специалисты. У меня есть несколько вопросов, касаемо одной темы, прошу вашей помощи и полезных советов.

Так я получаю курс BTC с внешнего источника:

PHP
1
2
3
    $url_api_btc = file_get_contents('https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=BTC,USD');
    $data_api_btc = json_decode($url_api_btc,1);
    $bitcoin_rate = $data_api_btc['USD'];
При этом весь контент сайта загружается с некоторой задержкой. То есть при открытии страницы, сначала идет задержка на 2-3 секунды или больше, а после уже загрузка всего контента сайта. Вероятнее всего потому, что этот код расположен вверху, над всем контентом. Потому что нужен вывод курса в шапке сайта, это обязательно. Существует ли какой-то способ сделать это иначе, при том чтобы переменная $bitcoin_rate работала выше всего контента?

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

И последний вопрос. Очень странная ситуация. Есть код регистрации вместе с авторизацией:

PHP
1
2
3
4
5
6
7
8
9
10
11
if (isset($_POST['reg'])) {
 
//здесь всякое разное по регистрации
//дальше авторизация, и дальше куки
 
   setcookie("user_cookies", time(), time()+ 86400 * 30,"/" );
   setcookie("user_authorization", md5($_POST['password']), time()+ 86400 * 30,"/" );
 
  header("Location: profile.php");
  exit();
}
На страницах, которые доступны только зарегистрированным и авторизованным пользователям, следующий код:

PHP
1
2
3
4
5
6
7
if (isset($_COOKIE['user_cookies']) 
   && isset($_COOKIE['user_authorization']) && 
   array_key_exists($_COOKIE[''user_cookies'],$list_id)) {
 
// отправляем на авторизацию
 
}
Так вот, если я убираю код, который берет курс BTC с внешнего источника, то все работает отлично. После регистрации пользователь автоматически авторизуется и автоматом переходит на страницу для зарегистрированных и авторизованных пользователей.
Но если я добавляю код, который берет курс BTC с внешнего источника, то чаще всего (не всегда, но почти всегда), пользователя отправляет на авторизацию и не пускает на страницу для зарегистрированных и авторизованных пользователей. Притом, что (очень важно), весь код регистрации и авторизации обрабатывается без ошибок и все куки в браузер добавляются.
Вот эту ситуацию я особенно не понимаю.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.09.2025, 00:37
Ответы с готовыми решениями:

При выполнении возникают ошибки, подскажите, как их исправить
появляются ошибки Warning: mysqli_query() expects parameter 1 to be mysqli, null given in...

Изучаю ООП и возникают ошибки "unexpected '(', expecting ',' or ';'"
Здравствуйте, я изучаю ООП и практикуя возникают вопросы не подвласные моему разуму, пока ) Надеюсь...

Uninitialized string offset возникают ошибки
Все привет возникают ошибки Notice: Undefined index: id_number in /test/test1.php on line...

14
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
11.09.2025, 01:22
Цитата Сообщение от Kuzma92 Посмотреть сообщение
при том чтобы переменная $bitcoin_rate работала выше всего контента?
Типа кеш какой-то лучше сделать.
Скрипт страницы берёт значения из сохранённого в локальный файл/бд.
Ajax-запрос , если время сохранённого больше интервала обновлений, дёргает скрипт запроса обновлнения данных, на странице и сохраняемых.
+/- если пусто или не обновляется .... варианты с показом доп.сообщений / заполнителей

Цитата Сообщение от Kuzma92 Посмотреть сообщение
PHP
1
2
3
4
5
if (isset($_COOKIE['user_cookies']) 
   && isset($_COOKIE['user_authorization']) && 
   array_key_exists($_COOKIE[''user_cookies'],$list_id)) {
// отправляем на авторизацию
}
Лишний апостроф где user_cookies.
И непонятное какое-то условие ... за что и куда шлёт, если всё есть, и даже есть ключ в массиве $list_id.
... хотя который и не ключ, а время в секундах из куки. ... типа аналог user_id ?))
1
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117
11.09.2025, 02:22  [ТС]
ft4l, спасибо вам за ваш ответ.
Цитата Сообщение от ft4l Посмотреть сообщение
Ajax-запрос
Нет, этот вариант исключается, потому как Ajax, JavaScript не используется принципиально.

$list_id - это отдельным кодом берется из общего файла, в котором добавлены все пользователи. Берется оттуда ID пользователя, ну и соответственно если нет такого, то не пускает. То есть, здесь

Цитата Сообщение от Kuzma92 Посмотреть сообщение
if (isset($_COOKIE['user_cookies'])
   && isset($_COOKIE['user_authorization']) &&
   array_key_exists($_COOKIE[''user_cookies'],$list_id)) {
// отправляем на авторизацию
}
проверка на обе (или оба =) ) куки и наличия ID пользователя в общем файле зарегистрированных пользователей. С этим как бы все работает отлично. Вот странная ситуация возникает только в том случае, если добавляю этот код для получения курса.
0
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
11.09.2025, 04:49
Так и непонятно, зачем вы записываете в 'user_cookies' штамп времени вот здесь:
Цитата Сообщение от Kuzma92 Посмотреть сообщение
PHP
6
setcookie("user_cookies", time(), time()+ 86400 * 30,"/" );
а затем этот штамп времени ищете в $list_id (массив с ID пользователей, по вашим словам) вот здесь:
Цитата Сообщение от Kuzma92 Посмотреть сообщение
PHP
1
2
3
4
5
if (isset($_COOKIE['user_cookies']) 
   && isset($_COOKIE['user_authorization']) && 
   array_key_exists($_COOKIE[''user_cookies'],$list_id)) { // <--
// отправляем на авторизацию
}
Как связаны ID пользователей и штамп времени?
1
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
11.09.2025, 05:10
Цитата Сообщение от Kuzma92 Посмотреть сообщение
Ajax, JavaScript не используется принципиально.
Оно там у них как сумашедшее иногда меняется пока догрузит страницу , уже поменяется

Попробовал сделать ещё реже... раз в 2 минуты например
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$time = time();
$Def = [
    'btc_uri'=>'https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=BTC,USD',
    'btc_cache'=> __DIR__ .'/.btc_cache.json',
    'btc_lifetime'=>$time - 120, // не чаще раз в 2 минуты
];
$btc_json = '';
 
do {
    clearstatcache(true, $Def['btc_cache']);// возможно надо
    if (@filemtime($Def['btc_cache']) > $Def['btc_lifetime'])
        break; // too fresh
    $opts = [
        'http' => [
            'method' => 'GET',
            'timeout' => '1.0',// 1 секунда максимум
            'max_redirects' => '0',
            'ignore_errors' => '1',
        ]
    ];
    $context = stream_context_create($opts);
    $btc_json = @file_get_contents($Def['btc_uri'], false, $context);
    if (!$btc_json)
        break;//... то сё ошибки ...
    file_put_contents($Def['btc_cache'], $btc_json);// обновление кеша
    //touch($Def['btc_cache']);
} while (0);
 
if (!$btc_json)
    $btc_json = @file_get_contents($Def['btc_cache']);
$data_api_btc = json_decode($btc_json,1);
////echo $data_api_btc['USD']
////, "\n", filemtime($Def['btc_cache']), "\n", $Def['btc_lifetime'] , "\n";
Но у меня менее 0.5 сек задержки вроде самые заметные

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

Добавлено через 13 минут
Цитата Сообщение от ft4l Посмотреть сообщение
пока догрузит страницу , уже поменяется
мини страничку с цифрами в мини <iframe> подгружать как вариант ешё + кнопки формы для <iframe> ... если без js
1
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
11.09.2025, 08:47
Выше верно написали про кэширование или AJAX-запрос для загрузки данных в "сквозное" содержимое страниц. Дополню только, что AJAX-запрос можно выполнять напрямую к стороннему API, если он позволяет.

Добавлено через 3 минуты
Цитата Сообщение от Kuzma92 Посмотреть сообщение
md5($_POST['password'])
Это что-то от учителей-самоучек из прошлого. Очень слабенький хэш. К тому же нужно проверять наличие и тип всех POST-параметров. Значения, естественно, тоже должны фильтроваться.

Добавлено через 7 минут
Цитата Сообщение от Kuzma92 Посмотреть сообщение
Ajax, JavaScript не используется принципиально
Почему? Для "сквозняка" (а не основного содержимого) можно пробовать использовать AJAX для всех. Или "обеднять" информативность страниц в случае, когда AJAX не поддерживается клиентом. Только используйте для AJAX-запросов какой-нибудь "полифил", чтобы охватить максимальное количество клиентов.
1
Эксперт PHP
 Аватар для liris
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
11.09.2025, 10:08
Цитата Сообщение от Kuzma92 Посмотреть сообщение
При этом весь контент сайта загружается с некоторой задержкой. То есть при открытии страницы, сначала идет задержка на 2-3 секунды или больше, а после уже загрузка всего контента сайта. Вероятнее всего потому, что этот код расположен вверху, над всем контентом. Потому что нужен вывод курса в шапке сайта, это обязательно.
Все правильно вы понимаете. Пока вам сервер не ответит на ваш запрос - ваша страница не загрузится. И это очень плохая практика, потому что если вашим сервисом начнут пользоваться тысячи человек, то и к стороннему серверу будут лететь тысячи запросов. Если сервис бесплатный - он вас просто забанит. Если платный - разоритесь на API.

Намного лучше вариант, когда у вас отдельный скрипт периодически запрашивает актуальный курс. И сохраняет это значение локально. И при загрузке страницы вы просто выдергиваете это значение из своего кэша. Можно использовать быстрые хранилки типа Redis или Memcache. Ну или просто вашу базу данных.

Добавлено через 1 минуту
Цитата Сообщение от Kuzma92 Посмотреть сообщение
Очень странная ситуация
Убедитесь, что до установки кук у вас нет никакого вывода. Куки шлют в заголовке запроса, соответственно до начала тела запроса.
1
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117
11.09.2025, 15:06  [ТС]
Цитата Сообщение от long399 Посмотреть сообщение
Так и непонятно, зачем вы записываете в 'user_cookies' штамп времени вот здесь:
Цитата Сообщение от long399 Посмотреть сообщение
Как связаны ID пользователей и штамп времени?
long399, при регистрации пользователю присваивается ID, он берется из time(), чтобы не изобретать велосипед. Этот ID записывается в файл регистрации всех пользователей, а также в файл авторизация всех пользователей. Ну а потом уже при авторизации сравнивается этот ID между куки и наличием этого ID в файле авторизация всех пользователей.

Цитата Сообщение от ft4l Посмотреть сообщение
мини страничку с цифрами в мини <iframe> подгружать как вариант ешё + кнопки формы для <iframe> ... если без js
ft4l,
estic,
ифреймы и скрипты принципиально не используются, потому что сайт в сети TOR, ну а там если пользователь поставит безопасный режим браузера, то ни то ни другое просто работать не будет. Поэтому только PHP. Вот в чем дело.

Цитата Сообщение от liris Посмотреть сообщение
Убедитесь, что до установки кук у вас нет никакого вывода.
liris, так в том то и дело, что нет. Поэтому это очень и очень странно. Я даже зацепиться ни за что не могу, чтобы понять причину такого поведения. Н и что, что идет задержка при загрузки страницы в связи с получением данных из файла, который размещен на другом сервере. Но это же не должно быть причиной. Короче, не могу понять такую странность)

ft4l, посмотрел ваш код. Скажите, я правильно понимаю, что запись данных будет сохраняться и каждые Nсек пересохраняться во временном файле и читаться уже из него? И еще хотел спросить вот что, я привел только пример того, что беру курс только BTC. Но на самом деле, я беру оттуда курсы двух монет - битка и Monero:
https://min-api.cryptocompare.... ms=BTC,USD
https://min-api.cryptocompare.... ms=XMR,USD
Не совсем понимаю, это мне тогда под каждую монету получается писать отдельный код и сохранять данные в разных файлах, или же как-то можно это объединить?

Извиняюсь конечно, я не супер специалист в PHP, поэтому многого еще не понимаю и возможно задаю много глуповатых вопросов, не бейте сильно)
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
11.09.2025, 15:31
Цитата Сообщение от Kuzma92 Посмотреть сообщение
При этом весь контент сайта загружается с некоторой задержкой. То есть при открытии страницы, сначала идет задержка на 2-3 секунды или больше, а после уже загрузка всего контента сайта. Вероятнее всего потому, что этот код расположен вверху, над всем контентом. Потому что нужен вывод курса в шапке сайта, это обязательно. Существует ли какой-то способ сделать это иначе, при том чтобы переменная $bitcoin_rate работала выше всего контента?
как-то обращаться к сторонним сервисам во время формировании страницы не очень.. Я бы хранил курсы у себя в БД и обновлял по крону.
1
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
11.09.2025, 15:59
Цитата Сообщение от Kuzma92 Посмотреть сообщение
как-то можно это объединить?
Там вроде есть варианты https://developers.coindesk.com/documentation/legacy/Price/multipleSymbolsPriceEndpoint
Например https://min-api.cryptocompare.... ms=USD,EUR
выхлоп : {"BTC":{"USD":113960.81,"EUR":97217},"ETH":{"USD":4411.67,"EUR":3762.71}}

Добавлено через 8 минут
Цитата Сообщение от Kuzma92 Посмотреть сообщение
запись данных будет сохраняться и каждые Nсек
Типа того )) каждык две минуты кто-то будет ждать...
+ по хорошему блокировать файл надо ... чтобы возможно одновременно кто-то тоже ждал... или надо подумать,) как идеальнее ))

Добавлено через 8 минут
Цитата Сообщение от ft4l Посмотреть сообщение
touch($Def['btc_cache']);
сразу после выявления устаревшести может слегка протолкнуть сразу за тем последующие параллельные.

Добавлено через 3 минуты
логирование надо на такие моменты прикрутить и наблюдать
1
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117
11.09.2025, 16:03  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
как-то обращаться к сторонним сервисам во время формировании страницы не очень.. Я бы хранил курсы у себя в БД и обновлял по крону.
sad67man, крон точно, не рассматривается. А вот хранение в БД или в файле, как написал вариант ft4l, это наверное да, грамотное решение.
Цитата Сообщение от ft4l Посмотреть сообщение
Там вроде есть варианты
я имел ввиду ваш код, который вы написали) То я и спрашивал, под куждую монету писать отдельный код и хранить данные курсов в разных файлах, или же как-то это можно объединить?
Цитата Сообщение от ft4l Посмотреть сообщение
сразу после выявления устаревшести может слегка протолкнуть сразу за тем последующие параллельные.
Извиняюсь, но это немного выше моего уровня знаний, поэтому не совсем все понимаю))
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
11.09.2025, 16:20
Цитата Сообщение от Kuzma92 Посмотреть сообщение
sad67man, крон точно, не рассматривается. А вот хранение в БД или в файле, как написал вариант ft4l, это наверное да, грамотное решение.
А почему? допустим обновлять раз в минуту? Вот если зайдут одновременно 2 пользователя и данные устарели.. получается оба будут обновлять или один ждать другого... ну такое.. Зачем все эти сложности?
1
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
11.09.2025, 16:53
Цитата Сообщение от Kuzma92 Посмотреть сообщение
выше моего уровня знаний
моего тоже ))
Просто если представить что каждую секунду будет стучаться десяток запросов страницы,
то одновременно для нескольких кеш может оказаться устаревшим, и несколько/все они начнут его обновлять одновременно.
Но если первый из них успеет сделать touch — Устанавливает время доступа и модификации файла
, так чтобы до проверки другими... то обновит только он.

Без логирования и испытания под нагрузкой я затрудняюсь даже сказать насколько такое будет срабатывать... шанс улучшения есть.
Грамотнее конечно по крону, о чём здесь сказали, .... проще и вообще не напрягая клиентские запросы... мой вариант более сердитый ))
Интересен тоько тем что интересно пощупать вживую как и что с конкурентными заросами/доступом.
1
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
11.09.2025, 19:27
Цитата Сообщение от ft4l Посмотреть сообщение
+ по хорошему блокировать файл надо ... чтобы возможно одновременно кто-то тоже ждал... или надо подумать,) как идеальнее ))
Для подобных вещей существует неблокирующее кэширование

Цитата Сообщение от Kuzma92 Посмотреть сообщение
крон точно, не рассматривается. А вот хранение в БД или в файле, как написал вариант ft4l, это наверное да, грамотное решение.
Крон и хранение не конкурируют между собой, а дополняют "По крону" выполняете запрос к API с таймаутом, получаете данные (или не получаете) и можете сразу формировать файловый кэш блоков "сквозняка". Даже без сохранения полученных данных в базе данных. Роль источника данных здесь будет исполнять непосредственно сторонний API.

Добавлено через 7 минут
Сравнивайте сформированные образы блоков в памяти и ранее сохраненные в кэше, чтобы без толку не переписывать кэш каждые N минут/секунд.
1
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
25.09.2025, 12:21
Лучший ответ Сообщение было отмечено Kuzma92 как решение

Решение

По поводу кеширования не нужно ничего усложнять.
Самый простой вариант загрузить курс при помощи JS, для этого даже не нужно к бэку обращаться:
HTML5
1
2
3
4
5
6
<p>USD: <span id="usdRate">...</span></p>
<script>
    fetch('https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=BTC,USD').then(response => response.json()).then(json => {
        document.getElementById('usdRate').innerText = json['USD']
    })
</script>
Если по каким-то причинам использование JavaScript не допустимо, то можно кешировать файл:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(time() > filemtime('rates.txt') + 3600) {
  $rate = file_get_contents('https://...');
  $rate = json_decode($rate)['USD'];
  file_put_contents('rates.txt', $rate);
} else {
  $rate = file_get_contents('rate.txt');
}
 
...
 
<?= $rate ?>
Переживать что в роковые доли одной секунды куча народу повторно загружать кеш совершенно не стоит. Скорее всего это произойдёт примерно никогда. Но даже в этом случае, кеш всего лишь два или пять раз подряд обновится - ничего особо плохого в этом нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.09.2025, 12:21
Помогаю со студенческими работами здесь

В php возникают ошибки
Всем привет! прошу помощи так как я сам не могу разобраться. Я переношу сайт на opencart. Но в...

Периодически возникают ошибки подключения
Вот такие ошибочки

Почему при отсутствии атрибута name в php поток нет ввода ?
День добрый! Экспериментирую с PHP. Делаю простую форму &lt;form action=&quot;test.php&quot;...

$_FILES['userfile']['error'] равен "2", при любом значении и при отсутствии MAX_FILE_SIZE.
Здравствуйте, я только начал изучать пхп, пишу простенький загрузчик файлов, но у меня проблема!...

Почему возникает ошибка? Call to undefined function: xmldoc()
Подскажите пожалуйста, почему возникает ошибка? &lt;?php $news = array(); $xml =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru