PHP Curl Timeout e ConnectTimeout

Encontrei um problema no usando o php curl timeout . Problema relativamente leve no meu código. Utilizando o cURL para fazer o download de arquivos em um dos meus projetos me deparei com o cancelamento do download. Debugando inicialmente pensei que o arquivo que estava baixando estivesse corrompido, mas não estava, conferi todas as fontes e elas estavam perfeitas.
Segundo achei que fosse o tempo de execução do PHP, mas reparei que estava usando ele em CLI, logo não teria esse problema.
Terceiro alguma merendagem minha na configuração do cURL, esse dentre os dois primeiros tinha altas chances de ser a correta, ou a incorreta. Depende da interpretação. Esse era mesmo o problema, mas como ter certeza disso? Debugando!

Observando o código que eu tinha que está abaixo, é possível ver que ele é um código simples que qualquer tutorial de php cURL na internet te ensina a montar.

<?php
$url = "http://example.com/arquivo_grandao.zip";

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Arktre::odiopuro");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);

 

Como ter certeza agora que o problema era mesmo do cURL? Simples! Analisando o progresso do download, explico como fazer isso nesse post. Logo como saída eu tinha porcentagens de progresso variadas entre 40% e 80%, mas nunca 100%.

 

Progresso: 0.6532900454675
Progresso: 2.5532900454675
Progresso: 2.5532900454675
Progresso: 2.5532900454675
[...]
Progresso: 76.914346406643
Progresso: 77.548795145797
Progresso: 78.755615489735

Depois disso ficou fácil entender que o próprio cURL estava interrompendo o download do arquivo. O cURL tem dois parâmetros importantes de timeout o CURLOPT_CONNECTTIMEOUT e o CURLOPT_TIMEOUT, o primeiro especifica o tempo máximo que o cURL pode levar para conectar a outra ponta, e o segundo o tempo máximo de execução do cURL. Meu problema estava nesse segundo parâmetro. Como o arquivo baixado era muito grande e a minha banda não tão larga, o cURL precisava de mais tempo para baixar o arquivo completo.

<?php
$url = "http://example.com/arquivo_grandao.zip";

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Arktre::odiopuro");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0);
curl_setopt($ch, CURLOPT_TIMEOUT, 900);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);

 

Depois disso o progresso funcionou normalmente, indo até o 100. Simples de resolver!

 

Um comentário em “PHP Curl Timeout e ConnectTimeout

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.