Hallo allerseits,
ich möchte das Ergebnis meiner Recherche noch bekannt geben, als Hinweis für
alle, die ein Ortsfamilienbuch mit Webtrees erstellen (wollen). Alle anderen
werden dieses Problem wahrscheinlich nie bekommen.
Es wird wohl doch ein Speicherproblem sein, das bei einer üblichen Anzahl
von INDI in einer Familiendatenbank nicht auftritt. Wenn ich den Code ändere
und die Schleife nach 9.000 INDIs verlasse, dann tritt das gleiche Problem
bei der nächsten Methode auf: linkedFamilies. Das lässt mich dann doch auf
ein Speicherproblem schließen und muss Peters Vermutung zustimmen.
Da wir ein Ortsfamilienbuch damit erstellen, stoßen wir offensichtlich an
Grenzen. Ich habe mal den Speicher meiner Test-Subdomain auf 256M
hochgeschraubt, der aber erst in 16.666 Minuten (so die Meldung bei
Speichern vor 2 Tagen) aktiv wird. Dauert also noch ein wenig, bis sie
greift, wenn überhaupt. Aber auch wenn, wird das Problem vielleicht nur
zeitlich verschoben, bis noch ein paar hundert Personen/Familien mehr
erfasst wurden. Ich vermute allerdings, dass dies nicht als Bug anerkannt
werden würde.
Workaround: Statt eine Quelle mit mehreren Büchern halt für jedes Buch oder
Zeitabschnitt eine neue Quelle anlegen :(.
Für PHP-Interessierte nachfolgend die Erläuterung.
Viele Grüße
Markus
Im PHP-Skript /library/WT/GedcomRecord.php ist die Methode linkedIndividuals
definiert (betrifft Version 1.5 dev):
public function linkedIndividuals($link) {
$rows = WT_DB::prepare(
"SELECT i_id AS xref, i_file AS gedcom_id, i_gedcom
AS gedcom" .
" FROM `##individuals`" .
" JOIN `##link` ON (i_file=l_file AND i_id=l_from)"
.
" LEFT JOIN `##name` ON (i_file=n_file AND i_id=n_id
AND n_num=0)" .
" WHERE i_file=? AND l_type=? AND l_to=?" .
" ORDER BY n_sort COLLATE '" . WT_I18N::$collation .
"'"
)->execute(array($this->gedcom_id, $link,
$this->xref))->fetchAll();
$list = array();
***bis hierhin ok, alle 16.610 Datensätze stehen in $rows und konnten
ausgegeben werden. Diese werden in der folgenden Schleife bearbeitet:
foreach ($rows as $row) {
$record = WT_Individual::getInstance($row->xref,
$row->gedcom_id, $row->gedcom);
***jetzt wurde aus jedem Datensatz eine Instanz des INDI erstellt- nach ca.
9.928 Datensätze bricht die Verarbeitung ab.
if ($record->canShowName()) {
$list[] = $record;
***jeder INDI, der angezeigt werden darf, wird in die Liste aufgenommen
}
}
return $list;
}