Ich habe eine Dienstprogrammfunktion, die zum Ausführen eines Programms über CLI (cmd, bash usw.) verwendet wird. Es gibt ein Array mit 3 Elementen zurück: STDOUT
, STDERR
und EXIT CODE
.
Bis jetzt funktioniert es gut ohne Probleme. In der Tat, das Problem, das ich damit habe, behindert nicht wirklich seine Funktionalität, aber ich bin besorgt über die Leistung.
Das Problem ist, dass PHP in bestimmten Fällen den gleichen Befehl mehrfach ausführt (in meinem Fall dreimal), auch wenn es nur einmal ausgeführt werden sollte.
%Vor%Beachten Sie die kommentierte Zeile (Zeile 9). Das war zum Testen. Ich habe es aktiviert, um sicherzustellen, dass das Zielprogramm nur einmal ausgeführt wird (ich dachte, dass mein Code die gleiche Funktion irgendwie aufrufen könnte). Aber selbst mit aktivierter Leitung lief das Programm noch mehrmals.
Wie es ist, habe ich 2 Stellen in meinem Code, wo ich das gleiche Programm (zu verschiedenen Anlässen) ausführe. Die Befehlszeile ist für beide gleich.
Einmal jedoch wird das Programm einmal ausgeführt, während PHP dreimal das Programm ausführt.
Ich habe dieses Verhalten unter Process Explorer beobachtet und beobachtet. Ich benutze Windows 7 x64. Das Programm ist 32 Bit, wie auch PHP.
Bearbeiten: Das betreffende Programm wurde speziell entwickelt und es werden keine neuen Prozesse geöffnet.
Ihr Code zum Testen, dass er nur einmal ausgeführt wird, sieht fehlerhaft aus.
Wenn Sie 2 PHP-Prozesse laufen haben, teilen sie sich keine statische Variable. Es könnte also möglich sein, dass Sie gleichzeitige Anfragen haben, die dazu führen, dass dies mehr als einmal ausgeführt wird.
Zweitens sollten Sie am Ende der Funktion $once
auf false setzen, sonst wird nie die
erreicht.
Versuchen Sie, eine Protokollierung hinzuzufügen, um zu sehen, ob die Funktion zweimal aufgerufen wird.
Erstellen Sie einige Einheits- / Stresstests, die nur die externe Anwendung ausführen. Wenn Sie mehrere Prozesse sehen, dann ist etwas mit Ihrer App falsch, nicht der PHP-Code.
Es ist sehr seltsam. Und es ist sehr schwer, ohne den vollständigen Code herauszufinden.
Wenn Sie betonen, dass Ihr Server mehrmals dieselbe Seite aufruft, ist es wahrscheinlich am besten mit dem CPU-Round-Robin-Prozess verbunden. Die PHP hat keine Zeit, um die statische Variable auf false zu setzen, da gleichzeitig eine weitere Anfrage an diese Methode besteht. Eine andere Möglichkeit ist, dass PHP den statischen Wert nicht korrekt isolieren kann und die unterschiedliche Anfrage an diese Methode unterschiedliche Speicherpositionen lesen kann, bis die PHP die Werte sinchronisiert.
Ich weiß, dass dies vielleicht nicht die beste Option ist, aber das habe ich getan. Obwohl dies unter Linux war, bin ich mir sicher, dass es eine Möglichkeit gibt, dies auf Windows zu portieren.
Was ich getan habe, war pgrep auszuführen und zu prüfen, ob es bereits einen solchen Befehl gab und ob er einfach beendet wurde. Wie Sie bereits sagten, führen Sie denselben Befehl (mit genauen Parametern) aus, also prüfen Sie einfach, ob bereits ein Befehl ausgeführt wird und handeln Sie jeweils.
Ich habe diesen Befehl verwendet:
%Vor%Tags und Links php windows command-line-interface proc-open k2f