Logo Hardware.com.br
rwar
rwar Tô em todas Registrado
2.4K Mensagens 13 Curtidas

verificador de links em php

#1 Por rwar 23/11/2005 - 11:07
Peguei um script para verificar possíveis links que estão inacessíveis por algum motivo (página não existe, proibido acesso, etc).

Como é um serviço público, estes links devem ser verificados constantemente, e para isto estão gravados em uma base de dados.

O script é este:
function testaURL( $url ){
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
@curl_exec($ch);

$codigo_retorno = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

return($codigo_retorno);
}
?>
<html>
<body>
<?
/*************************************************************
REFERÊNCIAS:
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
* http://www.php.net/manual/pt_BR/function.curl-getinfo.php
*************************************************************/

$sql = "SELECT id_servico, nome_servico, link_servico, link_mais_info, sigla_orgao " .
"FROM csi_servico s, csi_orgao o " .
"WHERE (link_servico != '' OR link_mais_info != '') " .
"AND s.id_orgao=o.id_orgao " .
"AND id_servico_pai IS NULL " .
"ORDER BY nome_servico";
$rs = new query( $conn, $sql );
?>
<h2>Relatório de links e informações</h2>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<?
while( $rs->getrow() ) {
$codigo_link_servico = testaURL( $rs->field("link_servico&quot );
$codigo_link_mais_info = testaURL( $rs->field("link_mais_info&quot );

if( $codigo_link_servico >= 300 OR $codigo_link_mais_info >= 300 ) { // apenas 300 pois se retornar 200 significa que o link está ok
?>
<tr>
<td><span style="font-weight:'bold'">Nome do serviço:</span> <?=$rs->field("nome_servico&quot;?></td>
</tr>
<tr>
<td><span style="font-weight:'bold'">Órgão:</span> <?=$rs->field("sigla_orgao&quot;?></td>
</tr>
<tr>
<td><span style="font-weight:'bold'">Link para o serviço:</span> <?=$rs->field("link_servico&quot;?></td>
</tr>
<tr>
<td><span style="font-weight:'bold'">Status de retorno:</span> <?=testaURL( $rs->field( "link_servico" ));?></td>
</tr>
<tr>
<td><span style="font-weight:'bold'">Link para mais informações: </span><?=$rs->field("link_mais_info&quot;?></td>
</tr>
<tr>
<td><span style="font-weight:'bold'">Status de retorno: </span><?=testaURL( $rs->field( "link_servico" ));?></td>
</tr>
<tr><td>&nbsp;</td></td>
<?
}
} // while
?>
</table>
</body>
</html>


Quais os problemas?
- Alguns links estão devolvendo o status 200 (a página existe), ou seja, não passou no if( $codigo_link_servico >= 300 ...)

- Alguns links retornam status 400 (página não existe), sendo que basta colar a URL no navegador e a página abre

- Algumas páginas são redirecionadas, porém retornam status 404 (página não existe). Um exemplo é esta:
http://www.educacao.rs.gov.br

que é redirecionada para esta:
http://www.educacao.rs.gov.br/pse/html/educa.jsp


Bom, se fosse listar todos problemas, ficaria muito extenso. Na verdade queria saber por que retornam estes valores "errados", ou se não estão errados por que o servidor faz retornar o valor x mesmo que seja outro?

Moderadores, fiquem a vontade de enviar para sala de redes, caso seja necessários. Postei aqui pois tem o código PHP.


Editado: esqueci de menciona que, para testar, basta colocar uma url na função (já que vocês não tem minha tabela :-)), desta maneira:
testaURL( "http://www.google.com" );
testaURL( "http://lyon.procergs.com.br/" );
testaURL( "http://www.1wxyz.com.br/" );
testaURL( "https://direto1.procergs.rs.gov.br/direto/jsp/login.jsp" );
testaURL( "https://adwords.google.com/select/" );
testaURL( "https://give.redcross.org/" );
murtog
murtog Novo Membro Registrado
65 Mensagens 0 Curtidas
#2 Por murtog
23/11/2005 - 14:38
Antes devo dizer que faz tempo que não mexo com PHP.
Ok, uma solução pragmática e a priori preguiçosa seria você usar a função fopen para checar os links.

Aqui: http://br.php.net/manual/pt_BR/function.fopen.php
Você vai encontrar uma classe de requisição que suporta rediricionamento, o problema é que você só teria dois resultados: se está up ou se não está up.

Um exemplo tosco e não testado que me veio a mente foi esse, caso não queira usar a classe do site:

<?
function testarUrl(link){
if(fopen(link)){
return "Online";
} else {
return "Offline";
}
?>


Para o tipo de serviço que tu quer acho que isso dá pro gasto. Acredito que o código de erro é prescindível.

:wink:
\(^_^)/
Murtog
rwar
rwar Tô em todas Registrado
2.4K Mensagens 13 Curtidas
#3 Por rwar
24/11/2005 - 10:52
Valeu murtog, mas não são arquivos, e sim URLs que preciso "acessar"... :wink: Fora o que, aqui na empresa, é proibido acesso com fopen para fora da empresa. Segurança máxima dos carinhas aqui... :mrgreen:

Consegui fazer umas modificações no script, porém algumas URLs retornam a palavra "malformed". O que significa isso, já que "inventei" algumas URLs para testar, e estas retornam erro 404 (não existem)? Seria o cabeçalho ou algum dado interno a algum protocolo de retorno? Se alguém precisar do script, é só pedir.
No caminho dos scripts. Por enquanto, powershell...
Kleber Costa
Kleber Costa General de Pijama Registrado
5.2K Mensagens 1 Curtida
#6 Por Kleber Costa
25/11/2005 - 12:14
Aews roni!
O tio phpclasses.org quase sempre tem a solução :mrgreen:

Pode descomentar aquelas linhas se precisar!


require_once('http.php');

set_time_limit(0);
$http = &new http_class;
$http->timeout=0;
$http->data_timeout=0;
$http->user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$http->follow_redirect=1;
$http->redirection_limit=5;
$http->follow_redirect=1;
$http->redirection_limit=5;
//$http->debug=1;
//$http->html_debug=1;
$url='http://www.google.com';
$http->GetRequestArguments($url,$arguments);
$http->Open($arguments);
$http->SendRequest($arguments);
$opa = $http->ReadReplyHeaders($http->request_headers);
if (!empty($opa)) {
echo "Deu caca - " . $opa;
} else {
echo 'Status - ' . $http->response_status . '<br>';
}

$http->Close();
Salve! Ó terra dos altos coqueiros!
De belezas soberbo estendal!
Nova Roma dos bravos guerreiros
Pernambuco, imortal, imortal!


Linux User #262254
rwar
rwar Tô em todas Registrado
2.4K Mensagens 13 Curtidas
#8 Por rwar
25/11/2005 - 15:47
Fala Kleber!!! big_green.png

Ótima esta classe!!! Realmente impressiona o nível de detalhamento que ela faz da requisição. Este serviço que estou fazendo é simplesmente para verificar se o link existe mesmo ou não (a analista não quer muitos dados na frente dela, entende? :roll: ). Para isso estou utilizando a bibliteca CURL apenas para resgatar o status, como está no script, e que a classe que tu mencionou (http_client.php) também faz uso.

Valeu mais uma vez, meu irmão!!!

Editado: hmmm... agora que fiz uns testes e vi que é totalmente configurável para retirar as informações que tu bem entender... :mrgreen:
No caminho dos scripts. Por enquanto, powershell...
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal