Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leuuuuu

Problema com cURL

Recommended Posts

Depois de apanhar um pouquinho <_< ...

Consegui gerar o log de erros, o problema é que não adiantou muita coisa

 

Este foi o erro gerado:

[22-Oct-2011 10:36:10] PHP Fatal error: Erro: in /home/infoauto/public_html/sp/curlf.php on line 16

 

Na linha 16 temos:

$data=curl_exec($ch) or die (curl_error($ch));

 

Resumindo, já sabia que o erro era na hora de executar o cURL e também já sei que não executa por que:

couldn't connect to host

 

O que eu preciso saber é PQ couldn't connect to host

 

Lembrando que no servidor local funciona

Compartilhar este post


Link para o post
Compartilhar em outros sites

tudo bem, não queria te entregar de bandeja, mas vi que está se esforçando..

 

pega aí um exemplo

 

obs: faça o teste separado do seu sistema, salve como "curl_teste.php" ou qualquer outro nome e faça o teste com essa url com a qual você está tendo problema

 

 

curl_simple_sample.php

<?php
date_default_timezone_set('Asia/Tokyo'); // troque para a sua time zone
error_reporting( E_ALL ); 
ini_set( 'display_errors', 1 );
define( 'CHARSET',   'UTF-8' );
ini_set( 'default_charset', CHARSET );
ini_set( 'mbstring.http_output', CHARSET );
ini_set( 'mbstring.internal_encoding', CHARSET );
header( 'Content-Type: text/html; charset=' . CHARSET );

// aqui coloque os campos e seus repectivos valores
$fields = array(
   'campo_1' => 'valor_1'
   ,'campo_2' => 'valor_2'
   ,'campo_3' => 'valor_3'
);

$opt = array(
   CURLOPT_PORT => 80 // a porta do protocolo.. padrão é 80
   ,'METHOD' => 'GET'  // o método (GET ou POST)
   ,CURLOPT_URL =>'http://localhost'  // a url da pagina que receberá os dados
   ,'ENCODE_DATA' => 1
   ,CURLOPT_TIMEOUT => 5
   ,CURLOPT_HEADER => true // deixe true para exbir o cabeçalho de retorno. coloque "false" para omitir
   ,CURLOPT_MAXREDIRS => 1
   ,CURLOPT_REFERER => 'http://' . $_SERVER['SERVER_NAME']
   ,CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 9.01; Windows NT 5.0)'
   ,CURLOPT_HTTPAUTH => false
   ,CURLOPT_USERPWD => false
   ,CURLOPT_CONNECTTIMEOUT => 5
   ,CURLOPT_CONNECTTIMEOUT_MS => 5000
   ,CURLOPT_RETURNTRANSFER => true
   ,CURLOPT_FOLLOWLOCATION => false
   ,CURLOPT_ENCODING => ''
   ,CURLOPT_AUTOREFERER => true
   ,CURLOPT_SSL_VERIFYHOST => 0
   ,CURLOPT_SSL_VERIFYPEER => false
   ,CURLOPT_VERBOSE => 1
   ,CURLOPT_CAINFO => false
);

       if( !$opt[CURLOPT_SSL_VERIFYPEER] )
       {
		unset( $opt[CURLOPT_CAINFO] );
	}
       if( !$opt[CURLOPT_USERPWD] )
       {
		if( isset( $opt[CURLOPT_HTTPAUTH] ) )
		{
           unset( $opt[CURLOPT_HTTPAUTH] );
		}
       }

           $s = 0;
           switch( $opt['METHOD'] )
           {
               default:
               case 'GET':
                   $opt[CURLOPT_HTTPGET] = true;
                   $opt[CURLOPT_URL]    .= '?';
                   foreach( $fields as $k => $v )
                   {
                       $p = $k . '=' . urlencode( $v ) . '&';
                       $s += strlen( $p );
                       $opt[CURLOPT_URL] .= $p;
                   }
                   $s = strlen( $p );
               break;
               case 'POST':
                   $opt[CURLOPT_POST]    = 1;
                   if( $opt['ENCODE_DATA'] == 2 )
                   {
                       $opt[CURLOPT_POSTFIELDS]  = $fields;
                   }else{
                       $opt[CURLOPT_POSTFIELDS] = '';
                       foreach( $fields as $k => $v )
                       {
                            $opt[CURLOPT_POSTFIELDS] .= $k . '=' . urlencode( $v ) . '&';
                       }
                       $s = strlen( $opt[CURLOPT_POSTFIELDS] );
                   }
               break;
           }
           if( $s > 0 )
           {
               $opt[CURLOPT_HTTPHEADER] = array( 'Content-Type: text/xml; charset=ISO-8859-1', 'Content-length: ' . $s );
           }

