Nach jedem FrontendTemplate output wird addToSearchIndex aufgerufen, was wiederum indexPage aufruft.
Darin befindet sich folgender Abschnitt:
PHP-Code:
$objIndex = $objDatabase->prepare("SELECT id, url FROM tl_search WHERE checksum=? AND pid=?")
->limit(1)
->execute($arrSet['checksum'], $arrSet['pid']);
// Update the URL if the new URL is shorter or the current URL is not canonical
if ($objIndex->numRows && $objIndex->url != $arrSet['url'])
{
if (strpos($arrSet['url'], '?') === false && strpos($objIndex->url, '?') !== false)
{
// The new URL is more canonical (no query string)
$objDatabase->prepare("DELETE FROM tl_search WHERE id=?")
->execute($objIndex->id);
$objDatabase->prepare("DELETE FROM tl_search_index WHERE pid=?")
->execute($objIndex->id);
}
elseif (substr_count($arrSet['url'], '/') > substr_count($objIndex->url, '/') || (strpos($arrSet['url'], '?') !== false && strpos($objIndex->url, '?') === false) || \strlen($arrSet['url']) > \strlen($objIndex->url))
{
// The current URL is more canonical (shorter and/or less fragments)
$arrSet['url'] = $objIndex->url;
}
else
{
// The same page has been indexed under a different URL already (see #8460)
return false;
}
}
Wird dieser Zweig übersprungen, weil ein item gefunden wurde, wird der "search" Eintrag in die Datenbank geschrieben. Siehe folgenden Code:
PHP-Code:
$objIndex = $objDatabase->prepare("SELECT id FROM tl_search WHERE url=? AND pid=?")
->limit(1)
->execute($arrSet['url'], $arrSet['pid']);
// Add the page to the tl_search table
if ($objIndex->numRows)
{
$objDatabase->prepare("UPDATE tl_search %s WHERE id=?")
->set($arrSet)
->execute($objIndex->id);
$intInsertId = $objIndex->id;
}
else
{
$objInsertStmt = $objDatabase->prepare("INSERT INTO tl_search %s")
->set($arrSet)
->execute();
$intInsertId = $objInsertStmt->insertId;
}
Danach werden auch noch die Indizes neu geschrieben.
Dies hatte bei mir zur Folge, dass eine Datenbank Connection solange geöffnet blieb, bis die Seite neu indiziert war. Als ich die Webseite dann live schaltete, bekam ich ca. nach 15 Minuten den Fehler "Too many connections". Damit war dann auch die Seite down.
Ich hatte mir ein logging eingebaut, was mir alle Datenbank connections und disconnections sowie alle queries dazwischen loggt. Dabei ist mir aufgefallen, dass unheimlich viele INSERTs bei jedem Seiten Aufruf stattfinden. Außerdem wurde immer wieder das gleiche in die Search Index geschrieben.
Mein Lösungsvorschlag wäre:
PHP-Code:
// Update the URL if the new URL is shorter or the current URL is not canonical
if ($objIndex->numRows && $objIndex->url != $arrSet['url'])
{
if (strpos($arrSet['url'], '?') === false && strpos($objIndex->url, '?') !== false)
{
// The new URL is more canonical (no query string)
$objDatabase->prepare("DELETE FROM tl_search WHERE id=?")
->execute($objIndex->id);
$objDatabase->prepare("DELETE FROM tl_search_index WHERE pid=?")
->execute($objIndex->id);
}
elseif (substr_count($arrSet['url'], '/') > substr_count($objIndex->url, '/') || (strpos($arrSet['url'], '?') !== false && strpos($objIndex->url, '?') === false) || \strlen($arrSet['url']) > \strlen($objIndex->url))
{
// The current URL is more canonical (shorter and/or less fragments)
$arrSet['url'] = $objIndex->url;
}
else
{
// The same page has been indexed under a different URL already (see #8460)
return false;
}
}
// LÖSUNGSVORSCHLAG ############
elseif($objIndex->numRows)
{
return false;
}
https://github.com/contao/core-bundl...earch.php#L185
Könntet ihr dieses Verhalten bestätigen?
Grüße und Danke!
Lesezeichen