0 votes
ago in SoSci Survey (dt.) by s309817 (110 points)

Hallo liebes Team,

meine Studie ist seit einigen Tagen online (https://www.soscisurvey.de/personalitymeasure/) und ich bekomme diverse Nachrichten mit Fehlermeldungen.

Von "Diese Seite funktioniert nicht - www.soscisurvey.de kann diese Anfrage momentan nicht verarbeiten" über "Anscheinend gibt es ein Problem mit dieser Website - Der Server auf www.soscisurvey.de sendet einen Fehler: 500 Internal Server Error" sind mehrere dabei.
Der Fehler tritt nie direkt zu Anfang der Studie auf sondern erst nach Eingabe der Noten und persönlichen Daten, d.h. bevor der Fragebogen beginnt, der als PHP Code eingerichtet ist.

An meinem Unilehrstuhl ist wohl bisher kein Problem mit dem PHP Code aufgetreten und auch nicht mit dieser Meldung, daher kann mir dort nicht geholfen werden.

Mit freundlichen Grüßen

1 Answer

0 votes
ago by SoSci Survey (373k points)

Die Fehlerlogs zeigen für das genannte Projekt mehrfach Speicherwarnungen. Sie sollten bereits beim Testen des Fragebogens im Debug-Modus Warnungen gesehen haben, dass die ein oder andere Fragebogen-Seite ungewöhnlich viel RAM-Speicher benötigt.

Im Live-Betrieb scheinen diese Seiten nun über die Grenze zu kommen, sodass die Seite nicht erzeugt werden kann.

Posten Sie doch bitte mal den PHP-Code, den Sie auf der betroffenen Seite verwenden. Dann kann ich im Idealfall Genaueres dazu sagen.

Falls Sie unbedingt bei dem aktuellen PHP-Code bleiben möchten, wäre es eine Überlegung wert, ob Sie den Fragebogen auf den SoSci-Server Ihrer Uni umziehen möchten. Fragen Sie den lokalen Ansprechpartner gerne einmal, wie viel RAM-Speicher die PHP-Scripte dort nutzen dürfen. Zum Vergleich: Auf www.soscisurvey.de sind es 64 MB. Normale Seiten und Scripte nutzen <8 MB.

ago by s309817 (110 points)
Hallo, hier einmal der PHP Code:

if (!isset($blocks)) {
$fragen = array('GN01', 'HC09', 'VN01', 'VN02', 'VN03');
$items = array();
foreach ($fragen as $frage) {
$itemsF = getItems($frage, 'all');
foreach ($itemsF as $itemID) {
$items[] = array($frage, $itemID);
}
}
shuffle($items);
array_splice($items, 50, 0, [['KI01',1]]);
array_splice($items, 100, 0, [['KI01',2]]);
array_splice($items, 150, 0, [['KI01',3]]);
//for ($i=0; $i<count($items); $i++) {
//if ($i < 99) {
//$id = id('I001', $i + 1);
//} elseif ($i > 197) {
//$id = id('I003', $i - 197);
//} else {
//$id = id('I002', $i - 98);
//}
//put($id, $items[$i][0]."_".$items[$i][1]);
//}


$blocks = array_chunk($items, 12);
registerVariable($blocks);
}
$shading = 'start-shaded';
$i = loopPage(count($blocks));
foreach ($blocks[$i] as $pos => $item)
{
$frage = $item[0];
$itemID = $item[1];
if ($shading == 'start-shaded') {
$shading = 'start-unshaded';
} else {
$shading = 'start-shaded';
}
if ($pos == 0) {
question($frage, $itemID, 'spacing=-1');
} elseif ($pos == 11) {
question($frage, $itemID, 'anchor=none', 'show-title=no', 'show-explanation=no',
'shading='.$shading);
} else {
question($frage, $itemID, 'spacing=-1', 'anchor=none', 'show-title=no', 'show-explanation=no',
'shading='.$shading);
}
}
ago by s126035 (110 points)
Vielen Dank für die Antwort auf die Frage der Fragestellerin. Eine Rückfrage dazu: Wir möchten, wie im Code zu sehen, die Reihenfolge der Randomisierung speichern, damit wir wissen, in welcher individuellen Reihenfolge die Teilnehmenden die Fragen präsentiert bekommen. Dazu haben wir wie hier

https://www.soscisurvey.de/help/doku.php/de:create:functions:put

die funktion put() verwendet. Da es viele Items sind (über 200) scheint hier viel RAM nötig zu sein. Außer auf einen anderen Server zu wechseln, gibt es eine ander Möglichkeit? Machen wir hier einen uns nicht offensichtlichen Fehler?
ago by SoSci Survey (373k points)
Haben Sie den Fragebogen einmal im Debug-Modus gestartet und überprüft, ob es diese Seite war, auf welcher das Problem auftrat? In der Debug-Information wird der Speicherbedarf jeder Seite angezeigt.

Erstmal sieht dieser Code nicht problematisch aus. Insgesamt werden dort wohl mehr als 150 Items aus mehreren Fragen gesammelt und gemischt, aber eigentlich werden nur 12 pro Seite gezeigt.

> Da es viele Items sind (über 200) scheint hier viel RAM nötig zu sein

Das Speichern der Abfolge sollte eigentlich nicht so viel RAM benötigen. Ändert sich an der Anzeige des RAM-Verbrauchs viel, wenn Sie diesen Teil des Codes wieder reaktivieren?
ago by s126035 (110 points)
Ich kann den Fehler selbst leider nicht replizieren, auch scheint der RAM-Bedarf immer unterschiedlich zu sein. Das diese Warnung manchmal kommt, haben wir gesehen, aber die Abbrüche scheinen (laut Aussage der Probanden) nicht immer an dieser Stelle zu kommen.

Es werden 225 Items vorab individuell gemischt und dann mit 12 Items pro Seite  gezeigt, bis alle 225 Items präsentiert wurden. Verursacht das das Problem?

Ohne den Teil des Codes kommt keine Wanrung.Wenn der Teil des Codes reaktiviert ist, dann kommt meistens eine Warnung in der REegel sind es 25.6 MB.
ago by SoSci Survey (373k points)
Wenn sie rechts oben die Debug-Information aufklappen, dann sehen Sie die Verbrauchswerte auch wenn der Bedarf nicht unüblich hoch ist.

Aber wenn das Problem bei Ihnen vom put() verursacht wird, dann könnte ich eine relative einfache Lösung vorschlagen. Speichern Sie die Reihenfolge in einer großen internen Variable statt in 225 davon.

$itemlist = '';
foreach ($items as $item) {
  $itemlist.= $item[0].'_'.$item[1].';';
}
put('I001_01', $itemlist);

Wenn Sie das später auswerten möchten, können Sie die Liste in der Statistik-Software wieder zerlegen.

Alternativ rufen Sie nicht 225-mal put() auf, sondern verwenden Sie einfach 3-mal den Befehl putList().

$itemlist = [];
foreach ($items as $item) {
  $itemlist[] = $item[0].'_'.$item[1].';';
}
putList('I001', array_slice($itemlist, 0, 99));
putList('I002', array_slice($itemlist, 99, 99));
putList('I003', array_slice($itemlist, 198));
ago by s126035 (110 points)
Ich habe das jetzt in Frm von

$itemlist = [];
foreach ($items as $item) {
  $itemlist[] = $item[0].'_'.$item[1].';';
}
putList('I001', array_slice($itemlist, 0, 99));
putList('I002', array_slice($itemlist, 99, 99));
putList('I003', array_slice($itemlist, 198));

umgesetzt, und es kommt keine Warnung mehr; Speicherbedarf bei ca. 10 MB. Könnten Sie kurz mitteilen warum das so einen großen Unterschied macht?

In jedem Fall danke für die sehr schnelle Hilfe!
ago by SoSci Survey (373k points)
> Könnten Sie kurz mitteilen warum das so einen großen Unterschied macht?

Für eine wirklich belastbare Antwort müsste ich das Programmverhalten beim Aufruf von 250-mal put() nochmal genauer untersuchen. Das werde ich aber voraussichtlich erst zum übernächten Update unterbringen, weil andere Herausforderungen aktuell höhere Priorität haben.

Wenn man put() aufruft, dann wird im Hintergrund die zugrundeliegende Frage ("interne Variblen") geladen mit allen Items, um eventuelle Einschränkungen bei den Daten zu überprüfen (z.B. erlauben manche interne Variablen nur numerische Codes). Meine Vermutung ist, dass die Frage nicht nur einmal in den Speicher geladen wird, sondern bei jedem Aufruf von put() erneut. Das würde bei "normaler" Verwendung der Funktion nicht auffallen, sondern erst bei unüblichen Fällen wie in Ihrer Befragung. Dies ist, wie gesagt, aber im Moment nur eine Vermutung - das sog. "Speicherleck" kann auch an ganz anderer Stelle im Prozess liegen.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...