powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по алгоритму повтора процедуры
11 сообщений из 11, страница 1 из 1
Вопрос по алгоритму повтора процедуры
    #39800481
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть веб-сервис, работа с которым организована следующим образом.
Перед началом работ необходимо запросить с сервиса токен доступа. Токен доступа действует несколько часов.
После того, как токен доступа получен, у сервиса можно вызывать определенные методы.
Если метод по какой-либо причине выполнить нельзя, то возвращается ошибка; в том числе ошибка будет возвращена при использовании недействительного токена.
По умолчанию токен действует 6 часов, у меня токен кешируется на 4 часа, чтобы повторный получать досрочно.
Но иногда на сервере текущие токены сбрасываются, и тогда закешированные токены становятся недействующими досрочно.
Метода проверки токена на сервисе не предусмотрено, о недействительном токене можно узнать только если попробовать с его помощью вызвать какой-либо метод.
Структурно взаимодействие с сервисом сделано так:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
<?php

class ...
{

	function __construct($options=null)
	{
		...
		if (...) $this->auth();
	}

	function http($cmd, $data=null, $args=null, $method='POST')
	{
		...
		$curl = $this->curl;
    ...
		for ($attempt = 1; $attempt <= $ncnt; $attempt++)
		{
			...
			$res = curl_exec($curl);
			if (isset($res) && ($res !== false))
			{
				$json = json_decode($res, true);
				$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
				if ($status == 200)
				{
					if (json_last_error() == JSON_ERROR_NONE)
					{
						...
						return $json;
					}
					else
					{
						...
						return $this->error;
					}
				}
				elseif (($cmd != 'getToken') && ($status == 401) && isset($json) && isset($json['error']) && ($json['error']['code'] == 4))
				{
					...
						$this->auth(true);
						return $this->http($cmd, $data, $args, $method);
					...
				}
				else
				{
					...
					return $this->error;
				}
			}
			else
			{
				$this->error = '#'.curl_error($curl);
			}
		}
		return;
	}

	function auth($force=false)
	{
		...
		$cmd = 'getToken';
		$this->token = null;
		...
		$ret = $this->http($cmd, $params);
		...
		$this->token = $ret['token'];
		return $ret['token'];
	}

	function прочие-методы...

}


Методы сервиса доступны как методы классов (метод auth и прочие), которые в свою очередь вызывают внутренний метод http.
Сейчас внутри http обрабатывается специфичная ошибка и в случае просроченного токена он запрашивается повторно и http повторяется.
Или лучше проверку и повтор вынести во внешние методы (которые будут анализировать результат http и в случае просроченного токена получать новый и повторять запрос)?
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39800555
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Или лучше проверку и повтор вынести во внешние методы (которые будут анализировать результат http и в случае просроченного токена получать новый и повторять запрос)?Сходу как-то не понятно, чем именно оно может быть лучше. Если только в разных методах должна быть разная обработка... Но об этом нет информации.

Насколько понимаю, один и тот же токен используется в разных методах класса. Тогда какая разница, в том или в другом методе проявилась проблема? Способ обнаружения и устранения проблемы один. Если по какой-то причине очень не хочется держать проверялку-обновлялку именно в методе http(), так можно вынести код в какой-то приватный метод (или несколько, если алгоритмы сильно разные) и вызывать его по необходимости. А если токен используется и одинаково восстанавливается во множестве классов, так и вовсе можно вынести код в базовый класс, от которого эти классы будут наследоваться. ИМХО конечно.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39800557
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разница в том, что в одном случае вызов http выполняется рекурсивно, в другом случае во внешнем цикле.
Есть ли тут какая-то заметная разница?
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39800685
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тнехнически - не вижу проблем. Насколько понимаю, рекурсия вглубь лишь на один уровень ныряет.

Логически же получается в некотором смысле непорядочек. Если правильно понимаю, рекурсия тут не нужна, достаточно запустить повторно curl_exec() с новым токеном.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39801219
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМетода проверки токена на сервисе не предусмотрено, о недействительном токене можно узнать только если попробовать с его помощью вызвать какой-либо метод.
в методе проверки нет никакого смысла, т.к. результат имеет смысл только на момент вызова метода, нет гарантии, что валидный, в один момент, токен не протухнет к моменту вызова след метода.

