Requisições GET assincronas com cURL
Olá pessoal,
Vamos abaixo:
Meu carma
Possuo uma aplicação que faz requisições a uma API em Rest via cURL.
Durante o consumo desta API eu tenho diversas requisições e variaveis paralelas que fazem validação, inserção e edição de dados no banco de dados.
Durante este processo, mesmo realizando a utilização de PHP + AngularJS a requisição até ser finalizada, deixa a pagina travada até que venha um response final da API requisitada.
Possíveis técnicas a serem utilizadas
Estive estudando algumas técnicas de threading e sockets, porem o servidor atual que utilizo não possui acesso a biblioteca pthreads para o threading e a utilização via socket não consegui compreender e faze-la funcionar rsrs.
O que estou aplicando
Fazendo alguns testes, percebi que ao aplicar o cURL com um timeout de 1 segundo "resolve" o problema porque desta forma realizo o fluxo:
-
Capturo todos os dados que serão enviados a API
-
Salvo dados capturados no BD (mysqli)
-
Faço a requisição via cURL com timeout em 1 segundo para um script que fará a leitura destes dados pendentes de envio a API
-
Com os dados capturados, faço a requisição a API e então salvo o retorno e faço as devidas validações ao meu BD em "segundo plano".
De ante mão já reparei um "problema" que é justamente na requisição cURL com timeout em 1 segundo porque, uma vez que faço isso eu não tenho um retorno do meu script se ele foi requisitado ou não porque nem o http_code consigo recuperar para poder fazer qualquer tratativa e além disso também acredito que terei problemas no momento que o navegador do usuário atualizar porque a requisição feita será stopada e os dados serão salvos de forma parcial. Então, além destes problemas, temos algum outro "contra" a utilizar desta forma? Ao meu ver o que estou fazendo é mais uma gambiarra do que um código bem executado.
O que eu preciso
Uma orientação de como e qual a melhor técnica, tendo em vista minhas limitações de servidor citada acima (em relação ao pthreads), para poder realizar essa requisição GET de forma assíncrona.
cURL "async" que estou utilizando
error_reporting(E_ALL);
$url = "www.meusite.com.br/pending/read.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$result = curl_exec($ch);
if($result){
var_dump(curl_getinfo($ch));
}else{
var_dump(curl_error($ch));
var_dump(curl_getinfo($ch));
}
var_dump($result);
curl_close($ch);Discussão (2)
Carregando comentários...