php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 08-11-2008, 00:02
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Red face shell_exec unter Windows im Hintergrund ausführen geht nicht ...

Hallo zusammen,

ich habe folgendes Problem:

------------------------------------------------------------------------------------------------
Mein System:
------------------------------------------------------------------------------------------------
- Windows XP Pro
- XAMPP für Windows Version 1.6.8
- Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8i mod_autoindex_color PHP/5.2.6

Safe_mod = Off (php.ini)
-----------------------------------------------------------------------------------------------


Ich habe einen Skript in PHP geschrieben. In diesem Skript lasse ich per Shell_exec eine EXE mit entsprechenden Parametern der EXE ausführen. Shell geht wunderbar durch und die Anwendung erzeugt Dateien wie es sein sollte.

Mein Problem ist, daß die Generierung der Dateien etwas länger dauert und deshalb wird der Rest des Skripts nicht eher ausgeführt bis die shell_exec() ganz durch ist und somit wird die Seite erst danach aufgebaut.
Deshalb würde ich gerne die Shell_exec() im Hintergrund ausführen, so daß der Skript ohne Verzögerung weiter ausgeführt wird und nicht auf das Ergebnis vom Shell_exec() wartet.

Dazu habe ich viel im Internet und auch hier im Forum recherchiert aber leider keine Antwort gefunden, die mein Problem lösen konnte.

Meine Versuche:
Ich habe bisher folgendes versucht ohne Erfolg:
PHP-Code:
shell_exec("ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"); 
Das ganze habe ich auch mit exec() und System() versucht - leider ohne Erfolg.
Da ich in den Foren gelesen habe, daß man mit "&" und Umleitung von Shell_exec Ergebnis in eine Datei den Prozess in den Hintergrund schieben kann, habe ich auch folgendes versucht - aber wie immer ohn Erfolg:
PHP-Code:
shell_exec("ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf > test.txt &"); 
Hat damit jemand Erfahrung unter Windows gemacht? Wie könnte man denn dieses Problem lösen?

Danke vorab für jede Hilfe

Gruß
Otto
Mit Zitat antworten
  #2 (permalink)  
Alt 08-11-2008, 01:53
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Mit den proc_* -Funktionen kannst du Prozesse parallel laufen lassen. Einfach mal im Manual blättern.
Mit Zitat antworten
  #3 (permalink)  
Alt 08-11-2008, 13:18
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
Da ich in den Foren gelesen habe, daß man mit "&" und Umleitung von Shell_exec Ergebnis in eine Datei den Prozess in den Hintergrund schieben kann, habe ich auch folgendes versucht - aber wie immer ohn Erfolg:
Weil du nur halb gelesen hast..
Das gilt für eine Linux/Unix Shell. Und die gibts eben unter Win nur selten.

Wenn du unter Win Prozesse in den Hintergrund schieben willst, verwende "start". Was aber bestimmte Rechte voraussetzt. Und das Beenden des Prozeses kann ein Problem werden. "start" hinterläßt keinen Haken, mit dem man den Prozess später noch aus PHP erreichen könnte.

Grundsätzlich:
Langlaufenden Prozesse haben im Webserverumfeld nichts zu suchen. Es greifen einfach zu viele Timeouts. Diese alle abzuschalten/verlängern ist meist am falschen Ende angefangen. Auch die Rechte des Webservers so weit auszudehnen ist relativ unklug.

Bau dir ein Kommandozeilen Programm oder Dienst, welches den Job erledigt.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #4 (permalink)  
Alt 08-11-2008, 13:45
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo zusammen,

danke erstmal für die Tipps.

@PHP-Desaster
Ich habe mir die proc_* -Funktionen kurz angeschaut, sie scheinen mir etwas komplizierter zu sein, aber ich werde mich damit näher beschäftigen und dann melde ich mich nochmal.

