Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Script im Hintergrund starten [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Script im Hintergrund starten


 
binaer
07-09-2006, 10:20 
 
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

 
dani_o
07-09-2006, 10:36 
 
dürfte man fragen, was das script macht, dass es so lange dauert? :D

 
Trashar
07-09-2006, 10:40 
 
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!

 
binaer
07-09-2006, 10:48 
 
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

 
Trashar
07-09-2006, 10:49 
 
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

 
binaer
07-09-2006, 10:51 
 
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?

 
dani_o
07-09-2006, 10:56 
 
Ma ne blöde Frage! :D
Wieso benutzt Du dann nicht AJAX?
Einfach Server-Request nachfragen ... So bekommst Du das Ergebnis im Hintergrund geliefert ...

 
binaer
07-09-2006, 11:01 
 
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:

 
dani_o
07-09-2006, 11:10 
 
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?>";

 
dani_o
07-09-2006, 11:13 
 
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!

 
closure
07-09-2006, 11:15 
 
Ü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

 
dani_o
07-09-2006, 11:17 
 
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

 
binaer
07-09-2006, 11:22 
 
@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?!

 
Trashar
07-09-2006, 11:22 
 
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.

 
dani_o
07-09-2006, 11:25 
 
@ binaer

Stimmt soweit :D
Probier folgendes:

ersetze mal alle Zeilenumbrüche - dann müsste es funzen. Bsp:


$request = str_replace("\n"," ",bla(bla));

 
binaer
07-09-2006, 11:32 
 
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...

 
dani_o
07-09-2006, 11:33 
 
rufe mal pls die test.php auf und code mir die ausgabe ...

 
binaer
07-09-2006, 11:36 
 
Ausgabe test.php:
var userbox=new getObj('Ausgabe'); userbox.obj.innerHTML="";

 
dani_o
07-09-2006, 11:37 
 
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";

 
binaer
07-09-2006, 11:46 
 
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.

 
binaer
07-09-2006, 11:57 
 
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!!!
";

 
dani_o
07-09-2006, 12:01 
 
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 ...

 
binaer
07-09-2006, 12:09 
 
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:

 
dani_o
07-09-2006, 12:14 
 
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 ...

 
binaer
07-09-2006, 12:20 
 
Problem: die Ausgabe des Programms findet in HTML (<table> und ähnliche TAG's statt) und darauf habe ich (leider) keinen Einfluss

 
dani_o
07-09-2006, 12:22 
 
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

 
binaer
07-09-2006, 12:26 
 
in Ordnung, ich werde mich einmal dahinter machen und melde mich wieder...


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:20 Uhr.