PHP выдает ошибку при открытии тега XML

У меня есть файл, который включает в себя файл с именем sitemap.html и в карте сайта у меня есть следующий код:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <url>
        <loc><?php echo SITE_URL . '/'; ?></loc>
        <changefreq>monthly</changefreq>
        <priority>1.00</priority>
    </url>

    <?php foreach ($this->data->content as $content): ?>
        <url>
            <loc><?php echo SITE_URL . $content->permalink; ?></loc>
            <lastmod><?php echo date("Y-m-d", $content->publish_date); ?></lastmod>
            <changefreq>monthly</changefreq>
            <priority><?php echo $content->sitemap_index; ?></priority>
        </url>
    <?php endforeach; ?>
</urlset>

Все вроде бы хорошо, но я получаю ошибку 500, которая говорит:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, непредвиденная 'версия' (T_STRING) в файле sitemap.html в строке 1

Как видите, я использую <?xml и не <?php так почему он пытается разобрать его как PHP?

Сначала я думал, что это были магические кавычки, которые вызывают проблему, но когда я делаю var_dump из get_magic_quotes_gpc (), я получаю bool(false) поэтому магические цитаты даже не включены.

Кроме того, по моему php.ini, Я вижу это magic_quotes является OFF,

В качестве альтернативы, чтобы исправить это, я заменил мою первую строку следующим:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>

Но мне все еще интересно, что происходит.

У меня есть другие веб-сайты, размещенные на том же сервере (PHP версии 5.4.45), и я не получаю PHP Parse Error на карте сайта других сайтов...

Есть идеи, что может быть причиной этой ошибки?

3 ответа

Решение

Вы должны проверить short_open_tag вариант. Как я это вижу, PHP видит <? часть вашего <?xml как открытый тег php и генерирует ошибку.

Если вы хотите, чтобы PHP обрабатывал HTML-страницы и работал на каждом другом сайте, то вы (очевидно) сталкиваетесь с трудной для устранения проблем конфигурацией.

Вы можете продолжить поиск short_open_tags установка похоронена где-то на сервере, или вы можете просто повторить объявление XML, используя PHP.

<?php echo '<?xml version="1.0" encoding="UTF-8" ?>' ?>
<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">
    <url>
        <loc><?php echo SITE_URL . '/'; ?></loc>
        <changefreq>monthly</changefreq>
        <priority>1.00</priority>
    </url>

    <?php foreach ($this->data->content as $content): ?>
        <url>
            <loc><?php echo SITE_URL . $content->permalink; ?></loc>
            <lastmod><?php echo date("Y-m-d", $content->publish_date); ?></lastmod>
            <changefreq>monthly</changefreq>
            <priority><?php echo $content->sitemap_index; ?></priority>
        </url>
    <?php endforeach; ?>
</urlset>

Вот старая страница по теме: открывающие теги PHP и декларация XML

Я предпочитаю давать всем файлам кода PHP расширение.php, поэтому совершенно очевидно, что они содержат код и не требуют дополнительных затрат на обработку PHP каждым файлом HTML, но это только мое мнение.

Как уже упоминалось, это связано с опцией short_open_tag

Говорит ли PHP краткую форму (<? ?>) открытого тега PHP должно быть разрешено. Если вы хотите использовать PHP в сочетании с XML, вы можете отключить эту опцию, чтобы использовать <?xml ?> встроенный В противном случае вы можете распечатать его на PHP, например: <?php echo '<?xml version="1.0"?>'; ?>, Также, если отключено, вы должны использовать длинную форму открытого тега PHP (<?php ?>).

Другие вопросы по тегам