FriendsOfREDAXO / search_it

Umfangreiche Volltextsuche für REDAXO 5 CMS. Durchsucht Artikel, Medien, Dateien, PDF-Inhalte und Datenbank-Einträge.
https://github.com/FriendsOfREDAXO/search_it
MIT License
65 stars 18 forks source link

Allowed memory size of ... bytes exhausted #300

Closed TobiasKrais closed 3 years ago

TobiasKrais commented 3 years ago

In meinem Redaxo Log finde ich ab und zu einen "Allowed memory size exhausted" Fehler. Durch den Zeitstempel und aktiviertem Stats Plugin konnte ich den Suchbegriff herausfinden, der den Fehler verursacht. Er lautet "kdb 615". Wo kann ich anfangen den Fehler zu suchen?

ErrorException: Allowed memory size of 268435456 bytes exhausted (tried to allocate 33656832 bytes) File: redaxo/src/addons/search_it/lib/search_it.php Line: 2493

Stacktrace | Function | File | Line | | --------------------------- | -------- | -------- | | rex_error_handler::shutdown | | |
System report (REDAXO 5.11.1, PHP 7.4.10, MySQL 5.7.28) | REDAXO | | | ------------: | :--------- | | Version | 5.11.1 | | PHP | | | ------------: | :--------- | | Version | 7.4.10 | | OPcache | no | | Xdebug | no | | Database | | | ------------: | :----------- | | Version | MySQL 5.7.28 | | Character set | utf8 | | Server | | | ------------: | :--------- | | OS | Linux | | SAPI | fpm-fcgi | | Webserver | Apache | | Request | | | ------------: | :----------- | | Browser | Firefox/83.0 | | Protocol | HTTP/2.0 | | HTTPS | yes | | Packages | | | -----------------------------------------------: | :---------- | | accessdenied | 1.0.6 | | be_style | 2.11.1 | | be_style/customizer | 2.11.0 | | be_style/redaxo | 2.11.1 | | cronjob | 2.7.1 | | d2u_address | 1.1.2 | | d2u_helper | 1.7.0 | | d2u_helper/translation_helper | 1.7.0 | | d2u_history | 1.0.1 | | d2u_jobs | 1.2.0 | | d2u_jobs/hr4you_import | 1.2.0 | | d2u_linkbox | 1.2.4 | | d2u_machinery | 1.3.3 | | d2u_machinery/industry_sectors | 1.3.3 | | d2u_machinery/machine_features_extension | 1.3.3 | | d2u_machinery/machine_steel_processing_extension | 1.3.3 | | d2u_machinery/used_machines | 1.3.3 | | d2u_news | 1.1.3 | | d2u_news/fairs | 1.1.3 | | d2u_partner | 1.0 | | d2u_references | 1.0.8 | | d2u_staff | 1.0.3 | | d2u_videos | 1.0.9 | | emailobfuscator | 3.0.0 | | install | 2.8.0 | | iwcc | 1.1.2 | | media_manager | 2.10.1 | | media_manager_autorewrite | 2.0.0 | | mediapool | 2.9.0 | | metainfo | 2.7.2 | | multinewsletter | 3.2.7 | | phpmailer | 2.9.1 | | search_it | 6.7.3 | | search_it/autocomplete | 6.7.3 | | search_it/documentation | 6.7.3 | | search_it/plaintext | 6.7.3 | | search_it/stats | 6.7.3 | | sprog | 1.2.0 | | structure | 2.11.1 | | structure/content | 2.11.1 | | tinymce4 | 1.2.1 | | uploader | 2.2.0 | | url | 2.0.0-beta3 | | users | 2.7.1 | | ycom | 4.0.3 | | ycom/auth | 4.0.3 | | ycom/docs | 4.0.3 | | ycom/group | 4.0.3 | | ycom/media_auth | 4.0.3 | | yform | 3.4.1 | | yform/docs | 3.3.1 | | yform/email | 3.4.1 | | yform/manager | 3.4.1 | | yform_spam_protection | 1.0.5 | | yrewrite | 2.7 | | yrewrite_scheme | 3.3.0 |
alxndr-w commented 3 years ago