unset($opt['METHOD']);
unset($opt['ENCODE_DATA']);

       $ch = curl_init(); 
       curl_setopt_array( $ch, $opt );

	/*
	foreach ($opt as $k => $v) {
		if (!curl_setopt($ch, $k, $v)) {
			//echo $k . ': ' . time(); exit;
		}
	}
	*/

       try {
           $content = curl_exec($ch);
           $err     = curl_errno($ch); // número/código do erro do curl  (não do protocolo)
           $errmsg  = curl_error($ch) ;  // mensagem de erro do curl (não do protocolo)
           $header  = curl_getinfo($ch); 
           curl_close($ch); 
           //print_r($header); exit;
           //echo time(); exit;

           if ( $err == 0 ){

               if ( $header['http_code'] == 200 ){
                   // retornou algo com sucesso
                   //echo time(); exit;
                   echo __FILE__ . ':' . __LINE__ . PHP_EOL;
                   echo $content; exit;
               }else{
                   echo __FILE__ . ':' . __LINE__ . PHP_EOL;
                   print_r($header); exit;
               }

           }else{
               echo __FILE__ . ':' . __LINE__ . PHP_EOL;
               echo 'error n: ' . $err . PHP_EOL;
               echo 'error mesg: ' . $errmsg . PHP_EOL;
               print_r($header); exit;
           }

       } catch (HttpException $ex) {
           echo __FILE__ . ':' . __LINE__ . PHP_EOL;
           echo $ex; exit;
       }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

possivelmente algum problema na resolução dns desse host.

 

tente trocar o nome dns pelo IP

"201.55.62.43"

 

está assim:

http://www3.fazenda.sp.gov.br/ipvanet/imagemDinamica.dContent

 

coloque assim:

http://201.55.62.43/ipvanet/imagemDinamica.dContent

 

 

obs: qual a finalidade em querer carregar o captcha terceiro usando o curl ? o intuito é exibir o captcha na sua página pessoal ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O site que eu preciso pegar o captcha vai estar em manutenção hoje ¬¬

 

O objetivo é fazer as consultas na minha página, sem precisar acessar os sites dos Detrans, quero colocar as consultas de débitos todas em um único local, sem é claro fugir as regras deles, cada estado tem a sua regra para consulta e isso é respeitado.

 

--------------- Ponto de Mesclagem --------------

 

Já tentei até utilizar proxy no cURL e acontece a mesma coisa, no servidor local funciona, no remoto não, inclusive agora estou tendo o mesmo problema com mais uma URL, e já tentei substituir o o endereço pelo IP, e acontece o mesmo, local funciona, remoto não. Não sei mais o que fazer. Se alguém já teve algum problema parecido e puder me dar uma mão, serei muito grato.

 

Obrigado.

 

--------------- Ponto de Mesclagem --------------

 

Ainda não encontrei a solução, mas descobri como fazer dar o mesmo erro na maquina local

 

curl_setopt($ch, CURLOPT_INTERFACE, 'localhost');

 

Quando coloco esta opção tenho o mesmo problema no servidor local, creio que o CURLOPT_INTERFACE vai resolver meu problema xD

alguem pode me ajudar com isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, aqui menciona alguma coisa a respeito.

 

É dito que você não deveria mexer com essa opção, pois poderia fazer o conteúdo não chegar até você, indo para outra pessoa.

 

Porém, de repente, se você setar o IP do seu servidor você consiga passar por alguma verificação HTTp que o servidor alvo esteja fazendo e ainda direcionar a resposta para você mesmo, quando online.

 

É uma POSSIBILIDADE, não garanto que funcione, já que na verdade nunca usei essa opção...

 

Mas mesmo se funcionar, eu sugeriria que você tentasse outras possíveis abordagens, já que isso cheira à uma bela gambiarra.

 

Experimenta utilizar file_get_contents() utilizando-se de uma Stream Context detalhada.

 

Se passar, seu servidor pode ter alguma má configuração padrão na cURL. Se não funcionar, resta a você comparar via phpinfo() direitinho sua máquina local e seu servidor. E tentar descobrir o que há de diferente que possa estar conflitando.

 

A propósito, evite Posts UP. É contra as regras e pode fazer seu tópico não ser mais "levado a sério", digamos assim. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno primeiro me desculpe pelos "UP" eu realmente só queria atualizar sobre o "progresso" que tive.

 

Tentei fazer isso:

$data = file_get_contents($url);

 

e realmente o servidor não está alcançando o destino, poderia o servidor que estou tentando pegar a imagem ter bloqueado requisições de um site?

 

com o codigo acima o erro foi: failed to open stream: Connection timed out

 

E a coisa ta cada vez mais complicada :(

 

Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas você leu meu post todo? A função sozinha não vai ser de muita ajuda pois ao que parece esse site está considerando diversas possibilidades para evitar o hotlink.

 

Você vai precisar das Stream Contexts. Veja o exemplo do timeout:

 

$opts = array(

   'http' => array(
       'timeout' => 60
   )
);

$content = file_get_contents( $url, FALSE, stream_context_create( $opts ) );

Tenta esse, se precisar de mais alguma coisa, adicione outra opção. E mais outra, e mais outra até ficar uniforme local e remotamente.

 

As opções de contexto você encontra aqui, muito embora você acabe usando muito mais as de HTTP do que as outras.

 

É uma forma bem menos poderosa que a cURL, mas justamente por sua simplicidade, pode resolver seu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.