@codenerd på twitter Mit seneste tweet:

PHP Blog Ping Version 1.0 – Nu med fsocket løsning

For godt et år siden skrev jeg en simpelt funktion til fx at pinge overskrift.dk (Blog Ping v0.5) – Denne funktion brugte cURL til at udsende pings med. Dengang lovede jeg faktisk en god gammeldags fsocket løsning, til dem som ikke havde curl på deres server – dette blev dog aldrig rigtigt til noget. Nu er den her så, PHP Blog Ping Version 1.0 – som bruger cURL hvis curl er installeret og ellers bruger fsock:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
//indstillinger
$blogUrl='http://din blog url'; //din blog url
$blogName='Din blog titel'; //blog titel
/**
* Et script til at pinge blog indexes - enten via curl eller fsock
* @Application: Martin Blog Ping v1.0
* @Author: Martin Nielsen mail[at]martin-nielsen[dot]com
* @URL: http://martin-nielsen.com
* Usage: blogPing('http://dinblogurl.com','Blog navn');
* @param string url til din blog
* @param string din blogs navn/titel
* @param string url der skal pinges
* @return string ok eller fejlbesked
*/
function blogPing($blogUrl,$blogName,$pingUrl) {
    $timeout = 20; //hvor lang tid vil vi vente på svar
    $urlDele = parse_url($pingUrl); //parse vores pingurl
    if (!isset($urlDele['host'])) { //hvis ikke en url - returner fejl
        return '<span style="color:red"><strong>FEJL:</strong> '.$pingUrl.' er ikke en url</span><br />';
    }
    //forbered url til fsocket løsning i tilfælde af cURL ikke er hjemme
    $host = $urlDele['host']; //host
    $port = (isset($urlDele['port']) ? $urlDele['port'] : 80); //port?
    $sti = (isset($urlDele['path']) ? $urlDele['path'] : '/'); //sti
    $sti.= (isset($urlDele['query']) ? '?' . $urlDele['query'] : ''); //querystring
    //xml kald
    $xmlRequest ='<?xml version="1.0"?>'."\n";
$xmlRequest.='<methodCall>'."n";
    $xmlRequest.='<methodName>weblogUpdates.ping</methodName>'."n";
$xmlRequest.='<params>'."n";
$xmlRequest.='<param><value><string>'.htmlspecialchars($blogName).'</string></value></param>'."n";
    $xmlRequest.='<param><value><string>' . htmlspecialchars($blogUrl) . '</string></value></param>'."n";
$xmlRequest.='</params>'."n";
    $xmlRequest.='</methodCall>';    
    //hvis curl er installeret
    if (function_exists('curl_init')) {
        //curl kald
        $cPing = curl_init(); //start curl
        //curl options
        curl_setopt($cPing,CURLOPT_URL,$pingUrl);
        curl_setopt($cPing,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($cPing,CURLOPT_HTTPHEADER,array('Content-Type: text/xml'));
        curl_setopt($cPing, CURLOPT_POST,1);
        curl_setopt($cPing,CURLOPT_POSTFIELDS,$xmlRequest);
        curl_setopt($cPing, CURLOPT_TIMEOUT, $timeout);
        $responseContent = curl_exec($cPing); //udfør kald
        $responseCode = curl_getinfo($cPing); //hent header info
        $responseCode = $responseCode['http_code'];
        curl_close($cPing); //luk curl
    } else {
        //old school fsock
   if (!$fp = @fsockopen($host, $port, $errno, $errstr, $timeout)) { //hvis vi ikke kan skabe forbindelse til url
            return '<span style="color:red"><strong>FEJL:</strong> '.$pingUrl.' kunne ikke kontaktes</span><br />';
        } else {
            $responseCode='';    
        }
   socket_set_timeout($fp, $timeout); //sæt timeout
        //opbyg vores kald
   $request = "POST $sti HTTP/1.0rn" .
   "Host: $hostrn" .
   "Content-Type: text/xmlrn" .
   "Content-Length: " . strlen($xmlRequest) . "rn" .
   "rn" .
   $xmlRequest;
   //send data
        fputs($fp, $request);
        //hent svar ud
   $responseContent = '';
   while (!feof($fp)) {
   $responseContent .= fgets($fp, 1024);
        }
   fclose($fp);
    }
    //håndter svar
    preg_match('#<name>message</name>s*<value>(s*<string>)?([^</]*)(</string>s*)?</value>#i', $responseContent, $msg);
    preg_match('#<name>flerror</name>s*<value>(s*<boolean>)?([^</]*)(</boolean>s*)?</value>#i', $responseContent, $msg2);
    if ($responseCode != 200 && !stristr($responseContent,'200 OK')) {
        return '<span style="color:red"><strong>FEJL:</strong> kunne ikke kontaktes</span><br />';
    } else if(isset($msg2[2]) && $msg2[2]==1) {
        return '<span style="color:red"><strong>Der opstod en fejl:</strong> '.$msg[2].'</span><br />';
    } else {
        return ' - PING OK<br/>';
    }
}
// Array med ping urls
$pingUrls = array(
'http://blogbot.dk/io/xml-rpc.php',
'http://rpc.weblogs.com/RPC2',
    'http://overskrift.dk/ping/',
    'http://rpc.twingly.com/',
    'http://blogsearch.google.com/ping/RPC2',
    'http://rpc.technorati.com/rpc/ping',
    'http://ping.feedburner.com',
    'http://api.moreover.com/ping',
    'http://api.my.yahoo.com/RPC2',
    'http://api.my.yahoo.com/rss/ping',
    'http://bblog.com/ping.php',
    'http://blog.goo.ne.jp/XMLRPC',
    'http://ping.bitacoras.com',
    'http://ping.bloggers.jp/rpc/',
    'http://ping.myblog.jp',
    'http://ping.syndic8.com/xmlrpc.php',
    'http://ping.weblogalot.com/rpc.php',
    'http://pingoat.com/goat/RPC2',
    'http://rpc.icerocket.com:10080/',
    'http://rpc.pingomatic.com/',
    'http://topicexchange.com/RPC2',
    'http://www.bitacoles.net/ping.php',
    'http://www.blogdigger.com/RPC2',
    'http://www.blogpeople.net/servlet/weblogUpdates',
    'http://www.blogsnow.com/ping',
    'http://www.overskrift.dk/ping/',
    'http://www.popdex.com/addsite.php',
    'http://wasalive.com/ping/',
    'http://xping.pubsub.com/ping/'
);
//gennemløb vores pingurls og ping dem
foreach ($pingUrls as $pingUrl) {
    echo 'Pinger: '.$pingUrl;
    flush();
    echo blogPing($blogUrl,$blogName,$pingUrl);
}
?>

Håber funktionen kan bruges – filen kan også hentes her: PHP Blog Ping v1.0

15 kommentarer

  1. Hej Martin!

    Som blogger med hosting på blogspot.com læste jeg med ret stor interesse dette post. Blogspot pinger ikke automatisk ligesom WordPress f.eks. gør, så jeg har ledt efter en mulighed for at sætte ping-funktionen op manuelt. Men hvor gør jeg af den php-kode, du har skrevet, så det virker?

    Mvh
    Randi

    Svar på kommentaren
  2. Hej Martin!

    Som blogger med hosting på blogspot.com læste jeg med ret stor interesse dette post. Blogspot pinger ikke automatisk ligesom WordPress f.eks. gør, så jeg har ledt efter en mulighed for at sætte ping-funktionen op manuelt. Men hvor gør jeg af den php-kode, du har skrevet, så det virker?

    Mvh
    Randi

    Svar på kommentaren
  3. Hej Randi – For at du kan bruge ovenstående script, er det nødvendigt med en server hvorpå du kan afvikle PHP. Du kan fx oprette et gratis webhotel på http://dinhost.net/

    Her kan du så uploade ovenstående kode i fx blogping.php og så ændre indstillingerne så de passer med din blogspot blog -og så er det bare at gå ind på blogping.php hver gang du har postet på blogspot.

    Svar på kommentaren
  4. Skrevet af Nora  d. 15/08/2010 kl 12:06

    Hej Martin

    Tak for all informasjon og script. Har selv pinget via forskjellige bloggsystemer, men er usikker på hva man pinger når det gjøres manuelt. Pinger man hovedsiden, hovedsidens rss feed eller seneste innlegg?

    $blogUrl=’ ? ‘; //din blog url
    $blogName=’ ? ‘; //blog titel

    Svar på kommentaren
  5. Skrevet af Nora  d. 19/08/2010 kl 12:45

    Får en lille fejl i scriptet:

    PHP Notice: Undefined offset: 2 in /www/public_html/ping.php on line 82

    De fleste ping gir også “FEJL: kunne ikke kontaktes”, kun de “store” (Google, Yahoo, etc) virkede uden problemer.

    I php er:

    allow_url_fopen = On
    allow_url_include = On

    Skal der åbnes mer i php?

    Svar på kommentaren
  6. Pingback: PHP Blog Ping v0.5 - nemmere end nemt | Martin Nielsens nørdede tanker

Skriv en kommentar

Krævede felter er markeret med *.

*