Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Arno Welzel Newsgroups: de.comp.lang.php Subject: Re: Offene File Handles nach kopieren mit phpseclib3 Date: Fri, 20 Aug 2021 09:47:21 +0200 Lines: 64 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net EZu6s6Kl8T5k0CBEE+A03ACroqeVHMFXUT12Y9hJqqpLngt9Ln Cancel-Lock: sha1:lKZn4q0C5v0C+maPlEPgmviRYqo= In-Reply-To: Xref: csiph.com de.comp.lang.php:4729 Arno Welzel: > Jan Novak: > >> Hallo, >> >> ein primärer php (cli) Prozess forkt immer wieder neu einen Prozess, >> welcher Dateien u.a. mit der "phpseclib3" Klasse von Server a nach b >> kopiert. Leider bleibt nach dem Kopieren immer ein File Handle offen, >> was nach gewisser Zeit Probleme natürlich macht, obwohl der ge'forkte >> Prozess sich sauber beendet hat. >> >> Die einzige Möglichkeit dies zu verhindern, bzw. zu resetten ist im >> Moment, den primären CLI Prozess neu zu starten, was aber in unserem >> Fall andere Nachteile mit sich zieht. >> >> Meine Frage: >> Gibt es ein Möglichkeit, die offenen Handles korrekt schliessen zu lassen? > > Ja, indem der Prozess, der sie öffnet, das korrekt tut. Einen anderen > Weg gibt es nicht. > >> zur Info: Sofern die Dateien mit anderen Klassen z.B. per ftp oder nur >> lokal kopiert werden, besteht das Problem nicht. Nur dann, wenn die >> phpseclib3 benutzt wird. > > Dann nutze phpseclib3 nicht oder frage dort, warum die Handles nicht > sauber schließen und/oder ihre forks nicht sauber abschließen. Nein, > einen geforkten Prozess einfach nur zu beenden, reicht nicht. Der > Aufrufer, der den Fork erstellt hat, muss auch auf dessen Beendigung > reagieren, sonst passieren u.A. genau solche Probleme. Ergänzung dazu: aus einem Projekt, wo ich mit sowas zu tun hatte: protected function signalHandler($signal) { if (SIGCHLD === $signal) { // Clean up child processes $pid = pcntl_waitpid(-1, $status, WNOHANG); while ($pid > 0) { $exitCode = pcntl_wexitstatus($status); $pid = pcntl_waitpid(-1, $status, WNOHANG); } } else { $this->run = false; } } ... if (function_exists('pcntl_signal')) { pcntl_signal(SIGTERM, [$this, 'signalHandler']); pcntl_signal(SIGHUP, [$this, 'signalHandler']); pcntl_signal(SIGINT, [$this, 'signalHandler']); pcntl_signal(SIGCHLD, [$this, 'signalHandler']); } -- Arno Welzel https://arnowelzel.de