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

Hallo,

ich habe einen Fragebogen erstellt.
Die Struktur ist folgende:
Man landet auf einer Insruktionsseite und wird zufällig einer Versuchsgruppe zugeteilt.
Dann kommt man auf eine Testseite. Diese Testseite wird lädt dann 175 mal neu mit jeweils einer neuen Frage. Welche aus zwei Bildern besteht.
Die Bilder befinden sich auf einem externen Server.

Vor fünf Tagen, hatte die Testung noch funktioniert.
Versuche ich jetzt, den Fragebogen seit gestern mittag zu testen bekomme ich die Fehlermeldung "502 Bad Gateway - nginx/1.17.10"

Versuche ich eine der Testseiten im Debug-Modus zu öffnen bekomme ich die Fehlermeldung:
"Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 106496 bytes) in /var/www/soscisurvey/html/inc/DbQuery.php on line 188 Error message of type 1 seems not to reference eval'd code:
Allowed memory size of 67108864 bytes exhausted (tried to allocate 106496 bytes) in /var/www/soscisurvey/html/inc/DbQuery.php on line 188
Questionnaire Error (page 4)"

Woran kann das liegen?
Muss ich für jede Frage eine eigene Seite erstellen? Oder für jede Versuchsgruppe einen eigenen Fragebogen?

Vielen Dank für die Hilfe

by SoSci Survey (298k points)
Bitte posten Sie den PHP-Code, den Sie verwenden. Danke.
by s117067 (110 points)
Zur Auswahl der Versuchsgruppe diesen:

if (value('SD19') == 1) {
    setNextPage('instA1');
} elseif (value('SD19') == 2) {
    setNextPage('instA2');
} elseif (value('SD19') == 3) {
    setNextPage('instA3');
} elseif (value('SD19') == 4) {
    setNextPage('instA4');
} elseif (value('SD19') == 5) {
    setNextPage('instB1');
} elseif (value('SD19') == 6) {
    setNextPage('instB2');
} elseif (value('SD19') == 7) {
    setNextPage('instB3');
} elseif (value('SD19') == 8) {
    setNextPage('instB4');
} else {
}

Zum durchloopen der Testseite diesen:

if (!isset($fragen2)) {
  $fragen2 = array(  
    'AC01',
    'AD02',
    ....
    'AA09',
    'AA10',  
  );
  shuffle($fragen2);
  registerVariable($fragen2);
}

$i = loopPage(count($fragen2));
question($fragen2[$i]);

1 Answer

0 votes
by SoSci Survey (298k points)

Ich gehe davon aus, dass die beiden PHP-Codes nicht auf derselben Seite stehen?

Das loopPage() kann in dem Fall dazu führen, dass die Seite mit dem ersten PHP-Code jedesmal aufs Neue aufgerufen wird. Dies wiederum führt dazu, dass die Seitenabfolge bei jeder Wiederholung komplett neu gespeichert werden muss. Dies kann bei der großen Anzahl an Wiederholungen dazu führen, dass der Speicher nicht ausreicht.

Worin unterscheiden sich die 8 Seiten für die 8 Versuchsgruppen denn?

by s117067 (110 points)
Okay das ist natürlich problematisch.

Die Seiten unterscheiden sich darin, dass jedes auf jeder Seite unterschiedliche Fragen gezogen werden.
by SoSci Survey (298k points)
Dann erledigen Sie doch die Definition des Arrays $fragen2 einfach im IF-Filter und packen Sie alles auf eine Seite. Das

if (!isset($fragen2))

stellen Sie ganz an den Anfang noch vor den IF-Filter.
by s117067 (110 points)
Das habe ich gemacht, es ergibt allerdings immer noch die selbe Fehlermeldung.
by SoSci Survey (298k points)
Möchten Sie bitte einmal den kompletten PHP-Code posten? Dann werfe ich einen Blick darauf.

Nur zur Sicherheit: Verwenden Sie in Ihren Fragen irgendwo noch die "Datenbank für Inhalte" (z.B. auch in einer erweiterten Auswahl) oder die Funktionen statistic() oder dbGet()?
by s117067 (110 points)
Natürlich!

if (!isset($fragen)) {
    if (value('SD19') == 1) {
        $fragen = array(  
    'AC01',
    ...
    'AA10',  
        );
    } elseif (value('SD19') == 2) {
        $fragen = array(  
    'AC02',
   ...
    'AA10',  
  );
} elseif (value('SD19') == 3) {
    $fragen = array(  
    'AC03',
   ...
    'AA10',  
  );
} elseif (value('SD19') == 4) {
    $fragen = array(  
    'AC04',
   ...
    'AA10',  
  );
} elseif (value('SD19') == 5) {
    $fragen = array(  
    'CQ01',
    ...
    'BB10',  
  );
} elseif (value('SD19') == 6) {
    $fragen = array(  
    'CQ02',
   ...
    'BB10',  
  );
} elseif (value('SD19') == 7) {
    $fragen = array(  
    'CQ03',
    ...
    'BB10',  
  );
} elseif (value('SD19') == 8) {
   $fragen = array(  
    'CQ04',
   ...
    'BB10',  
  );
} else {
}
 shuffle($fragen);
  registerVariable($fragen);
}

$i = loopPage(count($fragen));
question($fragen[$i]);


Das ist jetzt der einzige Code, den ich benutze, allerdings bekomme ich die Fehlermeldung auch, wenn ich versuche eine Seite aufzurufen, auf welche ich nur Fragen eingefügt habe.

Und nein ich benutze keine Datenbank für Inhalte.
by SoSci Survey (298k points)
> allerdings bekomme ich die Fehlermeldung auch, wenn ich versuche eine Seite aufzurufen, auf welche ich nur Fragen eingefügt habe.

