<?php if (is_user_logged_in());
?>Estou tentando fazer uma solicitação PHP para uma API externa, mas a solicitação expira periodicamente, mesmo que o endpoint da API pareça estar online e respondendo normalmente quando eu o testo diretamente.
O problema não ocorre em todas as solicitações. Algumas solicitações são concluídas em menos de um segundo, enquanto outras aguardam até que o limite de tempo limite seja atingido.
Estou tentando determinar se isso é mais provavelmente causado pela minha configuração do PHP, pela API remota, pela latência do DNS/network ou pela forma como estou lidando com a solicitação.
Código PHP atual
<?php
$url = 'https://api.example.com/products';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPHEADER => <span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">[
'Accept: application/json',
]</span>,
]);
$response = curl_exec($ch);
if ($response === false) {
echo 'cURL Error: ' . curl_error($ch);
} else {
$data = json_decode($response, true);
echo '<pre>';
print_r($data);
echo '</pre>';
}
curl_close($ch);O que eu já verifiquei
- A URL da API carrega com sucesso quando testada diretamente.
- O PHP cURL está habilitado no servidor.
- A maioria das solicitações funciona corretamente.
- Aumentar
CURLOPT_TIMEOUTapenas faz com que as solicitações com falha demorem mais para retornar um erro. - O próprio servidor não parece estar com uso de CPU ou memória anormalmente alto.
- O problema ocorre intermitentemente, em vez de em todas as solicitações.
Exemplo de erro
cURL error 28:
Operation timed out after 30001 milliseconds
with 0 bytes receivedO que estou tentando descobrir
Qual seria a melhor maneira de solucionar o problema Isto?
Você recomendaria verificar:
- o tempo de pesquisa de DNS?
- o tempo de conexão separadamente do tempo total da solicitação?
- os cabeçalhos de resposta do servidor remoto?
- os limites do PHP-FPM?
- o firewall ou as regras de conexão de saída?
- a lógica de repetição?
- a taxa da API
- Registrar informações detalhadas de tempo do cURL?
Gostaria também de saber se repetir a solicitação automaticamente é considerada uma boa abordagem ou se isso poderia piorar o problema caso a API remota já esteja apresentando problemas.
Se as repetições forem apropriadas, qual seria uma estratégia razoável de repetição em PHP sem causar solicitações duplicadas ou carga desnecessária?
Adicionando CSS e HTML para teste:
.testt {
}<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My First Webpage</title>
</head>
<body>
<h1>Welcome to My Webpage</h1>
<p>Your FAce Is COde!.</p>
</body>
</html>
2 Answers