Mailinglist Archive: opensuse-programming-de (86 mails)

< Previous Next >
Aufruf eines PHP-Scriptes aus PHP führt zu Chaos
  • From: Bodo Kaelberer <BodoKaelberer@xxxxxxxxxx>
  • Date: Sat, 26 Feb 2005 18:07:35 +0100
  • Message-id: <16011830679.20050226180735@xxxxxxxxxx>
Hallo

Systemumgebung:
PHP: 4.3.10, safe_mode aus. Wahrscheinlich als Modul.
Apache: Apache/1.3.29 (Unix)
OS: Irgendein Linux (dedicated Server bei Schlund)

Aufgaben:
Ich will aus einem PHP-Script A heraus mittels exec() ein PHP-Script B
aufrufen, welches im Hintergrund eine längere Aufgabe durchführt.

Problem:
Was unter Windows funktioniert, geht unter Linux (mit entsprechend
angepaßter Anweisung) gänzlich daneben: Dort wird nicht B aufgerufen,
sondern es wird wieder und wieder, offenbar endlos, A aufgerufen. Ich
habe mal den Code aufs nötigste reduziert. Dann sehen die Scripte
folgendermassen aus:

=========== Script test_caller.php (=A) =========================
<?

$fileOutput = time().'.txt';

$command = "/usr/local/bin/php test_called.php > $fileOutput &";

exec( $command );

?>
=================================================================

=========== Script test_called.php (=B) =========================
<?

print "Bin da.";

?>
=================================================================

Wird Sript A ausgeführt, dann sollte eigentlich eine Datei mit
irgendeiner hohen Zahl im Namen und der Endung .txt erzeugt werden und
diese sollte als Inhalt den Text "Bin da." enthalten.

So passiert es auch, wenn ich A in einer SSH-Shell (Bash) ausführe.

Wird A aber übers Netz durch einen Browser aufgerufen, so passiert
etwas ganz anderes:
Es werden endlos entsprechende <ZEIT>.txt-Dateien erzeugt, die als
Inhalt alle die Aushabe von Script A haben.
Da passieren also gleich zwei Dinge, die nicht passieren sollten:
1. Enthält die Ziel-Datei nicht die Ausgabe von B, sondern die von
A.
2. Wird A aus irgendeinem Grund endlos neu aufgerufen und erzeugt
dabei endlos neue Dateien. Ein bisschen so, als würde jemand im
Browser ganz schnell reload drücken (mal abgesehen von Punkt 1.),
aber im Browser passiert nichts und es läuft auch noch weiter,
wenn ich ihn beende.

Es macht ganz den Eindruck, als würde durch exec() nicht Script B
aufgerufen werden, sondern erneut A und dann wieder und wieder... bis
ich das Script lösche.
Einen Fehler im Code schliesse ich aus, da es in der Shell
funktioniert.

Ohne Umleitung der Ausgabe in eine Datei oder ohne & passiert tritt
übrigens dasselbe Problem aus.

Ich habe auch schon versucht, aus A heraus nicht B direkt aufzurufen,
sondern ein Batch-Programm (sagt man das unter Linux?), welches
wiederum B aufruft. Das Problem bleibt unverändert erhalten.

Rufe ich statt des Scripts B aus A heraus ein Systemkommando auf,,
z.B. ls, passiert nichts unerwartetes.


Ich denke also, dass hat etwas mit der Umgebung, also Linux, Apache
oder PHP zu tun. Es ist sogar so, dass Script A auch beim x-ten Aufruf
noch die Daten hat, die es beim Aufruf vom Browser bekommen hat, z.B.
den Referer. Also irgendein Nebeneffekt der ausführenden Shell scheint
es auch nicht zu sein.


Kann mir jemand einen Tipp geben oder mal nachprüfen, ob das Problem
so auch mit anderen Systemen auftritt - mir steht kein anderes Linux
zur Verfügung.


Tschüssi

--
1 Bodo Kaelberer
123 http://www.webkind.de/ http://www.kaelberer-aio.de/
3 Seelig sind die, die da arm an Geist sind, denn sie werden
4 sich Christlich Soziale Union nennen.


< Previous Next >
This Thread
  • No further messages