mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Updated IpLocation resolver to be able to provide limits in order to apply sleeps
This commit is contained in:
@@ -55,6 +55,7 @@ class ProcessVisitsCommand extends Command
|
|||||||
$io = new SymfonyStyle($input, $output);
|
$io = new SymfonyStyle($input, $output);
|
||||||
$visits = $this->visitService->getUnlocatedVisits();
|
$visits = $this->visitService->getUnlocatedVisits();
|
||||||
|
|
||||||
|
$count = 0;
|
||||||
foreach ($visits as $visit) {
|
foreach ($visits as $visit) {
|
||||||
$ipAddr = $visit->getRemoteAddr();
|
$ipAddr = $visit->getRemoteAddr();
|
||||||
$io->write(\sprintf('%s <info>%s</info>', $this->translator->translate('Processing IP'), $ipAddr));
|
$io->write(\sprintf('%s <info>%s</info>', $this->translator->translate('Processing IP'), $ipAddr));
|
||||||
@@ -65,6 +66,7 @@ class ProcessVisitsCommand extends Command
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$count++;
|
||||||
try {
|
try {
|
||||||
$result = $this->ipLocationResolver->resolveIpLocation($ipAddr);
|
$result = $this->ipLocationResolver->resolveIpLocation($ipAddr);
|
||||||
|
|
||||||
@@ -85,6 +87,16 @@ class ProcessVisitsCommand extends Command
|
|||||||
$this->getApplication()->renderException($e, $output);
|
$this->getApplication()->renderException($e, $output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($count === $this->ipLocationResolver->getApiLimit()) {
|
||||||
|
$count = 0;
|
||||||
|
$seconds = $this->ipLocationResolver->getApiInterval();
|
||||||
|
$io->note(\sprintf(
|
||||||
|
$this->translator->translate('IP location resolver limit reached. Waiting %s seconds...'),
|
||||||
|
$seconds
|
||||||
|
));
|
||||||
|
\sleep($seconds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$io->success($this->translator->translate('Finished processing all IPs'));
|
$io->success($this->translator->translate('Finished processing all IPs'));
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ class ProcessVisitsCommandTest extends TestCase
|
|||||||
{
|
{
|
||||||
$this->visitService = $this->prophesize(VisitService::class);
|
$this->visitService = $this->prophesize(VisitService::class);
|
||||||
$this->ipResolver = $this->prophesize(IpApiLocationResolver::class);
|
$this->ipResolver = $this->prophesize(IpApiLocationResolver::class);
|
||||||
|
$this->ipResolver->getApiLimit()->willReturn(10000000000);
|
||||||
|
|
||||||
$command = new ProcessVisitsCommand(
|
$command = new ProcessVisitsCommand(
|
||||||
$this->visitService->reveal(),
|
$this->visitService->reveal(),
|
||||||
$this->ipResolver->reveal(),
|
$this->ipResolver->reveal(),
|
||||||
|
|||||||
@@ -48,4 +48,24 @@ class IpApiLocationResolver implements IpLocationResolverInterface
|
|||||||
'time_zone' => $entry['timezone'] ?? '',
|
'time_zone' => $entry['timezone'] ?? '',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the interval in seconds that needs to be waited when the API limit is reached
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getApiInterval(): int
|
||||||
|
{
|
||||||
|
return 65; // ip-api interval is 1 minute. Return 5 extra seconds just in case
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the limit of requests that can be performed to the API in a specific interval, or null if no limit exists
|
||||||
|
*
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public function getApiLimit(): ?int
|
||||||
|
{
|
||||||
|
return 145; // ip-api limit is 150 requests per minute. Leave 5 less requests just in case
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,4 +13,18 @@ interface IpLocationResolverInterface
|
|||||||
* @throws WrongIpException
|
* @throws WrongIpException
|
||||||
*/
|
*/
|
||||||
public function resolveIpLocation(string $ipAddress): array;
|
public function resolveIpLocation(string $ipAddress): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the interval in seconds that needs to be waited when the API limit is reached
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getApiInterval(): int;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the limit of requests that can be performed to the API in a specific interval, or null if no limit exists
|
||||||
|
*
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public function getApiLimit(): ?int;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user