Informática Numaboa - Tutoriais e Programação
Weblinks com checagem
- Detalhes
-
Categoria: Joomla
-
Atualização: Segunda, 02 Julho 2012 19:43
-
Autor: vovó Vicki
-
Acessos: 8157
Pagina 2 de 3
Bem, se a função foi chamada, então precisamos colocá-la em algum lugar. Coloquei-a no final do arquivo. Observe que a função leva como parâmetro o objeto $item. Isto é necessário para que possamos acessar alguns atributos deste objeto como, por exemplo, a URL.
renova ) {
if( $item->status == 0 ) {
echo '';
} else {
echo '';
}
return;
}
$url = $item->url;
if( ( !eregi( "http", $url ) ) && ( !eregi( "https", $url ) ) ){
$url = 'http://' . $url;
}
$urlArray = parse_url( $url );
$timeout = 7;
$return['code'] = '';
$return['status'] = '';
if( $urlArray['scheme'] == 'http' ) {
$urlArray['port'] = 80;
$sock = @fsockopen( $urlArray['host'], $urlArray['port'], $errnum, $errstr, $timeout );
} else if( $urlArray['scheme'] == 'https' ) {
$urlArray['port'] = 443;
$sock = @fsockopen( $urlArray['host'], $urlArray['port'], $errnum, $errstr, $timeout );
} else {
echo '';
}
if( !isset( $sock ) || $sock === false || $sock == "" ) {
echo '';
}
// HTTP use HEAD Method
getHTTP($sock, $urlArray, 'HEAD', $return, $timeout);
@fclose( $sock );
if ($return['code'] == '405') {
// HTTP "HEAD" não aceito ou em Error => usar método "TRACE"
$sock = @fsockopen($urlArray['host'], $urlArray['port'],
$errnum, $errstr, $timeout ); // Definir espera em segundos para proteger o socket
getHTTP($sock, $urlArray, 'TRACE', $return, $timeout);
@fclose( $sock );
}
if (!$return['code'] || $return['code'] >= '400' ) {
// HTTP nada retornou com "HEAD" ou "TRACE"
// ou método não permitido => usar método "GET"
$sock = @fsockopen($urlArray['host'], $urlArray['port'], $errnum,
$errstr, $timeout); // Espera em segundos para proteger o socket
getHTTP($sock, $urlArray, 'GET', $return, $timeout);
@fclose( $sock );
}
if (!$return['code']) {
$return['code'] = '404';
$return['status'] = "Página não encontrada Erro 404 (No code returned)";
}
$model =& JModel::getInstance('category', 'weblinksmodel');
if( $return['code'] != '200' ) {
echo '';
$model->setCheck( $item->id, 0 );
} else {
echo '';
$model->setCheck( $item->id, 1 );
}
}
Esta função chama uma outra, a function getHTTP. Coloquei-a logo a seguir no final do mesmo arquivo:
function getHTTP(&$sock, &$urlArray, $HTTPmethod, &$return, $timeout=7) {
$return['code'] = '';
$return['status'] = '';
$urlquery = (isset($urlArray['query'])) ? "?".$urlArray['query'] : "";
$useragent = "Mozilla/5.0 (compatible; weblinks 1.5.7; Link Checker)";
$dump = $HTTPmethod . " " . $urlArray['path'] . $urlquery. " HTTP/1.1\r\n";
$dump .= "User-Agent: " . $useragent . "\r\n";
$dump .= "Host: " . $urlArray['host'] . "\r\n";
$dump .= "Connection: close\r\n\r\n";
if( !@fputs( $sock, $dump ) ) {
$result['code'] = '404';
return;
}
stream_set_timeout( $sock, $timeout );
$status = socket_get_status( $sock );
$str = '-vazio-';
$closed = false;
while( ( !feof($sock) ) && ( !$status['timed_out'] ) && ( $str != "" ) && ( !$closed ) ) {
$str = @fgets( $sock, 1024 );
$status = socket_get_status( $sock );
if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3})", $str) ) {
$return['code'] =
trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", "\\1", $str));
if ( substr(strtoupper($return['code']),0,4) == 'HTTP') {
// Código começa com "HTTP" => há apenas código HTTP sem descrição.
$return['code'] =
trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3})[a-z ]*", "\\1", $str));
}
// Manter apenas os primeiros 3 dígitos...
$return['code'] = substr($return['code'],0,3);
$return['status'] = $str;
}
if (eregi("^Content-Type: ", $str)) {
$return['contentType'] = trim(eregi_replace("^Content-Type: ", "", $str));
}
if (eregi("^User-Agent: ", $str)) {
$return['userAgent'] = trim(eregi_replace("^User-Agent: ", "", $str));
}
if (eregi("^Location: ", $str)) {
$return['location'] = trim(eregi_replace("^Location: ", "", $str));
}
if (eregi("^Content-Length: ", $str)) {
$return['contentLength'] = trim(eregi_replace("^Content-Length: ", "", $str));
}
$closed = ( $HTTPmethod == "GET" && ( $str == "\r\n" &&
($return['code']=="200" || $return['code']=="404")) );
}
}
?>