Non-blocking asynchronous requests usando curl_multi e php
Nesta semana eu precisei implementar um script que, ao receber alguns dados enviados por POST pelos usuários do site, faz uma requisição http a uma api externa usando parte desses dados postados. Como as informações que essa api retorna não precisam ser exibidas para o usuário, e como essa api geralmente leva cerca de 2 segundos pra responder, para não deixar o usuário “pendurado” esperando, resolvi que faria uma requisição assíncrona não-bloqueante para um outro script que por sua vez acessaria a api e iria tratar/salvar os dados que eu necessitava.
Como o php não tem suporte a threads, a minha solução foi implementada com a biblioteca curl, mais especificamente com a função curl_multi_*(), que permite fazer requisições paralelas e assíncronas. Porém, os exemplos que encontrei tanto na documentação no php.net quanto em classes disponibilizadas por terceiros não funcionavam exatamente do jeito que eu queria, e acabei quebrando a cabeça por algumas horas para encontrar a solução, que gostaria de compartilhar aqui. Continue lendo o post »