Ich habe ein PHP-Skript in den Werken, die ein Job-Arbeiter ist seine Hauptaufgabe ist es, eine Datenbank-Tabelle für neue Jobs zu überprüfen, und wenn es irgendwelche, auf sie zu handeln. Aber Jobs werden in Bursts kommen, mit langen Lücken dazwischen, also habe ich einen Schlafzyklus entworfen wie: Gut, aber in manchen Fällen bedeutet das, dass es eine 30-Sekunden-Verzögerung geben kann, bevor ein neuer Job gehandelt wird. Da ist dies ein Dämon-Skript, ich dachte, Id versuchen, die pcntlsignal Haken, um ein SIGUSR1 Signal zu fangen, um das Skript zu wecken, wie: Ich brach den Schlaf (30) bis in kleinere Schlaf-Bits, falls ein Signal nicht unterbrechen einen Schlaf () Befehl, denke, dass dies höchstens eine Verzögerung von einer Sekunde verursachen würde, aber in der Log-Datei, Im sehen, dass die SIGUSR1 nicht gefangen wird, bis nach der vollen 30 Sekunden vergangen ist (und vielleicht die äußere während Schleife zurückgesetzt). Ich fand den Befehl pcntlsignaldispatch, aber das ist nur für PHP 5.3 und höher. Wenn ich diese Version verwende, konnte ich einen Anruf an diesen Befehl halten, bevor der if (isAwake) Anruf, aber wie es derzeit steht Im auf 5.2.13. Auf welche Art von Situationen ist die Signal-Warteschlange interpretiert in PHP-Versionen ohne die Mittel, um explizit anrufen die Warteschlange Parsing Könnte ich in einem anderen nutzlosen Befehl in dieser Schlaf-Schleife, die eine Signal-Warteschlange Parse innerhalb dort gefragt würde, fragte am 29. April 10 um 18: 42 hakre 138k 9679 26 9679 232 9679 422 Mein eigenes Problem behoben: Die Antwort ist die Zeckenerklärung. Ich hatte, als Teil der Daemon-Prozess-Startup die Deklaration (ticks1) Aktion, aber es war nicht scheinen, um das Haupt-Skript (da war in einer Funktion, in einer Include-Datei. Hinzufügen einer deklarierten (ticks1) Zeile vor Die while (true) Schleife verursacht Signale sofort durchlaufen (dh der Schlaf (1) Befehl verursacht ein Häkchen, also nach dem Aufwachen aus dem Schlaf, werden die Signale verarbeitet). Beantwortet Apr 29 10 at 19: 11Forex Signal System Script Ich brauche ein Forex-Signal-System-Skript PHP nur Der Coder muss klonen, was ist Angebot auf dieser Website: URL entfernt, Login zu sehen und Mitgliederbereich und Forex-Siganl-Tools Die ausgewählten Coder sollten über diese Art von Skript oder diese URL entfernt, Login, um Website zu sehen wissen Es ist sehr beliebt, nur Coder, die bereits erfolgreich erstellt Forex Signalsystem script039s müssen zu bieten Fähigkeiten erforderlich, um etwas Geld zu machen Setzen Sie Ihr Budget und den Zeitrahmen Umreißen Sie Ihren Vorschlag Get bezahlt für Ihre Arbeit Hire Freelancer, die auch auf dieses Projekt suchen Auf der Suche nach Arbeit Arbeit an Projekten wie diese und Geld von zu Hause aus Forex Signal System Skript Forbes Die New York Times Zeit Wall Street Journal Times Online Total Jobs Posted Get in Kontakt Freelancer Freelancer reg ist ein eingetragenes Warenzeichen der Freelancer Technology Pty Limited (ACN 142 189 759) Copyright Kopie 2017 Freelancer Technologie Pty Limited (ACN 142 189 759) Fang Signale in PHP-Skripte Warum sollte man jemals schreiben Skripte in Bash, wenn Sie schreiben können, so gut in PHP Immer wenn ein schnelles Skript benötigt wird, verwende ich oft meine PHP-Fähigkeiten, um die zu lösen Problem. Oft mit leistungsfähigen Befehlen wie 8220pregmatchall 8221 und 8220pregreplacecallback 8220. Today8217s Blog zeigt Ihnen, wie Sie Ihr PHP-Skript ausführen, das zweimal ausgeführt wird, indem Sie eine 8220pid8221 Datei verwenden. Es zeigt auch, wie man mit Signalen (wie Ctrl-C-Tastenpressen) anmutig umgehen kann. Es erklärt, wie Sie einen Signal-Handler definieren können, der einige 8220clean up8221 Anrufe ausführen kann. Zuerst werde ich Ihnen zeigen, wie man die 8220shebang8221 Linie benutzt, um eine reguläre PHP-Datei in ein Bash-ähnliches Skript umzuwandeln. Eine Shebang-Linie (die auch als Hashhang, Hashing, Pound Bang oder Crunchbang bekannt ist) ist die erste Zeile eines Text-Skripts, die nix-Betriebssysteme mitteilt, die das Skript verwenden, um das Skript auszuführen. 8212 electrictoolbox auf php-shebang Hinzufügen einer Shebang ist einfach, wie Hinzufügen einer ersten Zeile mit dem Inhalt 8220usrbinphp8221 zu Ihrem Skript wie folgt: Jetzt in der Lage sein, um Ihre 8220script. php8221 Datei ausführen müssen wir es ausführbar machen, indem Sie 8220chmod 755 script. php8221 Auf der Kommandozeile. Der untenstehende Code zeigt die Verwendung von 8220pcntlsignal 8221, um einen benutzerdefinierten Signalhandler zu definieren. Beachten Sie, dass es absolut erforderlich ist (und nicht sehr gut dokumentiert), dass Sie 8220declare (ticks 1) 8221 in der Oberseite der Datei setzen. Andernfalls werden die Signalhandler nicht angerufen. Der untenstehende Code zeigt auch, wie man versucht, eine Sperre für eine Datei zu erwerben, ohne sie zu verkürzen (indem sie die Option 8216c8217 verwendet) und dann abschneiden, nachdem die Sperre erfolgreich erworben wurde. Es zeigt auch, wie die 8216pid8217-Datei abgeschnitten wird, wenn der Prozess aufgrund eines Signals beendet wird. Beachten Sie, dass das Signal 8220KILL8221, das gesendet wird, wenn ein Prozess mit dem Befehl 8220kill -98221 getötet wird, nicht gefangen werden kann. In OOP kann die Funktion 8216signalHandler8217 eine Methode eines Objekts sein. In einem solchen Fall kann man mit einem Array mit dem Verweis auf das Objekt als erstes Element und dem Methodennamen als zweites Element (siehe Callbacks) bezeichnet werden. Im OOP-Fall müssen Sie sicherstellen, dass Sie den pidFile-Wert auf den GLOBALS superglobal mit 8220GLOBALS8216pidfile8217pidFile8221 speichern, um den GC-Effekt zu vermeiden. Der GC referenziert, und wenn die Methode beendet ist, kann die Referenzzählung zum Inhalt von pidFile null sein und in diesem Fall wird die Datei automatisch geschlossen, wodurch die Sperre freigegeben wird. Wenn Sie sich weiter für PHP und Sperren interessieren, finden Sie einige interessante PHP-Code in der WordPress GPL-ed, aber veraltet, gesperrt Umsetzung. 3 Gedanken auf ldquoCatching Signale in PHP scriptsrdquopcntlsignal Einige seltsame Signal Wechselwirkungen gehen hier. Ich laufe PHP 4.3.9. Sleep () Anrufe scheinen unterbrochen zu werden, wenn irgendein Signal vom PHP-Skript empfangen wird. Aber die Dinge werden komisch, wenn man schläft () in einem Signalhandler. Normalerweise sind Signalhandler nicht reentrant. Das heißt, wenn der Signal-Handler läuft, sendet ein anderes Signal keine Wirkung. Allerdings scheint Schlaf () PHPs Signalbehandlung zu überschreiben. Wenn du in einem Signalhandler schlafst, wird das Signal empfangen und der Schlaf () wird unterbrochen. Dies kann wie folgt bearbeitet werden: Funktionshandler (Signal) Ignoriere dieses Signal pcntlsignal (Signal, SIGIGN) Signalhandler wiederherstellen pcntlsignal (Signal, FUNKTION) Ich sehe keine Erwähnung dieses Verhaltens in der Dokumentation. Wenn du ein Skript hast, das bestimmte Abschnitte benötigt, um nicht durch ein Signal (vor allem SIGTERM oder SIGINT) unterbrochen zu werden, sondern dein Skript bereit machen soll, dieses Signal so schnell wie möglich zu verarbeiten, gibt es nur einen Weg, es zu tun. Markiere das Skript als das Signal empfangen und warte auf dein Skript, um es zu sagen, es ist bereit, es zu verarbeiten. (SIGTERM, Sighandler) pcntlsignal (SIGINT, Sighandler) Funktion sighandler () globale allowexit, forceexit if (wenn Sie es nicht beenden müssen) Allowexit) exit else forceexit true function checkexit () global allowexit, forceexit if (forceexit ampamp allowexit) exit i 0 während (i) echo immer noch gehen () n if (i 10) allowexit true Du stellst allowexit immer wahr, wenn es ist Ist vollkommen akzeptabel, dass Ihr Skript ohne Vorwarnung beenden könnte. In Abschnitten, in denen Sie das Skript wirklich fortsetzen müssen, setzen Sie allowexit auf false. Alle Signale, die während des Zulassungsfehlers empfangen werden, werden nicht wirksam, bis Sie allowexit auf true gesetzt haben. Es ist ein wahres, unwichtiges Zeug hier. Verlassen wird nicht schaden, etwas wirklich wichtiges Zeug nicht unterbrochen werden mehr unwichtig Zeug. Wenn das Signal während der wichtigen Verarbeitung oben empfangen wurde, wird das Skript hier verlassen. Ich bin in ein interessantes Problem gerannt. CLI 4.3.10 Linux Das Elternteil hat ein Kind gegabelt. Das Kind hat ein paar Sachen gemacht, und als es fertig war, schickte es SIGUSR1 an die Eltern und verließ sofort. Ergebnis: Das Kind verwandelte sich in einen Zombie-Prozess und wartete darauf, dass der Elternteil es erntete, wie es sollte. Aber das Elternteil war nicht in der Lage, das Kind zu ernten, weil es ein endloses Sperrfeuer von SIGUSR1s erhielt. Tatsächlich hat es sich über 200000 angemeldet, bevor ich es heruntergefahren habe (SIGKILL). Die Eltern konnten in dieser Zeit nichts anderes tun (auf andere Ereignisse antworten). Nein, es war kein Fehler in meinem Kindercode. Anscheinend, nach dem Senden eines Signals gibt es einige hinter die Abdeckungen Arbeit, die auftreten müssen, um die Signalvervollständigung zu bestätigen, und wenn Sie sofort beenden, ist es nicht in der Lage zu passieren, so dass das System nur versucht, zu versuchen. Lösung: Ich habe eine kleine Verzögerung im Kind eingeführt, nachdem ich das Signal gesendet habe und vor dem Verlassen. Nicht mehr Sig-Schleifen P. S. In Bezug auf die Anmerkung unten. Der ganze Punkt der Schlaffunktion ist es, die Bearbeitung anderer Ereignisse zu ermöglichen. Also, ja, dein Nicht-Renterent-Code, wird plötzlich wieder eingegeben, wenn du schläfst, weil du gerade die Kontrolle über die nächste anstehende Veranstaltung übergeben hast. Das Ignorieren des Signals ist nur eine Option, wenn das Signal für Ihr Programm unwichtig ist. Der bessere Weg, um es zu nähern, ist nicht langwierige Verarbeitung innerhalb des Signalereignisses. Stattdessen setzen Sie eine globale Flagge und holen Sie den Heck so schnell wie möglich heraus. Lassen Sie einen anderen Teil Ihres Programms, um die Flagge zu überprüfen und die Verarbeitung außerhalb des Signalereignisses durchzuführen. Normalerweise ist dein Programm in irgendeiner Art von Schleife, wenn es Signale empfängt, also überprüft eine Flagge regelmäßig sollte kein Problem sein. Tipp: Bei der Verwendung von Objekten, setze den Signalhandler nicht vom Konstruktor oder sogar eine vom Konstruktor aufgerufene Methode - deine internen Variablen werden nicht initialisiert. Ich hatte einige Probleme mit der Verarbeitung eines Signals mit einer Objekt-Methode, die ich für etwas anderes auch verwenden. Insbesondere wollte ich SIGCHLD mit meiner eigenen Methode doreap () behandeln, die ich auch nach einem Streamselect Timeout anrufe und das eine nicht blockierende pcntlwaitpid Funktion verwendet. Die Methode wurde aufgerufen, als das Signal empfangen wurde, aber es konnte das Kind nicht ernten. Der einzige Weg, den es funktionierte, war die Schaffung eines neuen Handlers, der selbst doreap () genannt hat. Also mit anderen Worten, das folgende funktioniert nicht: ltphp class parent. Private Funktion doreap () p pcntlwaitpid (- 1. Status WNOHANG) if (p gt 0) echo nReaped Zombie Kind. P public function run (). Pcntlsignal (SIGCHLD, Array (amp this. Doreap)) readable streamselect (lesen null null 5) 5 sec timeout if (lesbar 0) bekamen wir ein timeout this - gt doreap () gt ltphp class parent. Private Funktion doreap () p pcntlwaitpid (- 1. Status WNOHANG) if (p gt 0) echo nReaped Zombie Kind. P public function run (). Pcntlsignal (SIGCHLD, Array (amp this. Childdied)) readable streamselect (lesen null null 5) 5 sec timeout if (lesbar 0) bekamen wir ein timeout this - gt doreap () private function childdied () this - gt doreap () Gt In mindestens Version 5.1.4 ist der an den Handler übergebene Parameter keine strenge Ganzzahl. Ich hatte solche Probleme wie das Versuchen, das Signal zu einem Array hinzuzufügen, aber das Array ist vollständig verschraubt, wenn es angezeigt wird (aber nicht sofort nach dem Hinzufügen). Dies geschieht, wenn der Handler eine Methode (Array (this, methodname)) oder eine traditionelle Funktion ist. Um diesen Fehler zu vermeiden, schreibst du den Parameter an eine Ganzzahl: (Beachten Sie, dass jedes Zeilenumbruch nur n. Sein kann) ltphp print (pid. Posixgetpid () n) deklarieren (ticks 1) arrsignals array () function handler (nsig) Globale arrsignals arrsignals (int) nsig print (Signal gefangen und registriert. n) vardump (arrsignals) pcntlsignal (SIGTERM. Handler) Warten auf Signale von der Befehlszeile (nur eine einfache Kill (pid)). N 15 während (n) schlafen (1) n - print (terminated. nn) vardump (arrsignals) gt Ein Wort der Vorsicht um den dritten Parameter (restartsyscalls) in pcntlsignal (.). Ich habe immer eine wiederholte Ausgabe, wo (scheinbar zufällig) mein Skript würde unerwartet beenden (beenden, nicht Absturz: der Exit-Code war immer 0) beim Verfolgen von gegabelten Kindern mit Signal-Handler. Es scheint, dass die Signalbehandlung nicht fehlerhaft ist (tatsächlich ist PHP nicht fehlerhaft). Mit restartsyscalls auf FALSE eingestellt zu sein schien die Probleme zu sein. Ich habe das Problem ausgiebig debugge - außer zu beobachten, dass das Problem sehr zeitweilig war und sich auf meine Verwendung von usleep () in Verbindung mit restartsyscallsFALSE zu beziehen schien. Meine Theorie ist der Usleep () war falsch Tracking Zeit - wie hier beschrieben: man7.orglinuxman-pagesman2restartsyscall.2.html Lange Geschichte kurz, ich re-enabled (was ist der Standardwert) restartsyscalls, und das Problem ging weg. Wenn youre neugierig - registershutdownfunction wurde immer noch richtig behandelt - so PHP definitiv war nicht abstürzen. Interessanterweise wurde mein Vorgangscode jedoch nach dem Behandeln des Signals wieder aufgenommen. Ich glaube nicht, dass das ein Fehler ist. Ich glaube, es war unwissenden Benutzerfehler. YMMV. Sieht aus wie PHP verwendet RealTime Signale. Dies bedeutet, dass, wenn ein Signal aktuell verarbeitet wird, andere Signale nicht verloren gehen. Nur zum Beispiel ltphp pcntlsignal (SIGHUP SIGIGN) gt in Strace Log sieht so aus und Code für das Testen von ltphp pcntlsignal (SIGHUP. Function (signo) echo 1n sleep (2) echo 2n) while (true) sleep (1) pcntlsignaldispatch () Gt Führen Sie diese und senden Sie, wie viele SIGHUP Signale wie Sie wollen. Alle werden verarbeitet. P. S. Ich denke, alle von ihnen. Ich konnte nicht echte Signalwarteschlange Größe finden. Schätze, wenn jemand mich zeigt. Ltphp pcntlsignal (SIGTERM. Funktion (Signo) Echo n Dieses Signal wird aufgerufen Signo n Status Zustand - 1) Klasse Status öffentlicher statischer Zustand 0 pid pcntlfork () if (pid - 1) sterben (konnte nicht gabel) if (pid) Elternteil während (true) Dispatching. Pcntlsignaldispatch () if (Statuszustand - 1) Tut etwas und endeschleife Break n 0 while (true) res pcntlwaitpid (pid. Status WNOHANG) Wenn der untergeordnete Prozess endet, dann beenden Sie den Hauptprozess. Wenn (- 1 res res gt 0) brechen Sende ein Signal nach 5 Sekunden .. if (n 5) posixkill (pid. SIGTERM) Bitte beachten Sie, dass das Deklarieren von Ticks oder das Aufrufen von pcntlsignaldispatch () in 5.3 und später erforderlich ist, um pcntlsignal zu machen Alles nützliche. Ich wünschte, die Unterlagen machten dies klarer. Ich habe Schwierigkeiten, meinen Kinderprozess zu ernten. Es schien die meiste Zeit, die Kinder wurden richtig geerntet, aber manchmal würden sie als Zombies bleiben. Ich habe das CHLD-Signal gefangen, um Kinderprozesse mit folgendem Code zu erobern: function childFinished (signal) global kids kids - pcntlwaitpid (- 1. status) Kinder 0 pcntlsignal (SIGCHLD. KindFinished) für (i 0 i lt 1000 i) während (Kinder gt 50) schlafen (1) pid pcntlfork () wenn (pid - 1) sterben (fehlgeschlagen zu gabel: () wenn fertig, nur aufräumen die Kinder print Ernten Kinder Kinder n während (Kinder) schlafen (1) drucken Finish. n gt Das Problem war, dass die Kinder niemals null wurden, also würde es effektiv auf ewig warten. Nach dem Wracking mein Gehirn (UNIX Forks sind neu für mich) Ich lese endlich die Perl IPC Docs und Viola, eine Lösung Es stellt sich heraus, dass, weil Signalhandler Sind nicht re-eindringlich, wird mein Handler nicht wieder aufgerufen werden, während es in Gebrauch ist. Das Szenario, das mich Ärger verursacht wurde, dass ein Kind würde verlassen und rufen Sie die Signal-Handler, die pcntlwaitpid () es und dekrementieren den Zähler. Inzwischen, Ein anderes Kind würde aussteigen, während das erste Kind noch geerntet wurde, also würde das zweite niemals das Elternteil benachrichtigen. Die Lösung war, die Kinder aus dem SIGCHLD-Handler fortwährend zu ernten, solange es Kinder gab, die ernten konnten. Hier ist die feste kindFinished Funktion: function childFinished (signal) globale Kinder während (pcntlwaitpid (- 1. status. WNOHANG) gt 0) Kinder -
Können wir Sie in einer Handelsressource interessieren Wie ein kostenloses, unverbindliches, unbegrenztes Demo-Konto. Echtzeit-Live-Marktdaten. Üben Sie alles, was Sie wollen mit gefälschten Geld Wie wäre es mit einem kostenlosen E-Book von Bloomberg Businessweek über die Zukunft des Handels Free Stuff Nur für immer auf unserer Website verloren Wollen Sie eine nette, schnelle Intro zu Nadex binäre Optionen Wollen Sie mehr über Nadex lernen. Der größte (möglicherweise coolste) CFTC-regulierte Binär-Optionen-Austausch in den USA Wollen Sie ein lustiges, interaktives Quiz zu sehen, welche Art von binären Optionen Handel könnte für Sie richtig sein (Okay, Spaß für eine hochregulierte Finanzbörse) Gestartet Füllen Sie unsere Online-Bewerbung in nur wenigen Minuten aus. Du bekommst eine schnelle Antwort. Sobald seine genehmigt, können Sie Ihr Konto zu finanzieren und handeln innerhalb von Minuten. Trading Binäre Optionen für Dummies PDF Binary Book Top Binäre Optionen Broker Während unserer ...
Comments
Post a Comment