Wir sprechen von einer Seite mit anderen Fragen als jenen, die hier in den Listen sind, korrekt?

Aber ich sehe schon, das sollte ich mir mal direkt ansehen. Wären Sie damit einverstanden, wenn ich eine Administrator-Freigabe für das Befragungsprojekt anlege? Wenn ja, dann würde ich Sie bitten, mir die URL des Fragebogens mitzuteilen. Und welche Seite im Fragebogen ich aufrufen kann, um das Problem zu provozieren.
by s117067 (110 points)
> Wir sprechen von einer Seite mit anderen Fragen als jenen, die hier in den Listen sind, korrekt?

ja genau

Das ist kein Problem! Die URL des Fragebogens ist https://www.soscisurvey.de/vislanginfo/?q=Test01
Reicht diese?

Das Problem, tritt auf allen Seiten auf
by SoSci Survey (298k points)
Also 300+ Rubriken und um die 1000 Fragen ist natürlich eine Hausnummer. In diesem Bereich würde ich Probleme nicht generell ausschließen. Allerdings kann ich Sie bisher nicht replizieren:

Wenn ich die Seiten des Fragebogens Test01 direkt aus "Fragebogen zusammenstellen" heraus starte, kommt keine Fehlermeldung. Ist das korrekt?

Ich habe unter "Pretest und Vorschau" auch mal einen Pretest-Link für den Fragebogen "Test01" erstellt und bis in den Loop geklickt - auch dabei keine Fehlermeldung.

Allerdings hatte ich heute Nachmittag auch den Server-Cache geleert. Ich möchte nicht ausschließen, dass das Problem auftritt, wenn der Cache voll ist - wobei das bei einer Frage pro Seite wahrlich kein Problem sein sollte.

Vielleicht könnten Sie mir nochmal beschreiben, wie ich das Problem replizieren kann? Danke!

Ach ja: Im Fragebogen "Test01" habe ich den PHP-Code so geändert, dass ich die letzte elseif-Bedingung zu einem else geändert habe, sodass auch für den Fall, dass in der Variable SD19 nichts steht, die Variable $fragen definiert wird.
by s117067 (110 points)
Also ich habe es gerade auch getestet, da hat tatsächlich zuerst alles funktioniert. Dann habe ich mich versucht durchzudrücken und nach etwa 20 Fragen kam wieder die Bad Gateway Benachrichtigung und jetzt tritt sie auch wieder durchgängig auf.

Vielleicht könnten Sie nochmal reinschauen, ob Sie jetzt auch das Problem haben?
by SoSci Survey (298k points)
Es könnte ein paar Tage dauern, das Problem zu isolieren und zu beheben - Speicherprobleme sind mitunter ein wenig anspruchsvoller, weil sie sich in aller Regel nicht auf einen isolierten Fehler zurückführen lassen, sondern aus dem Zusammenspiel mehrerer ungünstiger Konstellationen entstehen. Aber wir sind dran.
by SoSci Survey (298k points)
Ich habe für die Untersuchung gerade die XML-Datei des Projekts heruntergeladen. Allein diese hat 150 MB. Daraufhin habe ich einen Blick hinein geworfen und gesehen, dass Sie zahlreiche Bilder mittels DATA-URI eingebunden haben (data:image/jpeg;base64,/9j/4AA...).

Der Fragenkatalog ist nicht darauf ausgelegt, größere Datenmengen zu speichern - Bilder sind üblicherweise als Dateien im Projektverzeichnis abgelegt. Ich gehe davon aus, dass hier der Auslöser für den Speicherfehler liegt. Was das für die Lösung des Problems bedeutet, kann ich im Moment noch nicht sagen. Ich melde mich aber heute oder morgen mit Details.
by SoSci Survey (298k points)
edited by SoSci Survey
Ich befürchte, ich muss Ihnen schlechte Nachrichten überbringen: Sie werden Ihren Fragen nicht in der aktuellen Form ins Feld bringen können.

Ich habe das Projekt gerade auf einem Testserver importiert. In Ihren Items haben Sie via Data-URI JPG-Dateien mit einer Größe von mehr als 100 KB abgelegt. Auf www.soscisurvey.de funktioniert das im Moment, weil die maximale Speichergröße für Daten in einem Item vom Standard mit 64 KB angehoben wurde. Und selbst das ist nicht dafür ausgelegt, dass man diese Datenmenge ausnutzt. Bilder sollten als JPG-Dateien unter "Bilder und Mediendateien" hochgeladen und dann anhand des Dateinamens in die Items eingebunden werden.

Wichtig: Womöglich wird Ihre Lösung nach dem Server-Upgrade am 30. Mai 2020 nicht mehr funktionieren. Viele Bilder werden u.U. nicht mehr angezeigt.

Unschönder Nebeneffekt: Ihr Projekt erhöht den Speicherbedarf für unser Datenbank-Backup um fast 80%. Das können wir leider so nicht in Kauf nehmen - denn daran hängen auch Verarbeitungszeiten, die am Ende den kompletten Server ausbremsen.

Ich muss Sie deshalb bitten, die Dateien regulär auf den Server zu laden und die Items entsprechend anzupassen.

Wir werden derweilen eine Sperre einbauen, welche überlange Inhalte in den entsprechenden Feldern verhindert.

Verstehen Sie mich bitte nicht falsch - es geht hier nicht um die Nutzung unseres Servers außerhalb dessen, wofür er ausgelegt war. Das ist prinzipiell klasse und damit ließen sich auch schon viele spannende Forschungsdesign realisieren. Aber im vorliegenden Fall wird leider die Stabilität des Servers durch die technisch ungeeignete Einbindung der Bilder gefährdet. Und dies ist leider ein Problem.

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

...