Jetzt Mitglied werden
Kostenlos registrieren und die vielen Vorteile der Webmasterpro-Mitgliedschaft nutzen.
Forum - Server
- Webhosting und Webspace
- Betriebssysteme (Windows, Linux, etc.)
- Serveradministration
- Überwachung, Sicherheit und Backups
Info: Der Stern signalisiert, dass neue Beiträge vorhanden sind.
Alle Foren - Übersicht
Portal aktuelle Themen
Design aktuelle Themen
Entwicklung aktuelle Themen
- Markup (HTML, XML, etc.) und CSS
- Skriptsprachen (PHP, Javascript, etc.)
- Datenbanken (SQL)
- CMS und Frameworks
- Flash und ActionScript
Management aktuelle Themen
Über Webmasterpro.de
Das Portal wird betrieben und entwickelt durch die Team23 Agentur. Die Augsbuger Agentur hat sich auf Community Software und die Entwicklung von Webportalen spezialisiert.
Serveradministration - Forum
Derzeit sind Sie als Gast in unserem Forum aktiv. Für das Schreiben registrieren Sie sich bitte. Unser Forum ist eine Austauschplattform für Webworker zum Kommunizieren, Helfen, Informieren und Hilfe finden. Auf der rechten Seiten finden Sie eine Forenübersicht über alle Bereiche des Webmaster-Forums. Unterhalb finden Sie alle aktuellen Themen.
Apache2 u. Windows :: PHP Script wird doppelt ausgeführt
Guten Morgen zusammen,
so langsam drehe ich ein wenig am Rad.
Ich habe seit einigen Stunden das Problem, dass mein Apache-Webserver scheinbar jedes Script gleich 2 mal nacheinander ausführt. Sämtliche SQL-Queries gehen doppelt in / auf die Datenbank.
Woher weiß ich, dass das Skript 2 mal durchläuft und wie äußert sich das?
- Der erste Durchlauf wird komplett an den Browser gesendet und abgeschlossen. Zwischen Client und Server besteht nun keine aktive Kommunikation mehr. Bis zum Abschluss des ersten Durchlaufes sind sämtliche Einträge genau einmal in der Datenbank abgelegt.
- Der zweite Durchlauf (komplett von vorne) läuft (warum auch immer) rein Serverseitig ab. Da das Include-once erneut ausgeführt wird, scheint das Script komplett neu angestoßen zu sein - sämtliche Clientdaten fehlen hier ebenfalls was alles in allem ein weiteres Zeichen für mich ist, dass keinerlei Verbindung zum Client mehr besteht.
---
Ich habe sämtlichen register_shutdown_functions etc. überprüft und bin sogar in der ersten Datei die aufgerufen wird hingegangen und habe ein echo "test"; drauf gelegt und alles andere auskommentiert und auch dies wird 2 mal ausgeführt - beim ersten mal geht alles an den Client und er bekommt den Status 200 gemeldet und das zweite mal läuft rein Serverintern.
Habt ihr eine Idee wodran das liegen kann?
Viele Grüße,
Dominik
Nach einigen weiteren Debugging-Versuchen bin ich schlussendlich zu der Erkenntnis gelangt, dass die .htaccess Verursacher des ganzen übels zu sein scheint.
Ich konnte es dort auf eine Zeile genau lokalisieren:
1 | RewriteRule ^(.*) index.php
|
Nehme ich diese Zeile raus, so läuft das PHP-Skript genau einmal und nicht mehr und nicht weniger.
Nur warum genau macht er das, was er da macht (das er das Skript 2 mal durchlaufen lässt) - bin ich blind und sehe den Fehler in dieser Zeile nicht, oder wo hängt der Wurm? ... und vor allem - wie kann ich das Problem beheben?
Eine Neuinstallation des Servers brachte mich nicht weiter.
Viele Grüße,
Dominik
P.S.: Die gesamte .htaccess sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 | RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/media/
RewriteCond %{REQUEST_URI} !^/css/
RewriteCond %{REQUEST_URI} !^/gfx/
RewriteCond %{REQUEST_URI} !^/js/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*) index.php
|
Mach mal ein [L] hinter die RewriteRule, vielleicht hilft das.
Ansonsten ist es bei deinem Script aktuell so, dass auch eigentlich fehlerhafte 404-Anfragen (z.B. CSS-Dateien, bei denen man sich in dem Ordnernamen vertippt hat, etc..) auf die index.php umgeleitet werden.
Ansonsten ist es bei deinem Script aktuell so, dass auch eigentlich fehlerhafte 404-Anfragen (z.B. CSS-Dateien, bei denen man sich in dem Ordnernamen vertippt hat, etc..) auf die index.php umgeleitet werden.
Heißt: Wenn du z.B. irgendwo ein <img src="datei-die-nicht-existiert" alt="" /> drin hast, dann erklärt das den Effekt. Gilt für alle Elemente die Dateien nachladen, also auch CSS, JS, <iframe> und natürlich auch Dateien, die per CSS geladen werden.
Hallo Jannik, hallo David,
danke für eure Antworten. Ja das ist mir bewusst und auch korrekt so und hatte ich an dieser Stelle bedacht. Jedoch war dies nicht der Auslöser für die doppelte Ausführung des Scriptes.
Immer wenn ich diese Zeile einkommentiert hatte, führte er das Script doppelt aus ... auch als in der auszuführenden Datei nur folgendes drinne stand.
1 2 3 | <?php
echo "test";
?>
|
Die Variante mit dem [L] hatte ich ebenfalls ausprobiert - erfolglos.
Viele Grüße,
Dominik
Hi,
ich habe gerade nur den Anfang überflogen, aber ich hatte vor einiger Zeit dasselbe Problem und hab echt an mir selbst gezweifelt :D
Bei mir lag's daran, dass das CMS-System HTML-Code ausgab, der <img>-Tags enthielt (= 1. Script-Aufruf). Die Referenzen dieser Tags waren teilweise fehlerhaft, sodass dank .htaccess die 404-Seite des CMS' aufgerufen wurde (= 2. Script-Aufruf). Letztendlich wurde das Script dann also bei 1 Browser-Aufruf 2x ausgeführt.
Mir hat hierbei insbesondere das "RewriteLogLevel" geholfen: http://buecher.lingoworld.de/apache2/showdir.php?id=673&o=mod Damit kann man den Server anweisen sämtliche Rewrite-Entscheidungen zu protokollieren sodass man genau sieht warum der wohin weiterleitet.
Hoffe es war nicht alles schon oben erwähnt ;)
VG
Hallo Max,
doch das war es bereits und auch meine letzte Antwort hat nochmal klar dargelegt, dass diese Bedingungen eben nicht gegeben waren. Wie gesagt: selbst als kein anderer Output außer dem einen "echo" erfolgte trat das Phänomen auf.
Die Idee mit dem doppelten Aufrufen aufgrund von IMG, Style oder Javascript-Tags etc. hatte ich in meinen Debuging versuchen berücksichtigt gehabt.
Einfach mal nen Profiler drüberlaufen lassen und nachsehen, was nun wirklich passiert.
Einfach mal nen Profiler drüberlaufen lassen und nachsehen, was nun wirklich passiert.
exakt das, nur zwei mal ... Der Profiler läuft bis zum ende durch und geht dann sofort zum Anfang um erneut anzufangen - habe ich bevor ich den Thread hier erstellt hatte ebenfalls bereits gemacht gehabt - dennoch danke für den Hinweis.
Macht er übrigens auch bei einem expliziten Exit.
exakt das, nur zwei mal ... Der Profiler läuft bis zum ende durch und geht dann sofort zum Anfang um erneut anzufangen - habe ich bevor ich den Thread hier erstellt hatte ebenfalls bereits gemacht gehabt - dennoch danke für den Hinweis.
Hallo Dominik
Ich nehme nicht an, dass du inzwischen eine Lösung hast oder? Denn ich habe exakt das gleiche Problem :-(
Meine Skripte werden zumeist (nicht immer!!) 2 mal aufgerufen. Ich denke aber, dass etwas in meine rewrite rules falsch ist...aber was?
Hier mal mein Code.
Options +FollowSymLinks
RewriteEngine On
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.onomalo\.com$ [NC]
RewriteRule ^(.*)$ http://onomalo.com/$1 [R=301,L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^name-(.+)-(.+)\.html$ ./name.php?buchstabe=$1&limiter=$2 [L]
RewriteRule ^name-(.+)\.html$ ./name.php?buchstabe=$1 [L]
RewriteRule ^(.*)\.html$ ./gedicht.php?url=$1 [L]
</IfModule>
Wenn ich es so mache funktioniert es aber!!!
Options +FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)\.html$ ./gedicht.php?url=$1 [L]
</IfModule>
Ein kleiner Hinweis, da ich nicht weiß, ob dir das bekannt ist:
die RewriteCond gilt nur für die nächste, darauffolgende RewriteRule.
Beispiel: (RC sind RewriteCond, RR heißt RewriteRule)
RC 1
RC 2
RR 1
RR 2
Nun gelten folgende RCs für RR:
RR1: es werden RC1 und RC2 darauf angewandt und werden dadurch "aufgebraucht"
RR2: hat keine direkt davor stehen RCs, d. h. auch keinerlei Beschränkung
Dies könnte, ohne eine genauere Betrachtung, der Fehler sein.
Hallo Jannik
Danke für die Antwort...leider hat das bisher nicht geholfen. Ich habe eine zweite Webseite, auch dort werden alle Skripte 2 mal ausgeführt seitdem ich mod rewrite verwende.
Hier habe ich das so aufgebaut. Die RWCond kommt vor jeder Rule erneut vor. Es funktioniert zwar, aber doc.php wird imemr 2 oder 3 mal durchlaufen
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^www.dokumente-online\.com$ [NC]
RewriteRule ^(.*)$ http://dokumente-online.com/$1 [R=301,L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^www.swopdoc\.com$ [NC]
RewriteRule ^(.*)$ http://swopdoc.com/$1 [R=301,L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ ./doc.php?url=$1 [L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+) /dokumentenliste2.php?wissen=$1&kat=$2&typ=$3&seite=$4 [L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+) /dokumentenliste2.php?wissen=$1&kat=$2&typ=$3 [L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+) /dokumentenliste1.php?wissen=$1&kat=$2 [L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/ /dokumentenliste_wissenschaften.php?wissen=$1 [L]
Hi,
RewriteBase musst du übrigens nicht immer wieder setzen, das gilt übergreifend.
Gibt es ein Anschauungsexemplar online? Vielleicht lässt sich an den Request was sehen.
Also ich habe das Problem umgangen indem ich eine andere Lösung verwendet habe, jedoch interessiert mich halt immer noch, wie dieses Phänomen so zustande kommen kann.
1 2 3 4 5 6 7 8 9 10 11 12 13 | RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/media/
RewriteCond %{REQUEST_URI} !^/css/
RewriteCond %{REQUEST_URI} !^/gfx/
RewriteCond %{REQUEST_URI} !^/js/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule !\.(xml|ico|txt)$ index.php
|
Viele Grüße,
Dominik
Um mich gleich für meine Dummheit zu entschuldigen mal eine Antwort...
Meine Skripts wurden alle 2 mal hintereinander ausgeführt, da ich google adsense verwende.. :-\ Ich habe daran überhaupt nicht mehr gedacht. Der Adsense code lädt die Seite natürlich sofort nochmal und analysiert den Inhalt auf seinem Server. Das macht ganz schön Traffic...
Aus irgendeinem Grund dachte ich das kommt von den rewrite rules, die Stimmen aber alle... so falsch kann man liegen.


