php / php/php-src

Running a shell command

Offen
#12,520 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Feature Status: Needs Triage
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.2k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

There's a handful of ways to run a command in PHP - I have to look this up every single time, and every time, I end up reaching the conclusion that none of them are exactly good.

The most common, most basic requirement is you just want to run a command, capture the output, and get the exit status code - it appears there is still no simple way to achieve this in PHP.

  • shell_exec can't reliably detect failures, doesn't return the status code, fails for binary output on Windows 👎

  • system only returns the last line of the command output. 👎

  • pcntl_exec is not available on Windows 👎

  • popen requires some hand holding and leads to bugs 👎

  • proc_open requires even more hand holding and is difficult just to get it working at all 👎

  • passthru requires an output buffer, which may be slightly less error prone than other options, but still 👎

  • exec opens a command window (on Windows only?) 👎

Finally, there's the backtick operator, which, having dedicated syntax, seems like the most obvious option - but turns out to be an alias for shell_exec, being one of the worst options overall.

Of all these options, exec probably comes closest to fulfilling the most basic requirements - yet still falls short by opening a command window on Windows; behavior that is (I'm sure, for some historical reason) inconsistent with that of Linux.

Rather than suggesting we add yet another function to run a command, how about fixing this issue with exec?

Yes, that is technically a breaking change, but do we imagine anyone is writing Windows-specific PHP programs that rely on opening command windows, expecting interaction from the user? This seems highly unlikely.

I think it would be really great if this situation could finally be remedied, so that just running a simple command is simple and "feature-complete" with no cross-platform quirks - this should not be something that requires any mental gymnastics, and it should be extremely obvious and easy to find in the manual, e.g. with an opening note on every other manual page for all these other functions.

I'm not going to suggest deprecating any of these functions, as they are most likely all being used for something.

But wouldn't it be great if there was one clear choice going forward that "just works" for the 98% use case? 🙂

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Überprüfe das Verhalten und die Dokumentation von exec zusammen mit shell_exec, system, pcntl_exec, popen, proc_open, passthru und backticks, insbesondere im Hinblick auf das hier beschriebene Verhalten des Windows-Befehlsfensters. Vergleiche die bestehenden Anforderungen an Ausgabe und Exit-Status unter Windows und Linux; abgeschlossen ist die Aufgabe, wenn das vorgeschlagene Verhalten von exec und seine Auswirkungen auf die Kompatibilität eindeutig geklärt sind.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
php
Bereich
cli
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.