俺、サービス売って家買うんだ

Swift, Kotlin, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

PHP + MySQLでsitemap.xmlを作る簡単なスクリプト

f:id:ie-kau:20161029212417p:plain:w400


SEO対策でGoogle Search Consoleにsitemap.xmlを送ることが 、3年に一度ぐらいあるのですがその度に書捨てのスクリプトを書いてそのままどっかに行ってしまうので、いつか将来の自分のためにメモを残しておきます。

環境

PHP 5.3
MySQL 5.5

PHPのスクリプト

走り書きです!!!!

<?php
$con = mysql_connect('[ホスト名]', '[ユーザー名]', '[パスワード]');
if (!$con) {
    die('DB接続失敗'.mysql_error());
}

$db_selected = mysql_select_db('[DB名]', $con);
if (!$db_selected){
    die('DB選択失敗'.mysql_error());
}

// utf8で利用
mysql_query("SET NAMES 'utf8'");

// 最大50000送信可能
$offset = 0;
$limit = 50000;
// ★SQLは適宜変えて
$result = mysql_query("SELECT id FROM article LIMIT {$offset}, {$limit};");

// lastmod用の日付
$date = date("Y-m-d");

// サイトマップ用のファイル
$file = "./sitemap.xml";
if(!file_exists($file)){
  // ファイルが無ければ作成
  touch($file);
}

$contents = <<< EOM
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
EOM;

while ($row = mysql_fetch_assoc($result)) {
$contents .= <<< EOM
<url>
<loc>https://[ドメイン]/article/{$row['id']}</loc>
<lastmod>{$date}</lastmod>
<changefreq>monthly</changefreq>
</url>
EOM;
}

$contents .= "\n</urlset>";

// 結果をファイルに書き出す
file_put_contents($file, $contents);

mysql_close($con);
?>

sitemap.xmlについて知ったこと

どの形式でも 1 つのサイトマップにはサイズが 10 MB(圧縮しない状態で)以下、URL が 50,000 件以下という制限があります。これよりサイズが大きい場合や、URL が多い場合は、複数のサイトマップにリストを分割する必要があります。

1つのサイトマップのXMLファイルは10 MB(圧縮しない状態で)以下且つ、50,000件以下という制限があるのですがファイルを分割した上gzipで圧縮すればその制限を超えることができるようです。

これをサイトマップインデックスファイルと呼ぶようで、最大500個まで登録できるそうです。

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
       <loc>https://[ドメイン]/sitemap/sitemap1.xml.gz</loc>
       <lastmod>2016-10-29</lastmod>
    </sitemap>
    <sitemap>
       <loc>https://[ドメイン]/sitemap/sitemap2.xml.gz</loc>
       <lastmod>2016-10-29</lastmod>
    </sitemap>
</sitemapindex>

参考