Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Hilfe bei der Sitemap-Erstellung

    PatKol

    • Mitglied
    • Beiträge: 178
    Hilfe bei der Sitemap-Erstellung
    am: 20. Februar 2013, 10:03:59
    Moin,
    mein Shop umfasst derzeit 5340 Artikel. Das mitgelieferte Modul Google Sitemap läuft bei mir nicht sauber durch. Nach einer gewissen Ladezeit erscheint eine leere Seite, wo nur der Background drauf sichtbar ist. Die Sitemap.xml ist mit CHMOD 777 ausgestattet und ist bereits 1,07 MB groß. Wenn ich die Sitemap im eingeloggten Zustand aufrufen möchte, erscheint folgende Fehlermeldung:

    XML-Verarbeitungsfehler: Kein Element gefunden
    Adresse: http://www.bestcarparts.de/sitemap.xml
    Zeile Nr. 26698, Spalte 1:

    Mein Hoster hat bereits die PHP_max_execution_time auf 60 erhöht. Hat jemand eine Idee? Kann es mit SSL-Verschlüsselung zu tun haben?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=24878.0
    Trade Republic - Provisionsfrei Aktien handeln

    Alfred

    • Experte
    • Beiträge: 2.115
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #1 am: 20. Februar 2013, 11:23:03
    Hallo,

    damit die Sitemap verarbeitet werden kann muss am Ende </urlset> rein.
    Das löst jetzt nicht das Problem aber macht sie nutzbar.

    Irgendwo im Forum wurde das schon behandelt.

    Gruß

    PatKol

    • Mitglied
    • Beiträge: 178
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #2 am: 20. Februar 2013, 11:38:02
    Hi, danke dir! Das ist ein guter Tip! Ich habe irgendwo gelesen, dass jemand die max_execution_time auf 120 gesetzt hat. Mein Hoster verlangt dafür allerdings Geld und ich weiß eben nicht genau, ob es daran liegt?

    jannemann

    • modified Team
    • Beiträge: 6.275
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #3 am: 20. Februar 2013, 21:46:45
    Hallo PatKol,

    bei welchem Hoster bist du denn?

    Schöne Grüße,
    Jan

    PatKol

    • Mitglied
    • Beiträge: 178
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #4 am: 20. Februar 2013, 22:12:03
    Hi Jan,

    ich bin bei Candan.

    Viele Grüße,
    PatKol

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.217
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #5 am: 21. Februar 2013, 01:34:53
    Ich lege mich zu 90% fest, dass es an der "max_execution_time" liegt. Wenn die Zeit nicht ausreicht um die "sitemap.xml" zu erstellen, dann ist sie unvollständig und du scheinst ja eine Menge Artikel im Shop zu haben.

    Grüße

    Torsten

    hbauer

    • Experte
    • Beiträge: 1.097
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #6 am: 21. Februar 2013, 08:20:50
    Wäre es nicht eine Möglichkeit das mit einem Testserver lokal zu testen?

    Gruß

    Hagen

    twe

    • Schreiberling
    • Beiträge: 293
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #7 am: 21. Februar 2013, 08:22:00
    Ich gehe auf 99% das es an "max_execution_time" . Hab auch 60 und komme genau so auf 1 bis 1-3 MB.

    Ich erzeuge die Datei lokal, ändere alle url von localhost in domain.de und lade sie mit ftp hoch.

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #8 am: 21. Februar 2013, 08:36:49
    Hi PatKol,

    probiere es doch einfach mal hiermit: http://www.modified-shop.org/forum/index.php?topic=10016.msg228151#msg228151 (die Version im "momentan" letzten Post - "sitemap2.xml & sitemap3.xml.gz") und vergleiche, ob in Deiner jetzige Sitemap auch alle Produkte gelistet sind. Möglicherweise läuft die Generierung hier auch schneller. Darüber hinaus hat diese Version noch weitere Vorteile - Du könntest dann auch die gezippte Sitemap benutzen, falls Dein Shop noch größer wird.

    Gruß, Ingo

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #9 am: 21. Februar 2013, 11:15:01
    Ach nochwas @PatKol: ich denke, dass die built-in sitemap auch mit "output buffer" generiert wird, oder? Möglicherweise liegt es auch daran, dass Dein Hoster das output_buffering limitiert hat, der Server aber bis zum Erreichen der max_execution_time keine Fehlermeldung gibt. Einfach mal den Hoster fragen, ob das serverseitig (in der php.ini) gesetzt wurde.

    PatKol

    • Mitglied
    • Beiträge: 178
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #10 am: 21. Februar 2013, 12:54:16
    Danke für eure Tipps. Die Server Info sagt: output_buffering = no value ...

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #11 am: 21. Februar 2013, 12:59:16
    Na dann scheint es daran nicht gelegen zu haben, denn es wurde offenbar kein Limit gesetzt. Probier am besten mal meine oben vorgeschlagene Alternative.

    Gruß, Ingo

    PatKol

    • Mitglied
    • Beiträge: 178
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #12 am: 21. Februar 2013, 13:03:32
    Jo, mein Hoster hat nun doch kostenlos die max_execution_time auf 120 gesetzt und auch das hat nix gebracht. Die Datei ist weiterhin 1,05 MB groß  :datz:

    Bevor ich die dynamische Sitemap ausprobiere, könnte man eventuell noch überflüssige Dinge aus der Google-Sitemap.php rausnehmen. Hat da jemand eine Idee zu?

    Code: PHP  [Auswählen]
    <?php
    /*
    osCommerce, Open Source E-Commerce Solutions
    http://www.oscommerce.com

    Copyright (c) 2005 osCommerce

    Released under the GNU General Public License

    @Author: Raphael Vullriede (osc@rvdesign.de)

    Port to xtCommerce

    @Author: Winfried Kaiser (w.kaiser@fortune.de)
    */


    require('includes/application_top.php');

    // if the customer is not logged on, redirect them to the login page
    if (!isset($_SESSION['customer_id'])) {

        xtc_redirect(xtc_href_link(FILENAME_LOGIN, '', 'NONSSL'));
    }
    // XML-Specification: https://www.google.com/webmasters/sitemaps/docs/de/protocol.html

    define('CHANGEFREQ_CATEGORIES', 'weekly');  // Valid values are "always", "hourly", "daily", "weekly", "monthly", "yearly" and "never".
    define('CHANGEFREQ_PRODUCTS', 'daily'); // Valid values are "always", "hourly", "daily", "weekly", "monthly", "yearly" and "never".

    define('PRIORITY_CATEGORIES', '1.0');
    define('PRIORITY_PRODUCTS', '0.5');

    define('MAX_ENTRYS', 50000);
    define('MAX_SIZE', 10000000);
    define('GOOGLE_URL', 'http://www.google.com/webmasters/sitemaps/ping?sitemap=');
    // BOF - Tomcraft - 2010-02-09 - Changed LIVE_URL
    //define('LIVE_URL', 'http://webmaster.live.com/webmaster/ping.aspx?siteMap=');      
    define('LIVE_URL', 'http://www.bing.com/webmaster/ping.aspx?siteMap=');
    // EOF - Tomcraft - 2010-02-09 - Changed LIVE_URL
    define('ASK_URL', 'http://submissions.ask.com/ping?sitemap=');    
    $SEO_DOMAINS = array(LIVE_URL,ASK_URL,GOOGLE_URL);

    define('SITEMAPINDEX_HEADER', "<?xml version='1.0' encoding='UTF-8'?>"."\n".'
              <sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.84"'
    ."\n".'
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    ."\n".'
                  xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84'
    ."\n".'
                  http://www.google.com/schemas/sitemap/0.84/siteindex.xsd">'
    ."\n"
    );
    define('SITEMAPINDEX_FOOTER', '</sitemapindex>');
    define('SITEMAPINDEX_ENTRY', "\t".'<sitemap>'."\n\t\t".'<loc>%s</loc>'."\n\t\t".'<lastmod>%s</lastmod>'."\n\t".'</sitemap>'."\n");

    define('SITEMAP_HEADER', "<?xml version='1.0' encoding='UTF-8'?>"."\n".'
              <urlset xmlns="http://www.google.com/schemas/sitemap/0.84"'
    ."\n".'
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    ."\n".'
                  xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84'
    ."\n".'
                  http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">'
    ."\n"
    );
    define('SITEMAP_FOOTER', '</urlset>');
    define('SITEMAP_ENTRY', "\t".'<url>'."\n\t\t".'<loc>%s</loc>'."\n\t\t".'<priority>%s</priority>'."\n\t\t".'<lastmod>%s</lastmod>'."\n\t\t".'<changefreq>%s</changefreq>'."\n\t".'</url>'."\n");

    $smarty = new Smarty;

    $breadcrumb->add('Google Sitemap', xtc_href_link(FILENAME_GOOGLE_SITEMAP, xtc_get_all_get_params(), 'NONSSL'));

    // include boxes
    require(DIR_FS_CATALOG .'templates/'.CURRENT_TEMPLATE. '/source/boxes.php');

    require(DIR_WS_INCLUDES . 'header.php');
    include (DIR_WS_MODULES . 'default.php');

    define('SITEMAP_CATALOG', HTTP_SERVER.DIR_WS_CATALOG);

    $usegzip        = false;
    $autogenerate   = false;
    $output_to_file = false;
    $notify_google  = false;
    $notify_url     = '';

    // request over http or command line?
    if (!isset($_SERVER['SERVER_PROTOCOL'])) {

        if (count($_SERVER['argv'] > 1)) {

            // option p ist only possible of min 1 more option isset
            if ( (strlen($_SERVER['argv'][1]) >= 2) && strpos($_SERVER['argv'][1], 'p') !== true) {
                $notify_google = true;
                $_SERVER['argv'][1] = str_replace('p', '', $_SERVER['argv'][1]);
            }

            switch($_SERVER['argv'][1]) {

                // dump to file
                case '-f':
                $output_to_file = true;
                $filename = $_SERVER['argv'][2];
                break;

                // dump to compressed file
                case '-zf':
                $usegzip        = true;
                $output_to_file = true;
                $filename = $_SERVER['argv'][2];
                break;

                // autogenerate sitemaps. useful for sites with more the 500000 Urls
                case '-a':
                $autogenerate = true;
                break;

                // autogenerate sitemaps and use gzip
                case '-za':
                $autogenerate   = true;
                $usegzip        = true;
                break;
            }
        }
    } else {

        if (count($_GET) > 0) {

            // dump to file
            if (isset($_GET['f'])) {
                $output_to_file = true;
                $filename = $_GET['f'];
            }
            // use gzip
            $usegzip = (isset($_GET['gzip']) && $_GET['gzip'] == true) ? true : false;

            // autogenerate sitemaps
            $autogenerate = (isset($_GET['auto']) && $_GET['auto'] == true) ? true : false;

            // notify google
            $notify_google = (isset($_GET['ping']) && $_GET['ping'] == true) ? true : false;
        }
    }

    // use gz... functions for compressed files
    if ($usegzip) {
        $function_open  = 'gzopen';
        $function_close = 'gzclose';
        $function_write = 'gzwrite';

        $file_extension = '.xml.gz';
    } else {
        $function_open  = 'fopen';
        $function_close = 'fclose';
        $function_write = 'fwrite';

        $file_extension = '.xml';
    }

    $c = 0;
    //BOF - Dokuman - 2009-11-09 - Create "sitemap.xml" instead of "sitemap1.xml"
    //$i = 1;
    $i = '';
    //EOF - Dokuman - 2009-11-09 - Create "sitemap.xml" instead of "sitemap1.xml"

    $sitemap_filename = 'sitemap'.$i.$file_extension;
    if ($autogenerate) {
        $filename = $sitemap_filename;
    }
    $autogenerate = $autogenerate || $output_to_file;
    if ($autogenerate) {
        $fp = $function_open($filename, 'w');
        $main_content = "Sitemap-Datei '<b>" . $filename . "</b>' erstellt.";
    }
    $notify_url = SITEMAP_CATALOG.$sitemap_filename;

    output(SITEMAP_HEADER);
    $strlen = strlen(SITEMAP_HEADER);

    $cat_result = xtc_db_query("
        SELECT
          c.*,
          cd.*,
          UNIX_TIMESTAMP(c.date_added) as date_added,
          UNIX_TIMESTAMP(c.last_modified) as last_modified,
          l.code
        FROM  
          "
    .TABLE_CATEGORIES." c,
          "
    .TABLE_CATEGORIES_DESCRIPTION." cd,
          "
    .TABLE_LANGUAGES." l
        WHERE
          c.categories_id = cd.categories_id AND
          cd.language_id = l.languages_id AND
          c.categories_status = 1
        ORDER by  
          cd.categories_id
      "
    );

    $cat_array = array();
    if (xtc_db_num_rows($cat_result) > 0) {
        while($cat_data = xtc_db_fetch_array($cat_result)) {
            $cat_array[$cat_data['categories_id']][$cat_data['code']] = $cat_data;
        }
    }
    reset($cat_array);

    foreach($cat_array as $lang_array) {
        foreach($lang_array as $cat_id => $cat_data) {
            $lang_param = ($cat_data['code'] != DEFAULT_LANGUAGE) ? '&language='.$cat_data['code'] : '';
            $date = ($cat_data['last_modified'] != NULL) ? $cat_data['last_modified'] : $cat_data['date_added'];
             
            /**
             * @author Timo Paul (mail[at]timopaul.biz)
             * @since Saturday, 16-th May 2009
             *  
             * generate seo-frendly uri's
             */

            $cPath_new = xtc_category_link($cat_data['categories_id'], $cat_data['categories_name']);
            $string = sprintf(SITEMAP_ENTRY, xtc_href_link(FILENAME_DEFAULT, $cPath_new), PRIORITY_CATEGORIES, iso8601_date($date), CHANGEFREQ_CATEGORIES);
                 
            $c_cat_total++;
            output_entry();
        }
    }

    $stmt = "
        SELECT
          p.*,
          pd.*,
          UNIX_TIMESTAMP(p.products_date_added) as products_date_added,
          UNIX_TIMESTAMP(p.products_last_modified) as products_last_modified,
          l.*
        FROM
          "
    .TABLE_PRODUCTS." p,  
          "
    .TABLE_PRODUCTS_DESCRIPTION." pd,
          "
    .TABLE_LANGUAGES." l
        WHERE
          p.products_status='1' AND
          p.products_id = pd.products_id AND
          pd.language_id = l.languages_id
        ORDER BY
          p.products_id
      "
    ;

    $product_result = xtc_db_query($stmt);
    if (xtc_db_num_rows($product_result) > 0) {
        while($product_data = xtc_db_fetch_array($product_result)) {

            /**
             * @author Timo Paul (mail[at]timopaul.biz)
             * @since Saturday, 16-th May 2009
             *  
             * generate article-array with valid seo-uri's
             */

            $pArray = $product->buildDataArray($product_data);
             
            $lang_param = ($product_data['code'] != DEFAULT_LANGUAGE) ? '&language='.$product_data['code'] : '';
            $date = ($product_data['products_last_modified'] != NULL) ? $product_data['products_last_modified'] : $product_data['products_date_added'];
            $string = sprintf(SITEMAP_ENTRY, $pArray['PRODUCTS_LINK'], PRIORITY_PRODUCTS, iso8601_date($date), CHANGEFREQ_PRODUCTS);

            $c_prod_total++;
            output_entry();
        }
    }


    output(SITEMAP_FOOTER);
    if ($autogenerate) {
        $function_close($fp);
    }

    $main_content .= "<br><br>" . $c_cat_total . " <b>Kategorien</b> und " . $c_prod_total . " <b>Produkte</b> exportiert.";
    // generates sitemap-index file
    if ($autogenerate && $i > 1) {
        $sitemap_index_file = 'sitemap_index'.$file_extension;
        $main_content = $main_content . "<br><br>Sitemap-Index-Datei '<b>" . $sitemap_index_file . "</b>' erstellt.";
        $notify_url = SITEMAP_CATALOG.$sitemap_index_file;
        $fp = $function_open('sitemap_index'.$file_extension, 'w');
        $function_write($fp, SITEMAPINDEX_HEADER);
        for($ii=1; $ii<=$i; $ii++) {
            $function_write($fp, sprintf(SITEMAPINDEX_ENTRY, SITEMAP_CATALOG.'sitemap'.$ii.$file_extension, iso8601_date(time())));
        }
        $function_write($fp, SITEMAPINDEX_FOOTER);
        $function_close($fp);
    }

    if ($notify_google) {
        foreach (sitemap_curl($notify_url, $SEO_DOMAINS) as $value) {
            $main_content .= $value.'<hr />';
        }
    }

    $smarty->caching = 0;
    $smarty->assign('language', $_SESSION['language']);
    $smarty->assign('CONTENT_BODY',$main_content);
    $smarty->assign('BUTTON_CONTINUE','<a href="' . xtc_href_link(FILENAME_START) . '">' . xtc_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>');
    $main_content = $smarty->fetch(CURRENT_TEMPLATE . '/module/google_sitemap.html');
    $smarty->assign('main_content',$main_content);
    if (!defined(RM)) $smarty->load_filter('output', 'note');
    $smarty->display(CURRENT_TEMPLATE . '/index.html');


    // < PHP5
    function iso8601_date($timestamp) {

        if (PHP_VERSION < 5) {
            $tzd = date('O',$timestamp);
            $tzd = substr(chunk_split($tzd, 3, ':'),0,6);
            return date('Y-m-d\TH:i:s', $timestamp) . $tzd;
        } else {
            return date('c', $timestamp);
        }
    }

    // generates cPath with helper array
    function rv_get_path($cat_id, $code) {
        global $cat_array;

        $my_cat_array = array($cat_id);

        while($cat_array[$cat_id][$code]['parent_id'] != 0) {
            $my_cat_array[] = $cat_array[$cat_id][$code]['parent_id'];
            $cat_id = $cat_array[$cat_id][$code]['parent_id'];
        }

        return 'cPath='.implode('_', array_reverse($my_cat_array));
    }


    function output($string) {
        global $function_open, $function_close, $function_write, $fp, $autogenerate;

        if ($autogenerate) {
            $function_write($fp, $string);
        } else {
            echo $string;
        }
    }

    function output_entry()
    {
        global $string, $strlen, $c, $autogenerate, $fp, $function_open, $function_close, $main_content, $strlen;
         
        output($string);
        $strlen += strlen($string);
        $c++;
        if ($autogenerate) {
            // 500000 entrys or filesize > 10,485,760 - some space for the last entry
            if ( $c == MAX_ENTRYS || $strlen >= MAX_SIZE) {
                output(SITEMAP_FOOTER);
                $function_close($fp);
                $c = 0;
                $i++;
                $filename = 'sitemap'.$i.$file_extension;
                $fp = $function_open($filename, 'w');
                $main_content = $main_content . "<br>Sitemap-Datei '<b>" . $filename . "</b>' erstellt.";
                output(SITEMAP_HEADER);
                $strlen = strlen(SITEMAP_HEADER);
            }
        }
    }

    // function made by Mathis Klooss (www.gunah.eu)
    function sitemap_curl( $notify_url , $mixed=array() ) {
        $result = '';
        $allow_url_fopen = ini_get("allow_url_fopen");
        foreach ($mixed as $value) {
            if($allow_url_fopen == 0 || function_exists('curl_exec') == true) {
                ob_start();
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $value . urlencode($notify_url));
                $user_agent = 'Mozilla/4.0 (compatible; xtc; sitemap-submitter) xt:commerce sitemap-submitter';
                curl_setopt ( $ch , CURLOPT_USERAGENT, $user_agent);
                $test = curl_exec($ch);
                curl_close($ch);
                $ob_get_contents = ob_get_contents();
                ob_end_clean();
                $out = sitemap_replace($ob_get_contents);
                $result[] = '<div>'.$value.htmlentities($notify_url).'</div>'.$out;
            } elseif($allow_url_fopen == 1) {
                fopen($value.urlencode($notify_url), 'r');
                $response = file_get_contents($value . urlencode($notify_url));
                $result[] = '<div>'.$value.htmlentities($notify_url).'</div>'.sitemap_replace($response);
            }
        }
        return $result;
    }

    function sitemap_replace($result) {
        preg_match('/<body>(.*?)<\/body>/si', $result, $result);
         
        $out = preg_replace( '/<img(.*?)>/si'  , ''  , $result['1']);
        $out = preg_replace("/<br(.*?)>/si", "<br />", $out);
        $out = preg_replace("/<h(.*?)>(.*?)<\/h(.*?)>/si", "<h2>\\2</h2>", $out);
        $out = str_replace("<br>", "<br />", $out);  
        $out = preg_replace("/<div(.*?)>(.*?)<\/div>/si", "<div>\\2</div>", $out);
        $out = preg_replace("/<br(.*?)>(.*?)<br(.*?)>(.*?)<br(.*?)>(.*?)<br(.*?)>/si", "", $out);    
        $out = strip_tags($out,'<a>,<p>,<br>,<h2>,<div>');
        return $out;  
    }
    require(DIR_WS_INCLUDES . 'application_bottom.php');  
    ?>

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #13 am: 21. Februar 2013, 13:36:40
    Hmmm, Du ziehst einen Core-Hack einer Erweiterung vor? Warum?

    PatKol

    • Mitglied
    • Beiträge: 178
    Re: Hilfe bei der Sitemap-Erstellung
    Antwort #14 am: 21. Februar 2013, 14:33:14
    Hatte jetzt nicht auf dem Zettel, dass damit ein Eingriff in den Core vorgenommen wird. Ich werde die Erweiterung heute Abend einbauen und berichten.

    Viele Grüße,
    PatKol
    2 Antworten
    2132 Aufrufe
    21. Oktober 2010, 07:34:37 von charly52
    3 Antworten
    2402 Aufrufe
    14. November 2010, 11:04:01 von koshiro
    7 Antworten
    3566 Aufrufe
    09. März 2013, 08:26:46 von Buggyboy
    4 Antworten
    2862 Aufrufe
    14. März 2015, 22:06:31 von Toby