Zitat:
Original geschrieben von combie
Grundsätzlich:
Langlaufenden Prozesse haben im Webserverumfeld nichts zu suchen. ...
Mein Vorhaben kurz beschrieben ist folgendes: Ich möchte im Intranet eine Seite aufbauen, wo Besucher dieser Seite sich bestimmte Daten zusammenstellen und anschließend daraus eine PDF generieren - also die PDF soll dynamisch zur Laufzeit vom Anwender selbst generiert werden. Wie es auch im Internet bei vielen Seiten der Fall ist.

Wie soll ich es denn vom Webserverumfeld loslösen?

Zitat:
Original geschrieben von combie
Bau dir ein Kommandozeilen Programm oder Dienst, welches den Job erledigt.
Da gibt es doch schon das Kommandozeilen Programm "ibex" (PDF Generator), das ich in meinem PHP-Code über shell_exec() bediene. Oder meinst du was anderes?

Wie gesagt, ich muss den Anwendern über Web die Möglichkeit geben, sich Daten zusammenzustellen und daraus PDF zu generieren.

Habt ihr evtl. Tipps und Rat für mich?

Danke nochmal
Gruß
Otto
Mit Zitat antworten
  #5 (permalink)  
Alt 08-11-2008, 14:20
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Hast du es denn schon mit "start" probiert?
__________________
Wir werden alle sterben
Mit Zitat antworten
  #6 (permalink)  
Alt 08-11-2008, 14:38
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ok, wenn du den Prozess lediglich anstoßen willst, ohne auf die Beendigung zu warten, dann sind die proc_*-Funktionen vielleicht doch nicht so richtig. Dann doch mit & unter Unix bzw. mit start unter Windows.
Die proc_*-Funktionen sind mehr, als ein einfaches anstoßen von Prozessen, bieten unter anderem aber auch die Möglichkeit, den angestoßenen Prozess parallel laufen zu lassen.
Mit Zitat antworten
  #7 (permalink)  
Alt 08-11-2008, 20:00
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

@combie
entschuldige bitte, daß ich es vergessen habe auf "start" einzugehen.
Wie verwende ich denn "start"?
Im Internet finde ich nix darüber. Selbst im SelfPHP und im PHP.net finde ich keine derartige Funktion. Da gibt es "stat" aber nicht "start"!

Ich habe es blind so versucht und bekomme Fehlermeldung.
1. Versuch:
PHP-Code:
start "ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"
Code:
Parse error: syntax error, unexpected T_VARIABLE in ....
2. Versuch:
PHP-Code:
start ("ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"); 
Code:
Fatal error: Call to undefined function start()
@PHP-Desaster
proc_* Funktionen werde ich auch mal auf jeden Fall testen, um sie einfach näher kennen zu lernen.

