curl_exec () sempre retorna falso

114

Eu escrevi este código simples:

$ch = curl_init();

//Set options
curl_setopt($ch, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$website_content = curl_exec ($ch);

No meu caso $website_contentvem como false. Alguém pode sugerir / aconselhar algo sobre o que pode estar errado?

Adithya
fonte
8
Consulte os curl_error()detalhes do erro e poste-os aqui, por favor.
Linus Kleen
@LinusKleen Se você postar curl_error () como uma resposta, irei votar a favor, pois me permitiu ver qual era o meu problema.
Giles Roberts
Qual era exatamente o problema? Que erro curl_error()revelou?
showdev

Respostas:

242

A verificação e o tratamento de erros são amigos do programador. Verifique os valores de retorno das funções cURL de inicialização e execução. curl_error()e curl_errno()conterá mais informações em caso de falha:

try {
    $ch = curl_init();

    // Check if initialization had gone wrong*    
    if ($ch === false) {
        throw new Exception('failed to initialize');
    }

    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt(/* ... */);

    $content = curl_exec($ch);

    // Check the return value of curl_exec(), too
    if ($content === false) {
        throw new Exception(curl_error($ch), curl_errno($ch));
    }

    /* Process $content here */

    // Close curl handle
    curl_close($ch);
} catch(Exception $e) {

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),
        E_USER_ERROR);

}

* O curl_init() manual afirma:

Retorna um identificador cURL em caso de sucesso, FALSE em erros.

Observei a função retornar FALSEquando você está usando seu $urlparâmetro e o domínio não pode ser resolvido. Se o parâmetro não for usado, a função pode nunca retornar FALSE. Sempre verifique de qualquer maneira, pois o manual não indica claramente quais são os "erros" na verdade.

Linus Kleen
fonte
9
+1: Solução de problemas simples e direta para curl em PHP em curl_execretorno FALSO. - Modo Curl Verbose no exemplo de PHP
hakre
sim. Na verdade, já havia descoberto isso há muito tempo. Obrigado pela resposta :)
Adithya
7
Sem problemas. Recebi um distintivo Revival por isso :-) Obrigado por aceitar.
Linus Kleen
@marverix bem, o nome dele é Linus: P
Nino Škopac
e não se esqueça de curl_close ($ ch);
Rafik Bari de
10

No meu caso eu preciso definir VERIFYHOSTe VERIFYPEERpara false, como este:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

antes da chamada para curl_exec($ch).

Porque estou trabalhando entre dois ambientes de desenvolvimento com certificados auto-atribuídos. Com certificados válidos não há necessidade de conjunto VERIFYHOSTe VERIFYPEERde falseporque o curl_exec($ch)método funcionará e retornar a resposta que você espera.

DanielaG
fonte
Isso foi realmente útil para mim. Obrigado pela dica!
n8jadams
3

Isso aconteceu comigo ontem e no meu caso foi porque eu estava seguindo um manual em PDF para desenvolver algum módulo de comunicação com uma API e enquanto copiava o link direto do manual, por algum motivo estranho, o hyphendo link copiado estava em um diferente codificação e, portanto, curl_exec()estava sempre retornando falseporque não conseguia se comunicar com o servidor.

Levei algumas horas para finalmente entender a diferença nos personagens abaixo:

https://www.e‐example.com/api
https://www.e-example.com/api

Sempre que tentei acessar o link diretamente de um navegador, ele se converteu em algo semelhante https://www.xn--eexample-0m3d.com/api.

Pode parecer a você que eles são iguais, mas se você verificar a codificação do hyphens aqui, você verá que o primeiro hyphené um caracteres Unicode U + 2010 e o outro é um U + 002D .

Espero que isso ajude alguém.

CÍRCULO
fonte