Como fazer uma requisição POST assíncrona no PHP.
A requisição é considerada a “assíncrona” por que não será aguardado um retorno da URL de destino.
É muito útil para o envio de e-mail ou geração de logs, pois você não quer que o seu usuário fique esperando até que a execução do processo seja concluída.
Alguns servidores de e-mail são bem lentos e chegam a levar mais de 30 segundos para um simples envio em horário de pico, imagine o usuário esperando todo esse tempo.
Vamos direto ao ponto.
Para tal feito, iremos utilizar a seguinte função:
function asyncRequest($url, $payload) { foreach($payload as $key=>$value) $values[]="$key=".urlencode($value); $post_string=implode("&",$values); $parts=parse_url($url); $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30); $out = "POST ".$parts['path']." HTTP/1.1\r\n"; $out.= "Host: ".$parts['host']."\r\n"; $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; $out.= "Content-Length: ".strlen($post_string)."\r\n"; $out.= "Connection: Close\r\n\r\n"; if (isset($post_string)) $out.= $post_string; fwrite($fp, $out); fclose($fp); }
A variável “url” é o destino da requisição.
Variável “payload” é array com os dados que serão enviados via POST.
Exemplo de sua utilização.
$url = "http://teste.com.br/enviar.php"; $payload = array("nome_da_variavel_post" => "valor_de_teste"); asyncRequest($url, $payload);
Observações
- É necessário que a função fsockopen esteja habilitada
- Se não for possível utilizar a função fsockopen, utilize pfsockopen.
- A configuração allow_url_fopen, tem que estar habilitada, altere no seu php.ini se necessário.
- É uma requisição post, normal, recupere os valores utilizando $_POST, no arquivo de destino.
- Função não retorna nada, você terá que validar a execução no destino.
- Requisição post assíncrona no PHP deve ser utilizada apenas quando não existe a necessidade de validar imediatamente o sucesso da execução de uma função,


4 comentários sobre “Fazendo uma requisição POST assíncrona no PHP”