'Google Sitemap Ping Success [closed]

I have a php script that creates an xml sitemap. At the end, I use

shell_exec('ping -c1 www.google.com/webmasters/tools/ping?sitemap=sitemapurl');

to submit the updated sitemap to Google Webmaster tools.

Having read the Google documentation, I'm unsure whether I need to do this each time or not. Entering the link in the code manually, results in a success page from google, but using the ping command I receive no confirmation. I would also like to know if there is any way of checking if the command has actually worked.



Solution 1:[1]

Here is a script to automatically submit your site map to google, bing/msn and ask:

/*
* Sitemap Submitter
* Use this script to submit your site maps automatically to Google, Bing.MSN and Ask
* Trigger this script on a schedule of your choosing or after your site map gets updated.
*/

//Set this to be your site map URL
$sitemapUrl = "http://www.example.com/sitemap.xml";

// cUrl handler to ping the Sitemap submission URLs for Search Engines…
function myCurl($url){
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_exec($ch);
  $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  return $httpCode;
}

//Google
$url = "http://www.google.com/webmasters/sitemaps/ping?sitemap=".$sitemapUrl;
$returnCode = myCurl($url);
echo "<p>Google Sitemaps has been pinged (return code: $returnCode).</p>";

//Bing / MSN
$url = " https://www.bing.com/webmaster/ping.aspx?siteMap=".$sitemapUrl;
$returnCode = myCurl($url);
echo "<p>Bing / MSN Sitemaps has been pinged (return code: $returnCode).</p>";

//ASK
$url = "http://submissions.ask.com/ping?sitemap=".$sitemapUrl;
$returnCode = myCurl($url);
echo "<p>ASK.com Sitemaps has been pinged (return code: $returnCode).</p>";

you can also send yourself an email if the submission fails:

function return_code_check($pingedURL, $returnedCode) {

    $to = "[email protected]";
    $subject = "Sitemap ping fail: ".$pingedURL;
    $message = "Error code ".$returnedCode.". Go check it out!";
    $headers = "From: [email protected]";

    if($returnedCode != "200") {
        mail($to, $subject, $message, $headers);
    }
}

Hope that helps

Solution 2:[2]

Since commands like shell_exec(), exec(), passthru() etc. are blocked by many hosters, you should use curl and check for a response code of 200.

You could also use fsockopen if curl is not available. I'm going to check for the code snippet and update the answer when I found it.

UPDATE:

Found it. I knew I used it somewhere. The funny coincedence: It was in my Sitemap class xD You can find it here on github: https://github.com/func0der/Sitemap. It is in the Sitemap\SitemapOrg class. There is a also an example for the curl call implemented.

Either way, here is the code for stand alone implementation.

/**
 * Call url with fsockopen and return the response status.
 *
 * @param string $url
 *  The url to call.
 *
 * @return mixed(boolean|int)
 *  The http status code of the response. FALSE if something went wrong.
*/
function _callWithFSockOpen($url) {
    $result = FALSE;

    // Parse url.
    $url = parse_url($url);
    // Append query to path.
    $url['path'] .= '?'.$url['query'];

    // Setup fsockopen.
    $port = 80;
    $timeout = 10;
    $fso = fsockopen($url['host'], $port, $errno, $errstr, $timeout);

    // Proceed if connection was successfully opened.
    if ($fso) {
        // Create headers.
        $headers = 'GET ' . $url['path'] . 'HTTP/1.0' . "\r\n";
        $headers .= 'Host: ' . $url['host'] . "\r\n";
        $headers .= 'Connection: closed' . "\r\n";
        $headers .= "\r\n";

        // Write headers to socket.
        fwrite($fso, $headers);

        // Set timeout for stream read/write.
        stream_set_timeout($fso, $timeout);

        // Use a loop in case something unexpected happens.
        // I do not know what, but that why it is unexpected.           
        while (!feof($fso)){
            // 128 bytes is getting the header with the http response code in it.               
            $buffer = fread($fso, 128);

            // Filter only the http status line (first line) and break loop on success.
            if(!empty($buffer) && ($buffer = substr($buffer, 0, strpos($buffer, "\r\n")))){
                break;
            }
        }

        // Match status.
        preg_match('/^HTTP.+\s(\d{3})/', $buffer, $match);
        // Extract status.
        list(, $status) = $match;

        $result = $status;
    }
    else {
        // @XXX: Throw exception here??
    }

    return (int) $result;
}

If you guys find any harm or improvement in this code, do not hesitate to open up a ticket/pull request on GitHub, please. ;)

Solution 3:[3]

Simplest solution: file_get_contents("https://www.google.com/webmasters/tools/ping?sitemap={$sitemap}");

That will work on every major hosting provider. If you want optional error reporting, here's a start:

$data = file_get_contents("https://www.google.com/webmasters/tools/ping?sitemap={$sitemap}");
$status = ( strpos($data,"Sitemap Notification Received") !== false ) ? "OK" : "ERROR";
echo "Submitting Google Sitemap: {$status}\n";

As for how often you should do it, as long as your site can handle the extra traffic from Google's bots without slowing down, you should do this every time a change has been made.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 jaggedsoft