[EDIT]
Ok. Ich denke "start" habe ich jetzt verstanden. "start" soll vor dem DOS-Befehl platziert werden.
PHP-Code:
shell_exec("start ibex.exe -logfile ibex.log -xsl hello.xsl hello.xml hello.pdf"
Gruß
Otto

Geändert von otto-mueller (08-11-2008 um 20:13 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 08-11-2008, 20:49
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo nochmal,

so jetzt habe ich auch start getestet:
Mein shell_exec() geht mit "start" nicht durch - das Aktualisierungssymbol von Firefox dreht sich die ganze Zeit aber es passiert nichts.
Kann es mit den angesprochenen "besonderen Rechten" zu tun haben?
Wenn ja, wo und was soll man ändern?

Gruß
Otto
Mit Zitat antworten
  #9 (permalink)  
Alt 11-11-2008, 21:14
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo zusammen,

so - jetzt geht "start" durch, aber ich stelle keine Verbesserung gegenüber von ohne "start". Der Code geht erst durch, wenn shell_exec() oder exec() oder system() durch ist.

Habt ihr eine andere Lösung für mich oder soll ich mich mit proc_* Funktionen beschäftigen?

Danke nochmal

Gruß
Otto
Mit Zitat antworten
  #10 (permalink)  
Alt 12-11-2008, 08:30
hhcm
 PHP Senior
Links : Onlinestatus : hhcm ist offline
Registriert seit: Jun 2005
Ort: Viersen, NRW
Beiträge: 1.833
hhcm ist zur Zeit noch ein unbeschriebenes Blatt
hhcm eine Nachricht über ICQ schicken hhcm eine Nachricht über Skype™ schicken
Standard

Zitat:
Original geschrieben von otto-mueller
Wie soll ich es denn vom Webserverumfeld loslösen?
Wie wäre es mit der PDFLib?
__________________
gruss Chris

Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."
Mit Zitat antworten
  #11 (permalink)  
Alt 13-11-2008, 22:06
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Question

Hallo,

PDFLib und fpdf habe ich mir auch angeschaut - die muss man doch auch in PHP einbinden.
Ich verstehe immer noch nicht, wie ich die PDF-Generierung vom Webserverumfeld abkuppeln soll

Meine ursprüngliche Frage ist leider immer noch offen: wie kann ich denn den Prozess in den Hintergrund schieben, so daß PHP weiter läuft und nicht auf das Ende des (shell_exec o. a. ) Prozesses wartet.

Gruß
Otto
Mit Zitat antworten
  #12 (permalink)  
Alt 13-11-2008, 22:49
krel
 Registrierter Benutzer
Links : Onlinestatus : krel ist offline
Registriert seit: Nov 2006
Ort: Osnabrück
Beiträge: 424
krel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hatte das mal das gleiche Problem, da hat leider nichts geholfen, hab es im Enddefekt so gelöst, dass ich einfach nen Ajax-Request gestartet habe, der ne PHP Datei aufruft, die wiederrum das exec startet.
Ist recht quick and dirty aber es funktioniert..
Mit Zitat antworten
  #13 (permalink)  
Alt 13-11-2008, 23:17
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von otto-mueller

Meine ursprüngliche Frage ist leider immer noch offen: wie kann ich denn den Prozess in den Hintergrund schieben, so daß PHP weiter läuft und nicht auf das Ende des (shell_exec o. a. ) Prozesses wartet.
PDFLib ist recht schnell, ich glaube nicht, dass es solange braucht, versuch doch mal.

Oder du schreibst einen Windowsdienst, der ein Verzeichnis überwacht, und sobald du von PHP irgendwas darein schiebst, fängt der Dienst an PDF zu erzeugen und in ein Zielverzeichnis ablegt. Der Dienst kann ohne weiteres ibex.exe aufrufen und sogar auf das Ende von ibex.exe warten und ggf. killen, wenn es mal sein muss. Somit hast du überhaupt keine Sorgen über Leichen im Taskmanager.
Mit Zitat antworten
  #14 (permalink)  
Alt 14-11-2008, 16:03
otto-mueller
 Newbie
Links : Onlinestatus : otto-mueller ist offline
Registriert seit: May 2003
Beiträge: 87
otto-mueller ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo zusammen,

@krel
ich werde das mit Ajax-Request probieren, aber wie du es auch bereits erwähnt hast, ist die Lösung doch etwas krückenhaft. Aber wenn es funktioniert ist es auch wunderbar.

@asp2php
Das hört sich sehr genial an, ich wäre nicht drauf gekommen. Wahrscheinlich meinte "combie" auch dasselbe mit "Langlaufenden Prozesse haben im Webserverumfeld nichts zu suchen. ..."

Ich danke euch allen bisher vielmals. Die bisherigen Tipps und Ansätze werde ich mal in aller Ruhe studieren und versuche sie umzusetzen, dann werde ich mich nochmal melden.

Bis dann

Gruß
Otto
Mit Zitat antworten
  #15 (permalink)  
Alt 14-11-2008, 16:06
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Unter .NET C# ist so ein Dienst ein Kinderspiel; das ist in weniger als einer Stunde geschrieben und für deinen Zweck am ehesten geeignet.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:11 Uhr.