Plesk und PHP popen

thor68

New Member
Hi Leute!

Auf WAMP64 nutze ich ich oft PHP EXEC und POPEN. Beides lässt sich annähernd gleich aufrufen. Bei POPEN füge ich lediglich ein "START" mit an.

Was auf WAMP64 so herrlich funktioniert, klappt auf PLESK nicht:

Code:
$hd = popen(pclose(("start " . $command, "r"));

Ich nutze einen virtuellen Server (Windows Server 2019) und besitze als Admin die Rechte am System.

Unter PLESK habe ich leider keine auflösende Einstellung gefunden.

Über die Command Line kann ich den Prozess starten. Über PHP funktioniert es nur mittels EXEC. Es klappt auch nicht, wenn ich den ausführenden Benutzer zur Gruppe der Administratoren hinzufüge. Wer das Script ausführt, habe ich mit exec('whoami'); ermittelt.

Liegt es womöglich daran, dass PLESK "non-thread safe" ist?

Komischer Weise bekomme ich auf PLESK nur dann eine Ressource, wenn ich "START" weglasse. Aber trotz dessen wird das Script nicht ausgeführt. Ich habe das mit file_put_contens geprüft. Am Script selbst kann es nicht liegen, weil es mit EXEC ausgeführt wird und weil es auch über die Command Line funktioniert.

In der php.ini steht nicht, das popen als Funktion gesperrt ist.

Freue mich auf eine konstruktive Antwort.

Gruß Thor
 
$hd = popen(pclose(("start " . $command, "r"));
Der Befehl kann nicht funktionieren. Zum einen werden nicht alle Klammern wieder geschlossen. Korrigiert man die Klammern, übergibst du pclose einen ungültigen Wert (String statt dem Handle, welcher von popen zurückgegeben wird) und pclose übergibt an popen nur den Interger-Wert -1 (Rückgabewerte bei Fehler) - damit führt popen dann "start -1" aus.
 
Mit Plesk hat das nichts zu tun.
Was auf WAMP64 so herrlich funktioniert, klappt auf PLESK nicht:

Code:
$hd = popen(pclose(("start " . $command, "r"));
Bezweifele ich, dass dein Code was sinnvolles macht!
Schau, mein Test in der PHP-Shell auf Windows:
Code:
X:\opt\php\8.1>php -a
Interactive shell

php > $command = "notepad"; $hd = popen(pclose(("start " . $command, "r"));
php (
Da startrt nämlich kein Notepad.
Wenn, dann so:
Code:
 $command = "notepad"; $hd = popen("start " . $command, "r");
Dann startet auch der Windows Editor.
 
Last edited:
Hey, Dankeschön!

Es war spät und am Ende habe ich angefangen zu spinnen! ;-)

Das funktioniert nun:

Code:
$command = '"' . PHP_EXE . '" ' . __DIR__ . "/prozess.php " . $this->expire;

pclose(popen($command, "r"));

Die Lösung war nun folgende:

Der Pfad zur php.exe ist: "c:/Program Files (x86)/Plesk/Additional/PleskPHP80/php.exe"

Den musste ich ich so einschließen: '"' . "Pfad". '"'

Und "start" durfte nicht vor dem Pfad stehen. Bei meinem WAMP-Server ist das aber so.

Die 5 Klammern und dieses lustige Konstrukt: popen(pclose()); waren meiner Übermüdung geschuldet!

Nochmals vielen Dank!

Gruß Thor
 
pclose(popen($command, "r")); Sehr kreativ und experimentell. Befehl über Pipe senden ohne zu prüfen ob es geklappt hat?
Oder verlässt du dich darauf, dass PHP schon irgendwie eine Ausnahme ins Fehlerlog rein donnert? ;-) Oder programmieren PHPler wirklich so geschlampert? SCNR

Also ich hab das damals in den 90ern unter UNIX das Programmieren mit C, Perl, sh, awk & Co. anders gelernt.
Und selbst auf einem Windows-Server sollte man so programmieren, dass es robust ist, und nicht im Eben-mal-kurz-Modus.
 
Last edited:
Back
Top