Archiv verlassen und diese Seite im Standarddesign anzeigen : Script im Hintergrund starten
Hallo Community
Ich habe ein Problem :o
Die Forum-Suche zu diesem Thema habe ich durch, deswegen habe ich mich entschlossen, zu posten.
Mit exec() und system() funktioniert es nicht wie gewünscht.
Das Problem ist, dass ich ein PHP-Script habe welchen etwas spezielles anstösst. Das dauert jedoch über 30 Sekunden, weswegen das Script abbricht. Zudem ist es dem Benutzer der Site auch nicht zuzumuten, über 30 Sekunden für eine weitere Seite zu warten.
Nun soll das Script im Hintergrund ausgeführt werden und das vom Benutzer aufgerufene Script (PHP) soll einfach die entsprechende Ausgabe machen, OHNE auf das per EXEC gestartete Return-Ergebnis zu warten. Leider funktioniert das nicht :(
<?php
exec("php -f test.php");
echo "<br>Test OK";
?>
test.php führt dabei den Vorgang aus welcher über 30 Sekunden dauert. Jemand eine Idee, was da falsch sein könnte?
Grüsse
binaer
dürfte man fragen, was das script macht, dass es so lange dauert? :D
Sicherlich die falsche Funktion, da exec() bis zum Ende des Aufrufes wartet, da exec() die letzte Zeile der Ausgabe liefert.
Wie du es jetzt besser lösen könntest, fällt mir spontan nicht ein!
Original geschrieben von dani_o
dürfte man fragen, was das script macht, dass es so lange dauert? :D
Es richtet einige DNS-Zonen auf einigen DNS-Servern per rsync ein. Das dauert leider ein wenig.
@Trashar:
danke aber ich weiss auch nicht weiter ;)
Grüsse
binaer
Cron evtl?!
sprich den befehl in der db speichern, per cron die db auslesen, ausführen raus löschen..
so ein wenig wie confixx es handhabt..
mfg
Original geschrieben von Trashar
Cron evtl?!
sprich den befehl in der db speichern, per cron die db auslesen, ausführen raus löschen..
so ein wenig wie confixx es handhabt..
mfg
Daran habe ich auch schon gedacht, möchte das ganze aber schon wenn möglich "realtime" haben. Einen Cron-Job auszuführen... ich weiss nicht.
Gibt es tatsächlich keine Funktion welche es mir ermöglicht, einen Host-Prozess von einem Child zu lösen und unabhängig laufen zu lassen?
Ma ne blöde Frage! :D
Wieso benutzt Du dann nicht AJAX?
Einfach Server-Request nachfragen ... So bekommst Du das Ergebnis im Hintergrund geliefert ...
Original geschrieben von dani_o
Ma ne blöde Frage! :D
Wieso benutzt Du dann nicht AJAX?
Einfach Server-Request nachfragen ... So bekommst Du das Ergebnis im Hintergrund geliefert ...
hab mich damit noch nie befasst :dontknow:
Original geschrieben von binaer
hab mich damit noch nie befasst :dontknow:
ist ganz einfach :D
<script type="text/javascript" >
var g_remoteServer = "Deine.php";
var g_intervalID;
function callServer()
{
var head = document.getElementsByTagName('head').item(0);
var old = document.getElementById('lastLoadedCmds');
if (old) head.removeChild(old);
script = document.createElement('script');
script.src = g_remoteServer;
script.type = 'text/javascript';
script.defer = true;
script.id = 'lastLoadedCmds';
void(head.appendChild(script));
}
g_intervalID = setInterval(callServer,5000);
callServer();
</script>
... führt den Request aus. In diesem Fall aller 5 Sekunden. Ersetze "Deine.php" mit deiner Datei. Nun musst Du ja noch die Ausgabe übergeben. Dazu musst Du erst mal ein Objekt festlegen nehme in der SELBEN DATEI folgendes in den Header:
<SCRIPT LANGUAGE="JavaScript">
<!--
function getObj(name)
{
if (document.getElementById)
{
this.obj = document.getElementById(name);
this.style = document.getElementById(name).style;
}
else if (document.all)
{
this.obj = document.all[name];
this.style = document.all[name].style;
}
else if (document.layers)
{
this.obj = getObjNN4(document,name);
this.style = this.obj;
}
}
function getObjNN4(obj,name)
{
var x = obj.layers;
var foundLayer;
for (var i=0;i<x.length;i++)
{
if (x[i].id == name)
foundLayer = x[i];
else if (x[i].layers.length)
var tmp = getObjNN4(x[i],name);
if (tmp) foundLayer = tmp;
}
return foundLayer;
}
//-->
</SCRIPT>
und füge einen <div>-Layer mit einem Namen ein - Bsp: "Ausgabe". In der test.php übergibst Du dann die Ausgabe folgendermaßen:
var userbox=new getObj('Ausgabe');
userbox.obj.innerHTML="<?=$php_ergebnis?>";
Als Bsp kannst du mal auf http://www.flirtchance.net gehen - wenn Du Dir den chat anschaust, da habe ich dieses Script benutzt und es funzt top!
Ürgs, pures jscript. Wer macht sich denn an sowas noch
die finger schmutzig. Es gibt doch sicher php-wrapper die dir
den entsprechenden code erzeugen oder ? Würde mich
wundern wenn nicht.
greets
Original geschrieben von closure
Ürgs, pures jscript. Wer macht sich denn an sowas noch
die finger schmutzig. Es gibt doch sicher php-wrapper die dir
den entsprechenden code erzeugen oder ? Würde mich
wundern wenn nicht.
greets
o.O
Manchmal kann es auch js sein :D
@dani_o
Besten Dank für's Beispiel.
Hab's nun wie folgt:
test.php
$request = bla(bla);
?>
var userbox=new getObj('Ausgabe');
userbox.obj.innerHTML="<?=$request?>";
und die test2.php (welcher der Kunde aufruft):
<script type="text/javascript" >
var g_remoteServer = "test.php.php";
var g_intervalID;
function callServer()
{
var head = document.getElementsByTagName('head').item(0);
var old = document.getElementById('lastLoadedCmds');
if (old) head.removeChild(old);
script = document.createElement('script');
script.src = g_remoteServer;
script.type = 'text/javascript';
script.defer = true;
script.id = 'lastLoadedCmds';
void(head.appendChild(script));
}
g_intervalID = setInterval(callServer,5000);
callServer();
</script>
<SCRIPT LANGUAGE="JavaScript">
<!--
function getObj(name)
{
if (document.getElementById)
{
this.obj = document.getElementById(name);
this.style = document.getElementById(name).style;
}
else if (document.all)
{
this.obj = document.all[name];
this.style = document.all[name].style;
}
else if (document.layers)
{
this.obj = getObjNN4(document,name);
this.style = this.obj;
}
}
function getObjNN4(obj,name)
{
var x = obj.layers;
var foundLayer;
for (var i=0;i<x.length;i++)
{
if (x[i].id == name)
foundLayer = x[i];
else if (x[i].layers.length)
var tmp = getObjNN4(x[i],name);
if (tmp) foundLayer = tmp;
}
return foundLayer;
}
//-->
</SCRIPT>
<div id="Ausgabe">
Dies ist ein Test
</div>
Leider funktioniert das nicht :(
vermutlich liegts daran, dass ich den Content in die falschen Files gepastet habe?!
In einem kleinem Frame im hintergrund laden?!
in einem Bild?!
Aber bei allen ist das Problem, wie reagiert wird, wenn die Seite vom benutzer geschlossen wird.
@ binaer
Stimmt soweit :D
Probier folgendes:
ersetze mal alle Zeilenumbrüche - dann müsste es funzen. Bsp:
$request = str_replace("\n"," ",bla(bla));
die Ausgabe ist nach wie vor nur:
Dies ist ein Test
Normalerweise sollte ein "relativ grosser" Response kommen.
Edit: sieht danach aus, als werde der DNS-Vorgang gar nicht erst gestartet...
rufe mal pls die test.php auf und code mir die ausgabe ...
Ausgabe test.php:
var userbox=new getObj('Ausgabe'); userbox.obj.innerHTML="";
Original geschrieben von binaer
Ausgabe test.php:
var userbox=new getObj('Ausgabe'); userbox.obj.innerHTML="";
wenn bei userbox.obj.innerHTML=""; nix drinnsteht (siehe "") kann auch nix kommen :D prüfe mal, was in deinem Request ist ... oder schreib mal in den code das so und teste obs ersetzt wird:
userbox.obj.innerHTML="TestInhalt wurde ersetzt";
das WAR die Ausgabe :)
aber ich glaube, Du möchtest den Response von "$request" wissen?!
Versuche den, herauszukitzeln... klappt noch nicht so ganz, melde mich wieder.
Ausgabe von test.php:
Ouch, sorry that username (aaaatest) is taken. Check <filename>
Edit: komplette test.php-Ausgabe:
Ouch, sorry that username (aaaatest) is taken. Check <filename>
Account Creation Complete!!!
var userbox=new getObj('Ausgabe'); userbox.obj.innerHTML="
Ouch, sorry that username (aaaatest) is taken. Check <filename>
Account Creation Complete!!!
";
ist da irgendwo in der Ausgabe ein Zeilenumbruch? Wenn ich das bei mir direkt einfüge, also:
userbox.obj.innerHTML="Ouch, sorry that username (aaaatest) is taken. Check <filename>";
Dann funzt es. Bedenke bitte - es dürfen KEINE Zeilenumbrüche oder " enthalten sein ...
bei mir gehts nicht, auch wenn ich das von Dir gemachte Beispiel
also in test.php:
userbox.obj.innerHTML="Ouch, sorry that username (aaaatest) is taken. Check <filename>";
einfüge. :rolleyes:
Hier hast du mal mein Original - probs ma damit:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<SCRIPT LANGUAGE="JavaScript">
<!--
function getObj(name)
{
if (document.getElementById)
{
this.obj = document.getElementById(name);
this.style = document.getElementById(name).style;
}
else if (document.all)
{
this.obj = document.all[name];
this.style = document.all[name].style;
}
else if (document.layers)
{
this.obj = getObjNN4(document,name);
this.style = this.obj;
}
}
function getObjNN4(obj,name)
{
var x = obj.layers;
var foundLayer;
for (var i=0;i<x.length;i++)
{
if (x[i].id == name)
foundLayer = x[i];
else if (x[i].layers.length)
var tmp = getObjNN4(x[i],name);
if (tmp) foundLayer = tmp;
}
return foundLayer;
}
//-->
</SCRIPT>
<script type="text/javascript" >
var g_remoteServer = "test.php";
var g_intervalID;
function callServer()
{
var head = document.getElementsByTagName('head').item(0);
var old = document.getElementById('lastLoadedCmds');
if (old) head.removeChild(old);
script = document.createElement('script');
script.src = g_remoteServer;
script.type = 'text/javascript';
script.defer = true;
script.id = 'lastLoadedCmds';
void(head.appendChild(script));
}
g_intervalID = setInterval(callServer,5000);
callServer();
</script>
</head>
<body>
<?php
<div id="mydiv">
<div id="Ausgabe" style="overflow:auto;">
</div>
</div>
</body>
</html>
ich glaub das liegt an dem mydiv :D
hab deine test.php schon eingefügt - teste mal und sag obs geht ...
Problem: die Ausgabe des Programms findet in HTML (<table> und ähnliche TAG's statt) und darauf habe ich (leider) keinen Einfluss
Original geschrieben von binaer
Problem: die Ausgabe des Programms findet in HTML (<table> und ähnliche TAG's statt) und darauf habe ich (leider) keinen Einfluss
wieso nicht?
$request = str_replace("\n"," ",$request);
$request = str_replace("\r"," ",$request);
$request = str_replace("\"","",$request);
bevor du die Ausgabe übergibst, kannst Du die doch noch bearbeiten ! :D
in Ordnung, ich werde mich einmal dahinter machen und melde mich wieder...
|
|