Hallo WernerK,
genau so ist es - RC=1 kommt auch wenn das Programm nicht gefunden wird. Dann startet der Exec erst gar nicht. Ich habe das jetzt mit meinem IIS und PHP als Fast-CGI mal durchexerziert.
Wo liegt dein 7z.exe oder 7za.exe? Im $zipdownloadfolder? Oder anderswo, und der PATH ist so gesetzt, dass es von der Kommandozeile aus gefunden wird? Als userspezifischer Path? Was gibt
echo "Path: " . getenv("PATH") . "<br>";
aus? ZEIG UNS DAS NICHT! Guck nur, ob der Installationspfad von 7-zip drinsteht - sowohl beim Aufruf über Kommandozeile als auch über Web.
Das ist das erste Problem. In $output musst Du mal zumindest diese oder eine ähnliche Zeile finden:
7-Zip [64] 16.04 : Copyright (c) 1999-2016 Igor Pavlov : 2016-10-04
Wenn 7z nicht im Path ist, dann rufe es mit vollem Pfad zu seinem Installationsordner auf. Bei mir sieht die EXEC-Zeile z.B. so aus:
$a = exec('"C:\Program Files\7-ZIP\7z.exe" a dings *', $result, $ret);
Achte auf die Wahl der Anführungszeichen: Außen die ', innen die ". Die " sind nötig weil der Pfad Leerstellen enthält. Die ' führen dazu, dass Backslashes nicht escaped werden müssen, aber auch dazu, dass PHP-Variablen nicht mehr aufgelöst werden. Wenn Du in den Parametern Variablen brauchst, mach es z.B. so:
$a = exec('"C:\Program Files\7-ZIP\7z.exe"' . "a $target *", $result, $ret);
Das aktuelle Verzeichnis, in dem der exec läuft, ist der Ordner in dem das Script liegt. Dorthin willst Du das ZIP nicht schreiben. Denn dann müsste der PHP-User Schreibrecht auf sein Web haben. Das ist unsicher. Mach den Ordner mit den PDFs vorher mit chdir() zum aktuellen Ordner, und wenn das Zip an noch anderer Stelle liegen soll, gibt seinen Namen inclusive Path an 7zip mit (Anführungszeichen nicht vergessen wenn Leerstellen in Pfad sind und Backslashes nach Bedarf escapen).
Das zweite Problem ist das Schreibrecht auf den Zielordner. Es ist leichtsinnig, auf einem Server Schreibrechte mit der Gießkanne zu verteilen. SYSTEM darf alles, Administratoren auch, alle anderen erstmal GAR NICHTS. Nun wird es spannend - das weitere Vorgehen hängt von der gewählten Authentication ab. Mit PHP wirst Du vermutlich "Anonym" wählen, damit Du PHP-seitig ein Login programmieren kannst. Standardauthentication ist der Browser-Login analog zu .htaccess, und Windows-Authentication ist ein Feature, dass ein Active Directory voraussetzt.
Klicke im IIS Manager auf die Website für dein PHP Script. Doppelklicke rechts im IIS Bereich "Authentifizierung", dann auf "Anonym" und ganz rechts auf Bearbeiten. Dort legst Du fest, mit welcher Windows-Identität der Web-Request durchgeführt wird. Das ist per Default der User "IUSR" - bei allen Webs - und eine ganz schlechte Idee. Wähle Application Pool Identität oder vergib einen eigenen technischen User (den musst Du vorher in der Systemsteuerung anlegen, das ist aber etwas komplizierter. Dieser User soll ja nur für das Web da sein. AppPool Identität ist am einfachsten, und der folgende Absatz setzt das voraus).
Nun kannst Du dem Ordner, in dem das Web liegt, Rechte erteilen. Füge Lese/Ausführen Recht für den User "IIS AppPool\xyz" hinzu. Bei dem Ordner, in dem Gezippt werden soll, machst Du das genauso, aber hier vergibst Du auch "Schreiben" und "Ändern". NICHT "Vollzugriff".
Hoffe, das hilft weiter.
Rolf
sumpsi - posui - clusi