Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP动态创建站点地图_Php_Xml_Http Headers_Generator_Sitemap - Fatal编程技术网

用PHP动态创建站点地图

用PHP动态创建站点地图,php,xml,http-headers,generator,sitemap,Php,Xml,Http Headers,Generator,Sitemap,我正在尝试用php生成有效的站点地图。逻辑很简单。我将所有^(+)index_sitemal.xml请求转发到.htaccess中的index_sitemap.php文件。PHP脚本如下: <?php header( "content-type: application/xml; charset=UTF-8" ); echo '<?xml version="1.0" encoding="UTF-8"?>'."\n"; echo '<sitemapinde

我正在尝试用php生成有效的站点地图。逻辑很简单。我将所有^(+)index_sitemal.xml请求转发到.htaccess中的index_sitemap.php文件。PHP脚本如下:

<?php 
header( "content-type: application/xml; charset=UTF-8" );
    echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
    echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
    $len = 10;   // to take
    $min = 50;  // minimum
    $max = 100;  // maximum
    $range = [];
    foreach (range(0, $len - 1) as $i) {
        while(in_array($num = mt_rand($min, $max), $range));
        $range[] = $num;
        echo '<sitemap><loc>http://'.$_SERVER['SERVER_NAME'].'/sitemap/'.$num.'.xml</loc></sitemap>'."\n";
    }
    echo '</sitemapindex>';
?>

在浏览器中,它显示良好

图片链接-(对不起,声誉低)

但是在尝试验证xml时,我得到了类型错误

图片链接-(对不起,声誉低)


有什么方法可以使用php显示动态站点地图吗?

我以前也遇到过类似的问题,但通过运行不同的php文件来用CRON作业更新站点地图,解决了这个问题

<?php
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>';
$xmlString .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/videos/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/contact/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/blog/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$sql = "SELECT * FROM categories";
$stmt = DB::run($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $url = $row["url"];
    $xmlString .= '<url>';
    $xmlString .= '<loc>http://example.com/category/'.htmlentities($url).'/</loc>';
    $xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
    $xmlString .= '<changefreq>daily</changefreq>';
    $xmlString .= '<priority>1.0</priority>';
    $xmlString .= '</url>';
}

$xmlString .= '</urlset>';

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xmlString);

$dom->save('../sitemap.xml');
?>

编辑
我以前也遇到过类似的问题,但通过运行不同的PHP文件来用CRON作业更新站点地图,解决了这个问题

<?php
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>';
$xmlString .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/videos/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/contact/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/blog/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$sql = "SELECT * FROM categories";
$stmt = DB::run($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $url = $row["url"];
    $xmlString .= '<url>';
    $xmlString .= '<loc>http://example.com/category/'.htmlentities($url).'/</loc>';
    $xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
    $xmlString .= '<changefreq>daily</changefreq>';
    $xmlString .= '<priority>1.0</priority>';
    $xmlString .= '</url>';
}

$xmlString .= '</urlset>';

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xmlString);

$dom->save('../sitemap.xml');
?>

编辑


Paddy Hallihan感谢您的回答!我需要配置CRON作业以首先对其进行测试。但是,您能否告知此脚本是否生成静态“./sitemap.xml”或仅显示它而不保存?您可以在浏览器中运行PHP文件进行测试,而无需设置cron作业,它应该保存xml文件。在我的例子中,我有一个包含所有脚本的cron文件夹,因此XML被保存回主目录
。/sitemap.XML
,因此您可能需要调整此文件夹。实际的XML文件在保存时是静态的。但是CRON作业将每小时/天或您选择的任何时间重写它。嗯,很奇怪,但我没有得到这个静态sitemap.xml。但无论如何,我明白你的意思,我会朝这个方向前进,谢谢。另一件事是如何显示它。我的意思是,如果我保存它“$dom->save('../sitemap.xml');”,那么我的php脚本将不会像最初计划的那样返回xml sitemap。在这种情况下,我唯一能想到的就是像我前面所说的那样,使用
。/
访问目录,并确保您能够写入此目录。此外,当它被保存时,我不需要显示它。我知道名字总是一样的,所以这就是我给谷歌搜索控制台的URL。我还有另一个脚本,然后在一个单独的cron工作中,ping谷歌说,嘿,这是一个新的网站地图(见编辑的答案)帕迪哈利汉谢谢你的回答!我需要配置CRON作业以首先对其进行测试。但是,您能否告知此脚本是否生成静态“./sitemap.xml”或仅显示它而不保存?您可以在浏览器中运行PHP文件进行测试,而无需设置cron作业,它应该保存xml文件。在我的例子中,我有一个包含所有脚本的cron文件夹,因此XML被保存回主目录
。/sitemap.XML
,因此您可能需要调整此文件夹。实际的XML文件在保存时是静态的。但是CRON作业将每小时/天或您选择的任何时间重写它。嗯,很奇怪,但我没有得到这个静态sitemap.xml。但无论如何,我明白你的意思,我会朝这个方向前进,谢谢。另一件事是如何显示它。我的意思是,如果我保存它“$dom->save('../sitemap.xml');”,那么我的php脚本将不会像最初计划的那样返回xml sitemap。在这种情况下,我唯一能想到的就是像我前面所说的那样,使用
。/
访问目录,并确保您能够写入此目录。此外,当它被保存时,我不需要显示它。我知道名字总是一样的,所以这就是我给谷歌搜索控制台的URL。我还有另外一个脚本,然后在一个单独的cron作业中,ping Google说嘿,这是一个新的站点地图(见编辑后的答案)