PHP mysql-生成不超过5万行限制的站点地图

时间:2019-02-22 12:14:43

标签: php xml

我有下面的PHP / MYSQL网站地图,该网站地图会在浏览器中生成一个网站地图。我如何才能将其保存到文件并拆分为50.000?我无法使其正常工作,因为脚本仅输出为纯文本。我希望脚本输出到文件中

当前

<?

$xmlfile = 'sitemap.xml';

// this variable will contain the XML sitemap that will be saved in $xmlfile
$xmlsitemap = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

// Connection data (server_address, name, password, database_name)
$hostdb = '';
$userdb = '';
$passdb = '';
$namedb = '';

try {
  // Connect and create the PDO object
  $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8

  // Define and perform the SQL SELECT query
  $sql = "SELECT `shortUrl` FROM `shorturl`";
  $result = $conn->query($sql);

  // If the SQL query is succesfully performed ($result not false)
  if($result !== false) {
    // Parse the result set, and add the URL in the XML structure
    foreach($result as $row) {
      $xmlsitemap .= '
<url>
<loc>'. $row['shortUrl'] .'</loc>
<priority>0.5</priority>
<changefreq>weekly</changefreq>
</url>';
    }
  }

  $conn = null;        // Disconnect
}
catch(PDOException $e) {
  echo $e->getMessage();
}

$xmlsitemap .= '</urlset>';
file_put_contents($xmlfile, $xmlsitemap);          // saves the sitemap on server

// outputs the sitemap (delete this instruction if you not want to display the sitemap in browser)
echo $xmlsitemap;

?>

2 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。

只需在您的foreach中运行一个计数器,然后将其破坏为所需的值即可。

以下未测试的代码

    if($result !== false) {
        // Parse the result set, and add the URL in the XML structure
         $counter = 0;
        foreach($result as $row) {
          $counter++
          $xmlsitemap .= '
    <url>
    <loc>'. $row['shortUrl'] .'</loc>
    <priority>0.5</priority>
    <changefreq>weekly</changefreq>
    </url>';
if($counter==4900){
 break;
}
        }
      }

答案 1 :(得分:0)

让我们看一下生成url记录的代码。

<url>
<loc>'. $row['shortUrl'] .'</loc>
<priority>0.5</priority>
<changefreq>weekly</changefreq>
</url>';

如上所述,一条记录包含5行。因此,您的数组必须包含最多10.000条记录,对吗?

如果将数组拆分为最多包含10.000条记录的块,则可以轻松地将每个块记录保存在不同的文件中。

try {
  // connect db and get records

  # give attention here
  $chunks = array_chunk($result, 10000)
  // If the SQL query is succesfully performed ($result not false)
  if($result !== false) {
    // Parse the result set, and add the URL in the XML structure
        foreach ($chunks as $key => $chunk) {
            $xmlsitemap .= '</urlset $namespaces>';
            foreach ($chunk as $row){
                $xmlsitemap .= '
            <url>
            <loc>' . $row['shortUrl'] . '</loc>
            <priority>0.5</priority>
            <changefreq>weekly</changefreq>
            </url>';
            }
            $xmlsitemap .= '</urlset>';
            file_put_contents("path/to/directory/sitemap-".$key.".xml", $xmlsitemap);
        }
  }
}
// check errors 

顺便说一句,不要忘记为这些网站创建站点地图索引