авторСейчас внутри http обрабатывается специфичная ошибка и в случае просроченного токена он запрашивается повторно и http повторяется.
Или лучше проверку и повтор вынести во внешние методы (которые будут анализировать результат http и в случае просроченного токена получать новый и повторять запрос)?
я бы не стал смешивать логику вызова и логику потора и вынес ее повыше.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39801256
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийв методе проверки нет никакого смысла, т.к. результат имеет смысл только на момент вызова метода, нет гарантии, что валидный, в один момент, токен не протухнет к моменту вызова след метода.
Смысл вполне практичный — упростить обработку вызова и ошибок.
Это как валидация полей формы на клиенте — на сервере это все-равно проверяется, но дополнительный контроль на клиенте сделает это более удобным и понятным для пользователя. В случае с веб-сервисом пользователем является мой скрипт.

Дегтярев Евгенийя бы не стал смешивать логику вызова и логику потора и вынес ее повыше.
Да, аргумент.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39801258
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleЛогически же получается в некотором смысле непорядочек. Если правильно понимаю, рекурсия тут не нужна, достаточно запустить повторно curl_exec() с новым токеном.
Да, если упростить, то именно так.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39801289
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Смысл вполне практичный — упростить обработку вызова и ошибок.
Это как валидация полей формы на клиенте — на сервере это все-равно проверяется, но дополнительный контроль на клиенте сделает это более удобным и понятным для пользователя. В случае с веб-сервисом пользователем является мой скрипт.
а я говорю про то что наличие такого метода ничего не упрощает, т.к. между вызовом метода проверки, который скаал - ок, и следующим вызовом метода, токен может протухнуть, а следовательно проверки на предмет ошибок невалидного токена никуда не денуться
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39802511
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгениймежду вызовом метода проверки, который скаал - ок, и следующим вызовом метода, токен может протухнуть, а следовательно проверки на предмет ошибок невалидного токена никуда не денуться
Упрощение в том, что подобная ситуация будет маловероятной и проверка будет намного проще — вместо запроса нового токена и повтора запроса будет просто фиксироваться сбой метода.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39802519
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Редактировать нельзя, поэтому поясню в отдельном сообщении.
Ранее алгоритм работы скрипта был следующий:
1. Скрипт получает токен из кеша и проверяет срок его действия (по умолчанию токен действует 6 часов с момента получения).
2. Если срок истек, то скрипт получает новый токен и кеширует его.
3. Затем используя полученный токен (из кеша или новый) скрипт вызывает метод веб-сервиса.
Если по какой-то причине токен завершил свое действие досрочно (например на сервере сбросили все токены), то скрипт пропускает пункт 2, а на пункте 3 при попытке выполнения метода фиксирует в логе ошибку. Первоначально предполагалось, что подобный досрочный сброс токенов это ситуация исключительно редкая, поэтому подобные ошибки будут обрабатываться вручную.
Но оказалось, что они возникают достаточно часто (минимум раз в неделю), поэтому и пришлось эту ситуацию автоматизировать.
Если бы у веб-сервиса был метод, позволяющий проверить валидность токена (или срок его действия), то можно было бы вернуться к предыдущей схеме — между проверкой токена и вызовом метода проходят секунды и вероятность сброса токена в этом периоде была бы крайне малой. И соответственно, ввиду редкости подобного события никакой специальной обработки программировать бы не пришлось, в логе бы просто фиксировался сбой вызова метода с последующим ручным разбором причин.
...
Рейтинг: 0 / 0
Вопрос по алгоритму повтора процедуры
    #39802565
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то что вам так проще еще не значит что это правильно

авторЕсли бы у веб-сервиса был метод, позволяющий проверить валидность токена (или срок его действия)
для начала можно поразмышлять на тему почему авторы сервиса не предоставили такой метод
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по алгоритму повтора процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]