Sunday 1 October 2017

Forex Signal Php Script


Jag har ett PHP-skript i de arbeten som är en arbetsansvarig. Det är dess huvuduppgift att kontrollera en databastabell för nya jobb, och om det finns några, att agera på dem. Men jobb kommer att komma in i brister, med långa luckor däremellan, så jag tänkte på en sömncykel som: Bra, men i vissa fall betyder det att det kan finnas en 30 sekunders fördröjning innan ett nytt jobb påbörjas. Eftersom det här är ett demon script, tänkte jag Id försök PCntlsignal krok för att fånga en SIGUSR1 signal för att knyta skriptet för att vakna, som: Jag bröt sömnen (30) upp i mindre sömnbitar, om en signal inte stör en sömn () kommandot, trodde att detta skulle orsaka högst en sekunds fördröjning, men i loggfilen, ser jag att SIGUSR1 inte är fångad tills efter att hela 30 sekunder har passerat (och kanske den yttre slingan återställs). Jag hittade kommandot pcntlsignaldispatch, men det är bara för PHP 5,3 och högre. Om jag använde den versionen kunde jag hålla ett samtal till det kommandot innan if (call) - samtalet, men som det för närvarande står Im på 5.2.13. I vilken typ av situationer tolkar signalerna köen i PHP-versioner utan att man uttryckligen kan ringa köparsningen Kan jag lägga in något annat meningslöst kommando i sömnslingan som skulle utlösa en signalkön parse in där frågade 29 april 10 kl 18: 42 hakre 138k 9679 26 9679 232 9679 422 Fixat mitt eget problem: Svaret är fästningsdeklarationen. Jag hade, som en del av Daemon-processen, igångsättandet av deklarationen (ticks1), men det verkade inte ha övergått till huvudskriptet (eftersom det var inne i en funktion, i en inkluderad fil. Lägga till en deklaration (ticks1) (sönder) slingan orsakar signaler att komma igenom omedelbart (dvs sovkommandot (1) ger upphov till en kryssning, så efter att ha vaknat från sömnen behandlas signalerna.) svarat 29 april 10 kl 19: 11Forex Signal system Script Jag behöver en Forex Signal system script PHP endast Kodaren måste klona vad som erbjuds på den här webbplatsen: url bort, logga in för att visa och medlemmar område och forex siganl verktyg De valda kodarna bör veta om den här typen av skript eller den här webbadressen borttagen, logga in för att visa webbplats. Det är väldigt populärt. Endast kodare som redan skapat framgångsrikt Forex-signalsystem script039s måste bjuda Färdigheter som krävs. Vill du tjäna pengar? Ange din budget och tidsramen. Beskriv ditt förslag. Få betalt för ditt arbete. Hyr Freelancers som också bjuder på detta projekt. Arbeta på s rojects like this och tjäna pengar från hemmet Forex Signal system Script Forbes New York Times Time Wall Street Journal Times Totalt antal jobb upplagda Hämta Freelancer Freelancer reg är ett registrerat varumärke för Freelancer Technology Pty Limited (ACN 142 189 759) Copyright kopia 2017 Freelancer Technology Pty Limited (ACN 142 189 759) Fångningssignaler i PHP-skript Varför skulle man någonsin skriva skript i Bash om du kan skriva dem lika bra i PHP Närhelst ett snabbt skript behövs använder jag ofta mina PHP-färdigheter för att lösa problemet. Ofta använder du kraftfulla kommandon som 8220pregmatchall 8221 och 8220pregreplacecallback 8220. Today8217s blogg visar dig hur man ska undvika att ditt PHP-skript exekveras två gånger, genom att använda en 8220pid8221-fil. Det visar också hur man hanterar signaler (som Ctrl-C-tangenter) graciöst. Det förklarar hur du kan definiera en signalhanterare som kan utföra några 8220clean up8221 samtal. Först kommer jag att visa dig hur du använder linjen 8220shebang8221 för att konvertera en vanlig PHP-fil till ett Bash-liknande skript. En shebang-linje (som även kallas hashbang, hashpling, pound bang eller crunchbang) är den första raden i ett textskript som beskriver nix operativsystem som tolk ska använda för att köra skriptet. 8212 electrictoolbox på php-shebang Lägga till en shebang är enkelt att lägga till en första raden med innehållet 8220usrbinphp8221 till ditt skript så här: För att kunna exekvera filen 8220script. php8221 behöver vi göra det körbar genom att köra 8220chmod 755 script. php8221 på kommandoraden. Koden nedan visar användningen av 8220pcntlsignal 8221 för att definiera en anpassad signalhanterare. Observera att det är absolut nödvändigt (och inte särskilt dokumenterat) att du sätter 8220declare (ticks 1) 8221 längst upp i filen. Annars kommer signalhanteraren inte att ringas. Koden nedan visar också hur man försöker att skaffa ett lås på en fil utan att trunka den (genom att använda alternativet 8216c8217) och sedan avkorta det efter att låset framgångsrikt har skaffats. Det visar också hur filen 8216pid8217 trunkeras när processen avslutas på grund av en signal. Observera att signalen 8220KILL8221, som skickas när en process dödas med kommandot 8220kill -98221, inte kan fångas. I OOP kan funktionen 8216signalHandler8217 vara en metod för ett objekt. I ett sådant fall kan det hänvisas till en array som innehåller hänvisningen till objektet som första element och metodnamnet som det andra elementet (se återuppringningar). I OOP-fallet måste du se till att du sparar pidFile-värdet till GLOBALS superglobal med 8220GLOBALS8216pidfile8217pidFile8221 för att undvika GC-effekt. GC gör referensräkning och när metoden är klar kan referensräknaden till innehållet i pidFile vara noll och i sådant fall stängs filen automatiskt, vilket frigör låset. Om du är mer intresserad av PHP och låsning, kan en intressant PHP-kod hittas i WordPress GPL-ed, men avvecklad, låst implementering. 3 tankar om ldquoCatching signaler i PHP scriptsrdquopcntlsignal Några konstiga signalväxlingar pågår här. Jag kör PHP 4.3.9. Sova () samtal verkar avbrytas när någon signal tas emot av PHP-skriptet. Men saker blir konstiga när du sover () inuti en signalhanterare. Normalt är signalhanterare inte reentrant. Det vill säga, om signalhanteraren är igång, har det inte någon effekt att skicka en annan signal. Men sömn () verkar åsidosätta PHPs signalhantering. Om du sover () inuti en signalhanterare mottas signalen och sömnen () avbryts. Detta kan fungera så här: funktionshanterare (signal) Ignorera den här signalen pcntlsignal (signal, SIGIGN) Sätt om signalhanteraren pcntlsignal (signal, FUNCTION) Jag ser inget om detta beteende i dokumentationen. Om du har ett skript som behöver vissa sektioner inte avbryts av en signal (speciellt SIGTERM eller SIGINT), men vill göra ditt skript redo för att behandla signalen ASAP, är det bara en väg att göra det. Markera skriptet som att ha fått signalen och vänta på att ditt skript säger att det är klart att bearbeta det. Heres ett exempel script: lt allowexit true vi tillåter exit forceexit false måste vi avsluta deklarera (ticks 1) registertickfunction (checkexit) pcntlsignal (SIGTERM, sighandler) pcntlsignal (SIGINT, sighandler) funktion sighandler () global allowexit, forceexit if allowexit) exit other forceexit true function checkexit () global allowexit, forceexit om (forceexit ampamp allowexit) avsluta i 0 medan (i) ekot fortfarande går () n om (i 10) allowexit true Du ställer allowexit till true hela tiden när det är helt acceptabelt att ditt skript kunde gå ut utan varning. I sektioner där du verkligen behöver manuset för att fortsätta att köra, ställer du allowexit till false. Eventuella signaler mottagna medan allowexit är falskt kommer inte att träda i kraft förrän du ställer allowexit till true. Det tillåter sanna oväsentliga saker här. spännande kommer inte att skada någonting riktigt viktiga saker som inte ska avbrytas mer oväsentliga saker. om signalen mottogs under viktig behandling ovan kommer man att gå ut av skriptet gt. Jag stötte på ett intressant problem. CLI 4.3.10 Linux Föräldern förkedde ett barn. Barnet gjorde en massa saker, och när det var gjort skickade det SIGUSR1 till föräldern och omedelbart utträde. Resultat: Barnet blev en zombieprocess som väntade på att föräldrarna skörde det, som det borde. Men föräldern kunde inte skörda barnet eftersom det fick ett oändligt spärr av SIGUSR1s. Faktum är att det loggades över 200000 innan jag stängde av det (SIGKILL). Föräldern kunde inte göra något annat (svara på andra händelser) under den tiden. Nej, det var inte en bugg i min barnkod. Uppenbarligen, efter att ha skickat en signal finns det några bakom det omslagsarbete som måste ske för att erkänna signalavslutningen, och när du avslutar omedelbart kan det inte hända, så systemet fortsätter att försöka. Lösning: Jag introducerade en liten fördröjning i barnet, efter att ha skickat signalen, och innan du lämnade. Inga fler Sig-slingor. P. S. Med hänsyn till anteckningen nedan. Hela punkten i sömnfunktionen är att möjliggöra behandling av andra händelser. Så, din icke-hyreskylda kod kommer plötsligt att återinsökas när du sover, för att du bara har avstått kontrollen till nästa pågående händelse. Att ignorera signalen är bara ett alternativ om signalen inte spelar någon roll för ditt program. Det bättre sättet att närma sig det är att inte göra långvarig behandling inom signalhändelsen. I stället sätta en global flagga och få käften där borta så fort som möjligt. Tillåt en annan del av ditt program att kontrollera flaggan och bearbeta behandlingen utanför signalhändelsen. Vanligtvis är ditt program i någon form av loop när det tar emot signaler, så att kontrollera en flagga regelbundet borde inte vara ett problem. Tips! När du använder objekt ställer du inte signalhanteraren från konstruktören eller till och med en metod som kallas från konstruktören - dina interna variabler kommer att initieras. Jag hade några problem med att bearbeta en signal med hjälp av en objektmetod som jag använder för något annat också. I synnerhet ville jag hantera SIGCHLD med min egen metod doreap () som jag också kallar efter en streamselect timeout och som använder en non-blocking pcntlwaitpid-funktion. Metoden kallades när signalen mottogs men det kunde inte skörda barnet. Det enda sättet det fungerade var att skapa en ny handlare som själv kallades doreap (). Så med andra ord fungerar inte följande: ltphp class Parent. privat funktion doreap () p pcntlwaitpid (- 1. status. WNOHANG) om (p gt 0) echo nReaped zombie barn. p public function run (). pcntlsignal (SIGCHLD, array (amp this. doreap)) läsbar streamselect (read. null. null. 5) 5 sek timeout om (läsbar 0) vi fick en timeout här - gt doreap () gt ltphp class Parent. privat funktion doreap () p pcntlwaitpid (- 1. status. WNOHANG) om (p gt 0) echo nReaped zombie barn. p public function run (). pcntlsignal (SIGCHLD, array (amp this. childdied)) läsbar streamselect (läs. null. null. 5) 5 sek timeout om (läsbar 0) vi har en timeout här - gt doreap () privat funktion childdied () this - gt doreap () gt I minst version 5.1.4 är parametern som skickas till hanteraren inte ett strikt heltal. Jag har haft sådana problem som att försöka lägga till signalen i en array, men matrisen är helt skruvas upp när den ses (men ses inte omedelbart efter att ha lagts till). Detta sker när hanteraren är en metod (array (detta, metodnamn)) eller en traditionell funktion. För att undvika det här felet, skriv in parametern till ett heltal: (Observera att varje ny linje kan tyckas vara bara n.) Ltphp print (pid. Posixgetpid (). N) deklarera (ticks 1) arrsignals array () funktionshanterare (nsig) globala arrsignals arrsignals (int) nsig print (Signal fångad och registrerad. n) vardump (arrsignals) pcntlsignal (SIGTERM. handler) Vänta på signaler från kommandoraden (bara en enkel död (pid)). n 15 medan (n) sömn (1) n - print (terminated. nn) vardump (arrsignals) gt Ett varningstecken runt den tredje parametern (restartsyscalls) i pcntlsignal (.). Jag fortsatte att ha en upprepad fråga där (skenbart slumpmässigt) mitt skript skulle avslutas oväntat (exit, inte krasch: exitkoden var alltid 0) medan man spårade gaffelbarn med signalhanterare. Det verkar som att signalhanteringen inte är fel (faktiskt är PHP inte fel). Att ha restartsyscalls satt till FALSE tycktes vara problem orsaken. Jag har inte debugged problemet i stor utsträckning - förutom att observera att problemet var mycket intermittent och verkade relatera till min användning av vila () i kombination med restartsyscallsFALSE. Min teori är att usleep () felaktigt spårade tid - som beskrivs här: man7.orglinuxman-pagesman2restartsyscall.2.html Lång historia kort, jag aktiverade igen (vilket är standardvärdet) omstart, och problemet gick bort. Om du är nyfiken - registershutdownfunction var fortfarande hanteras korrekt - så PHP definitivt inte kraschar. Intressant nog, men min procedurkod återupptogs aldrig efter att signalen hanterades. Jag tror inte att det här är en bugg. Jag tror att det var okunnigt användarfel. YMMV. Det verkar som om php använder RealTime-signaler. Detta innebär att om en signal för närvarande bearbetas kommer inte andra signaler att gå vilse. bara för exempel ltphp pcntlsignal (SIGHUP. SIGIGN) gt i strace log ser ut så här och kod för testning ltphp pcntlsignal (SIGHUP. funktion (signo) eko 1n sömn (2) eko 2n) medan (sann) sömn (1) pcntlsignaldispatch () gt Kör detta och skicka hur många SIGNUP-signaler som du vill. Alla kommer att behandlas. P. S. Jag antar dem alla. Jag kunde inte hitta riktiga signalkö storlek. Kommer att uppskatta om någon pekar på mig. ltphp pcntlsignal (SIGTERM. funktion (signo) echo n Den här signalen kallas. Signo Status Status - 1) Status Statligt statligt tillstånd 0 pid pcntlfork () Om (pid - 1) Dö (kan inte gaffla) om (pid) förälder annat medan (sant) skickas. pcntlsignaldispatch () om (Status. tillstånd - 1) Gör något och slutet loop. bryt n 0 medan (sant) res pcntlwaitpid (pid status. WNOHANG) Om barnprocessen slutar avslutar du huvudprocessen. om (- 1 res res gt 0) paus Skicka en signal efter 5 sekunder .. om (n 5) posixkill (pid. SIGTERM) Observera att deklarera fästingar eller ringa pcntlsignaldispatch () i 5.3 och senare krävs för att göra pcntlsignal något användbart. Jag önskar att dokumentationen gjorde det tydligare. Jag har haft problem med att skörda min barnprocess. Det verkade mest av tiden, barnen skördades ordentligt men ibland skulle de stanna som zombies. Jag hämtade CHLD-signalen för att skörda barnprocesser med följande kod: funktionsbarnFinished (signal) globala barnbarn - pcntlwaitpid (- 1. status) barn 0 pcntlsignal (SIGCHLD. ChildFinished) för (i 0 i lt 1000 i) medan (kids gt 50) sleep (1) pid pcntlfork () om (pid - 1) dö (misslyckades med gaffel :() när du är färdig, bara städa upp barnen Skriva barn Finished. n gt Problemet var att barnen aldrig blev noll så att det verkligen skulle vänta för alltid. Efter att ha brutit mina hjärnor (UNIX-gafflar är nya för mig) läste jag äntligen Perl IPC docs och viola, en lösning Det visar sig att eftersom signalhanterare är inte återkommande, kommer min hanterare inte att ringas igen när den är i bruk. Det scenario som orsakade mig problem var att ett barn skulle avsluta och ringa signalhanteraren, vilket skulle PCntlwaitpid () det och sänka räknaren. Ett annat barn skulle gå ut medan det första barnet fortfarande skördades, så s econd skulle aldrig få meddela föräldern. Lösningen var att kontinuerligt skörda barn från SIGCHLD-hanteraren, så länge som det fanns barn att skörda. Här är det fasta barnetFinerade funktionen: funktionsbarnFinerade (signal) globala barn medan (pcntlwaitpid (- 1. status. WNOHANG) gt 0) barn -

No comments:

Post a Comment