Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Vou tentar ser o mais claro possível.
Possuo uma função em php utilizando cURL que busca imagens de 3 captchas diferentes.
No meu servidor local para testes (xampp) consigo receber as 3 imagens sem problemas, tudo funciona.
No servidor remoto, eu recebo duas das imagens, a terceira não tem como, já tentei de tudo.
Esta é a função:
function recebe_imagem($url, $arquivo, $cookiej="") {
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiej);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$data=curl_exec($ch);
curl_close ($ch);
$fp = fopen($arquivo,'w');
fwrite($fp, $data);
fclose($fp);
return $arquivo;
}
Se alguém puder me ajudar ficarei muito agradecido.
Obrigado!
Ajudaria, também colocar um:
or die( curl_error() );
Na frente do curl_exec().
>
Ajudaria, também colocar um:
or die( curl_error() );
Na frente do curl_exec().
Obrigado pelas ajudas, mas o problema perciste... lembrando que o código não da um erro, ele funciona para 2 dos 3 links, apenas no terceiro ele não retorna a imagem que teria que retornar, e o mesmo código na maquina local funciona que é uma beleza.
Com o código
or die( curl_error() );
na frente do curl_exec() da esse erro: Warning: Wrong parameter count for curl_error() in /home/infoauto/public_html/sp/curlf.php on line 9
Obrigado a todos e continuo buscando uma solução.
Falha minha.
curl_error() exige um parâmetro, que é a variável que você usou no curl_init().
>
Falha minha.
curl_error() exige um parâmetro, que é a variável que você usou no curl_init().
$data=curl_exec($ch) or die(curl_error($ch));
Agora sim, estranhamente este é o problema: couldn't connect to host
Alguém saberia o motivo disto?
Boooom, o que será que pode ser...? :assobiando:
O endereço que você passou existe? Isto é, existe online? Você consegue copiar o URL e acessar manualmente pelo navegador?
Se não, está respondido.
Se sim, então vá eliminando, um a um, os curl_setopt()'s que você definiu, comentando-os a cada teste.
Quando funcionar, vai saber quem é a opção culpada. Se ainda não, veremos.
>
Boooom, o que será que pode ser...? :assobiando:
O endereço que você passou existe? Isto é, existe online? Você consegue copiar o URL e acessar manualmente pelo navegador?
Se não, está respondido.
Se sim, então vá eliminando, um a um, os curl_setopt()'s que você definiu, comentando-os a cada teste.
Quando funcionar, vai saber quem é a opção culpada. Se ainda não, veremos.
O endereço é este: http://www3.fazenda.sp.gov.br/ipvanet/imagemDinamica.dContent
Ele existe sim, inclusive quando rodo no servidor local (xampp) ele funciona direitinho, só não funciona no servidor remoto.
Já tentei tirar os curl_setopt()'s sem sucesso, inclusive já inverti os valores (true to false <=> false to true).
É um mistério algo funcionar tão bem em um servidor e não funcionar nem a pau em outro :(
o erro persiste..
você deve configurar adequadamente os logs do php para ver alguma possível mensagem de erro
o que pode acontecer é o dns (primário/secundario) do server não conseguirem resolver o host por algum motivo..
no entanto, o problema pode ser qualquer outra coisa.. por isso, configure e observe os logs..
obs: logs do php é diferente do log do webserver (apache, iis, nginx, etc..)
>
o erro persiste..
você deve configurar adequadamente os logs do php para ver alguma possível mensagem de erro
o que pode acontecer é o dns (primário/secundario) do server não conseguirem resolver o host por algum motivo..
no entanto, o problema pode ser qualquer outra coisa.. por isso, configure e observe os logs..
obs: logs do php é diferente do log do webserver (apache, iis, nginx, etc..)
hinom, criei um log desta forma:
function error($numero,$texto){
$ddf = fopen('error.log','a');
fwrite($ddf,"[".date("r")."] Erro $numero:$texto\r\n");
fclose($ddf);
}
set_error_handler('error');
Porém não obtive erro algum.
leia o tópico inteiro, especialmente o post #10 onde contem dicas de como configurar no .htaccess
outra dica, no curl, adicione um "try catch" também
hinom obrigado pela atenção.
Quando eu configuro o .htaccess do modo que você demonstra, eu não consigo acessar o php, dá um erro 500 (Internal Server Error).
(Configuerei o caminho do error.log certinho)
mostre como está o seu .htaccess
quanto ao "500 (Internal Server Error)." provém do apache.. verifique no log do apache o que foi gravado
depois disso, quando executar o curl, utilize exceptions do php "try catch"..
no manual tem diversos exemplos dos usuários
obs: o ponto em questão é configurar o ambiente para gravar os erros, para eu você possa identifcar e corrigir os problemas.
é importante configurar os logs de erros pois servirá também para outras situações.
hinom, não utilizei aina o "try catch" pq nem mechi no php ainda, estou brigando para gerar os erros.
Qunato ao .htaccess está identico ao que você citou no outro post, exceto pelo caminho do error.log.
O log do apache, resumindo me diz isso:
[Wed Oct 19 12:22:10 2011] [error] [client 187.6.167.59] File does not exist: /home/infoauto/public_html/500.shtml
[Wed Oct 19 12:22:10 2011] [alert] [client 187.6.167.59] /home/infoauto/public_html/sp/.htaccess: Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration
Obrigado pela ajuda.
possivelmente o seu host não permite ou possui algum configuração específica, certifique-se com o seu provedor de hospedagem.
mas, tente trocar php_value para php_admin_flag ou php_admin_value ou php_flag
ou ainda, verifique com o provedor como ou se é possível ver os logs do php da sua conta.
Verifiquei com o servidor, eles me responderam o seguinte:
"Nosso servidor não aceita modificações de parâmetros do PHP via .htaccess. Você deve fazer isso através de um arquivo php.ini.
Basta criar o arquivo, inserir as modificações e enviá-lo para a mesma pasta onde estão os arquivos PHP que precisam destes novos ajustes."
As 'modificações' são as mesmas do .htaccess?
Obrigado.
O QUÊ? Que raio de servidor é esse que vai ler tudo quanto é PHP.INI de tudo quanto é usuário?
Imagina, eu preciso da X e você não. Mas você precisa da Y e eu não. Você envia seu PHP.INI habilitando uma e eu habilitando outra e nenhum dos dois consegue o quer.
Por acaso o seu servidor não é dedicado não? Porque se for compartilhado é no mínimo estranho essa resposta.
O servidor é esse http://www.bounceweb.com.br/
E eu continuo sem entender que diaxo de problema é esse, que funciona local e não funciona remoto ;/
ue funciona local e não funciona remoto
bom.. nada de mais.. isso se deve ao fato de que no ambiente local (ambiente de desenvolvimento) possui uma configuração diferente do ambiente de produção (remoto, servidor online...)
por isso, todo software antes de começar a ser desenvolvido deve ter planejamento onde inclui os requisitos do mesmo..
quanto a restrição do host de hospedagem, não tem nada de mais também.
a resposta deles também nã vi nada de mais.. cada empresa tem suas políticas para uso de seus serviços. você concorda com a aceitação das políticas de uso dos serviços no momento em que concordou com o contrato e fez o pagamento.
basta seguir as instruções que enviaram. ao invés de tentar configurar o php em tempo de execução via .htaccess, faça em arquivos .ini
na mesma pasta onde está executando o script crie um arquivo php.ini com os mesmos parâmetros contidos no .htaccess, vide post #11
criei o php.ini mas ainda não obtive o log de erros, gerei um erro eleatório dentro do script para ver se funcionava, mas não fucionou
verifique se a pasta onde está salvando o arquivo de log está com permissão de escrita "chmod 0777"
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
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;
}
?>hinom muito obrigado pelo código
Fiz as alterações necessárias para ele funcionar (para testes apenas é claro).
Como esperado, localmente funcionou tudo certinho e obtive a imagem que eu queria, ao hospedalo no servidor agora sim temos um log de erro que se preze:
/home/infoauto/public_html/sp/curl_sp.php:105 error n: 7 error mesg: couldn't connect to host Array ( => ://www3.fazenda.sp.gov.br/ipvanet/imagemDinamica.dContent? [content_type] => [http_code] => 0 [header_size] => 0 [request_size] => 0 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 5.000021 [namelookup_time] => 0.008186 [connect_time] => 0 [pretransfer_time] => 0 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => -1 [upload_content_length] => -1 [starttransfer_time] => 0 [redirect_time] => 0 )
Sera que agora com este erro temos o real motivo? Pois confesso que com exceção do 'couldn't connect to host' não entendi todo o resto.
Obrigado!
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 ?
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 ?
configure e verifique o log de erros do php para identificar a causa
para adiantar, olhando o script, há um parâmetro que possui restrições
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
se o ambiente estiver com php em safe mode, esse recurso estará desativado.
obs: lembrando que é apenas dica. não a solução definitiva para o caso específico