Gibt's den Artikel und/oder Datensatz noch, der den Treffer liefert?

tyrant88 commented 3 years ago

Es geht ja wohl um die serialize() Funktion... Ist die $return Variable so groß?

TobiasKrais commented 3 years ago

Ja, die $return Variable ist gewaltig! Wenn ich den Weg zurück verfolge, komme ich zu einer interessanten Entdeckung. Es betrifft diesen Codeteil der search() Funktion:

https://github.com/FriendsOfREDAXO/search_it/blob/4705486d1bf23fb66013566fedc346ae4983bf37/lib/search_it.php#L2117-L2129

Vor diesem Code hat die Variable $this->searchString den Inhalt 'kbd 615'. Danach aber folgenden Inhalt '000 0030 010 0152 0166 0173 0210 025 028 030 035 045 050 0517 0560 0575 06206 0711 07621 077 07721 08529 100 1000 1001 100152 10025 1003 101 1010 1015 1020 1030 10300 1036 1050 1051 10750 108200500 1090 110 11000 111 1110 1120 1160 1190 120 1200 12000 1201 1215 1220 1221 1234213201 125 1250 1260 1280 12900 13 130 1300 13000 1301 1305 1318 1320 13200 1330 1336 135 13500 1351 1375 140 14000 142 1430 1431 1432 1435 144 145 150 1500 1504 1506 1508 151 1512 152 153 155 15500 1551 158 160 1600 1614 1650 167 1670 1680 173 175 177 180 180° 1805 1830 1834 1835 184 1840 1850 188 1887 1919 1920 1925 1950 1961 1962 1963 1969 1974 1984 1990 1995 1996 1999 200 2000 2001 2002 2005 2008 201 2011 2012 2015 2017 2019 2020 2021 2022 2029 20354 2065 207 2100 2101 21088 211 2114 2118 212 2128 213 2150 220 2200 22000 221 2220 2305 236 237 240 241 2420 244 2452 2453 2470 248 250 2500 2504 2506 2512 25282 255 2550 260 2600 2606 2607 2612 2614 2628 2650 2691 270 2710 275 2825 283 290 2955 299 3-1089-183011 30° 300 3000 3004 3012 305 30938 3100 3105 31061 3114 313 3140 3150 316 319 32 320 3200 3230 330 3300 339 343629013 35 35° 350 3500 351 3510 353 35719 358 3580 360 3632 368047 370 3700 371 37247 3740 375 3750 37678 3780 379 380 389489989 390 3900 3910 39218 3928 399 40 40° 400 4000 4004 4008 401 4015 401505 40476 4051 4080 41 410 4100 41000 411 411054 4127 414 4140 420 425 430 4370 440 441 4422 45° 450 4500 451 452 4520 453 4570 46 460 461 4624 463 470 4700 4704030 471 475 476 477 480 4900 4988 5 50 500 5000 50001 5010 5019 50498 507 51065 5140 5150 5181 52 524 5370 549 55° 5505 566 5730 582 599499 599601 600 6000 6006 603 615 615541 620 6200 62000 621 6240 6260 630 631 635 639188031096 6464 64824447 65 650 6557 6560 660 665310017 671 67140 675 680 6860 6990 70° 700 7000 70025 70173 7020 7021150 7200 7202 72213 7229 723 7231 7232 736 7453 750 75177 760 761 7621 7700 7750 78052 79539 8-0285-085150 8-0285-100152 8-1501-037002 8-2671-650005 8-7900-000111 8-8013-383304 8-9021-35081 8-9021-451204 8-9025-359600 8-9025-37840 8-9025-409600 8-9041-004200 8-9041-131190 80 800 8000 8101 8123424471 81932 844 846 850 858 8600 864 869 87213 874 878760 878765 88239 90° 900 9000 9001 914784737 916 916220071 920 929 932 9398 9403 94043 950 9625 971 97288 98863 990 999 9999 Ø160'. Das ist die Ursache, warum $return riesig wird.

TobiasKrais commented 3 years ago

Ah, die Ähnlichkeitssuche ist Schuld. Ist schon ein bisschen krass, was die Ähnlichkeitssuche hier als "ähnlich" liefert. Wie kann das sein?

TobiasKrais commented 3 years ago

OK. Diese Zahlen haben eine Ähnlichkeits zu "615"!?

"simwords" => array:2 [▼ "kbd" => array:3 [▼ "keyword" => null "typedin" => "kbd" "count" => null ] 615 => array:3 [▼ "keyword" => "000 0030 010 0152 0166 0173 0210 025 028 030 035 045 050 0517 0560 0575 06206 0711 07621 077 07721 08529 100 1000 1001 100152 10025 1003 101 1010 1015 1020 1030 ▶" "typedin" => "615" "count" => "717" ] ]

TobiasKrais commented 3 years ago

Wenn man dann wie im Beispielcode der Doku vorgeschlagen

if($result['count'] == 0 && count($result['simwords']) > 0){
        // Ähnlichkeitssuche ausgeben
        $newsearchString = $result['simwordsnewsearch'];
        $result_simwords = $search_it->search($newsearchString);
        if($result_simwords['count'] > 0){
            echo '<p>Meinten Sie <strong>'. $newsearchString .'</strong>?</p>';
        }
}

diesen Code ausführt, kommt der Fehler.

TobiasKrais commented 3 years ago

IN den Einstellungen habe ich Soundex als Ähnlichkeitssuche aktiviert. Das SQL der Ähnlichkeitssuche lautet (SELECT GROUP_CONCAT(DISTINCT keyword SEPARATOR ' ') as keyword, '615' AS typedin, SUM(count) as count FROM rex_tmp_search_it_keywords WHERE 1 AND (clang = 2 OR clang IS NULL) AND (soundex = '0000')) Als Ergebnis der Ähnlichkeitssuche kommt beim Wort "615" das oben genannte monströse Keyword heraus, das die Webseite zum Absturz bring.

tyrant88 commented 3 years ago

Gerade gefunden und eigentlich logisch: "The soundex algorithm was specifically developed to match names based on how they sound rather than the exact spelling used. It works basically by mapping strings of letters to short strings containing primarily their consonant sounds. Numeric digits will be completely ignored (e.g. stripped from the string) by the soundex algorithm"

tyrant88 commented 3 years ago

müsste man irgendwie eine Ausnahme bauen, wenn der Suchbegriff numerisch ist und dann NICHT soundex anwenden...

TobiasKrais commented 3 years ago

Reicht das so wie in dem Commit oben? Oder muss an anderer Stelle auch noch angesetzt werden?

tyrant88 commented 3 years ago

Ich kann es gerade nicht testen. Vom Code her sieht es gut aus. Seiteneffekte fallen mir keine ein - aber das will nichts heißen. :-) Die Frage wäre: bekommst du jetzt noch ein vernünftige Ergebnis? nur "615" oder auch für "614"? Das musst du jetzt mal mit deinen Daten checken.

TobiasKrais commented 3 years ago

Ja, das ist das Problem. Bei der Suche nach einer Zahl macht er jetzt nicht mehr mit. Muss ich nochmals prüfen.

tyrant88 commented 3 years ago

andererseits sind Nummern ja ziemlich eindeutig... da macht es vielleicht nicht soviel Sinn "ähnliche" zu suchen... Was liefern die anderen Algorithmen (sound_ger, metaphone) eigentlich für 615?

TobiasKrais commented 3 years ago

Noch zu der Frage, was die anderen Algorithmen liefern: sie liefern '0000'. Ich mach noch einen fix fertig, der auch für metaphone gilt.

TobiasKrais commented 3 years ago

Der PR https://github.com/FriendsOfREDAXO/search_it/pull/302 behebt den Fehler für alle Ähnlichkeitssuchen.