Portál AbcLinuxu, 6. května 2025 06:08

Dotaz: PHP - Jak zastavit skript ESCapem

18.11.2020 21:33 tom
PHP - Jak zastavit skript ESCapem
Přečteno: 607×
Odpovědět | Admin
Zdravim,

jeste jeden stupidni dotaz na problem, se kterym se dost casto potykam

Obcas se mi stane, ze necham PHP skript ve smycce neco sloziteho pocitat, nebo se dotazovat nejake zadrene databaze. A prohlizec ceka a ceka, a v Zabbixu zacne naskakovat "Disk i/o is overloaded"...

Tak me napadlo, jak by to bylo hezke, kdybych mohl klepnout do klavesy ESC, a cele to zastavit. Tedy zejmena na serveru

Co jsem tak googlil, tak vetsina lidi navrhuje, dat do te smycky podminku, ze kdyz se nekde (typicky v tempu) objevi nejaky soubor, nebo prikaz v nejakem souboru (run/stop), tak ze se z te smycky vyskoci

Jako umim pres jQuery zachytit klavesu ESC a navazat ji na nejaky AJAX, ktery by neco takoveho na serveru obstaral. Ale nechce se mi verit, ze jako na to neni nic lepsiho. Podle mnozstvi diskusi, ktere mi to naslo, asi nejsem sam, kdo tenhle problem musi obcas resit

Napadaji me silenosti jako vytvorit dynamicky skript v tempu, spustit ho pres system(), zachytit jeho PID, a pak ten proces pres AJAX zabit KILLem

Nebo v PHP udelat nejak fork() a resit to v nem. Nejcastejsi rada, jak v PHP udelat fork() a pracovat s potomkem zni: "don't do it!". Uz si nepamatuju ty argumenty, ale pamatuju si, ze mne presvedcily...

Nevim treba jestli kdyz PHP budu spoustet jako CGI, namisto Apache modulu, jestli mi to v tomhle smeru nabidne nejake lepsi moznosti

Mate nekdo tohle vyresene?

Diky

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

18.11.2020 21:39 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Máme to vyřešeno - spoléháme na timeout, který se o to postará sám.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
18.11.2020 22:14 tom
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
No jo, to je fakt. Ja si vlastne muzu pred tou smyckou nadefinovat, jaky cas jsem ochotnej tomu skriptu poskytnout

Nicmene, co kdyz predem netusim, kolik casu by to mohlo stat, a chci se rozhodovat tak nejak za behu, az treba podle nasledku?

Jde to nejak rozumne zastavit z te klientske strany?
Řešení 1× (OldFrog {Ondra Nemecek})
AraxoN avatar 19.11.2020 13:07 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Manuál pod heslom ignore_user_abort obsahuje nejaké hinty, ktoré by mohli pomôcť. Napríklad, že server sa dozvie, že sa klient odpojil (stlačil Escape), až keď sa pokúsi niečo klientovi poslať. Takže v tej slučke treba sem-tam niečo vypísať a flushnúť:
<?php

ignore_user_abort(false);

while (true) {
  // chvíľu niečo počítaj
  echo ".";
  flush();
}
19.11.2020 18:07 tom
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
To vypada zajimave, kouknu. Diky
19.11.2020 18:27 tom
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
Ty jo, ono to asi fakt funguje!

Kdyz necham ten skript neco vypisovat a pak zmacknu ESC, tak on fakt skonci. Zadny AJAX, ani jine kejkle nejsou zapotrebi

Ja se z toho... Diky!
27.1.2021 20:26 tom
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
Dneska jsem tohle opet pouzil a zjistil, ze predchozi odpoved neni kompletni

Pokud ma tohle nekomu poslouzit, mel by vedet, ze nestaci zavolat flush(), ale pred nim jeste ob_flush(). Tedy pokud ma vystup putovat pres Apache do weboveho prohlizece

Neptejte se me proc

Priklad:
ini_set('display_errors', 1);
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);

$ip = '8.8.8.8';
$cmd = "/bin/ping -c10 -W2 -n $ip 2>&1";

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "w"),
);

ob_flush();
flush();

$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());

if (is_resource($process)) {
    while ($s = fgets($pipes[1])) {
        print $s;
        ob_flush();
        flush();
    }
}
Gréta avatar 27.1.2021 21:10 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem

Neptejte se me proc

asi proto hele :O :O

flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser. It also doesn't affect PHP's userspace output buffering mechanism. This means you will have to call both ob_flush() and flush() to flush the ob output buffers if you are using those.

27.1.2021 22:06 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
Ono je lepší se OB vyhnout velkým obloukem. V tom případě je ob_flush() samozřejmě zbytečné.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
28.1.2021 07:40 okbobcz | skóre: 8
Rozbalit Rozbalit vše Re: PHP - Jak zastavit skript ESCapem
Nejsem si úplně jistý, jestli tento způsob bez něčeho dalšího zastaví běžící dotaz v databázi - zvlášť pokud by se zrovna počítala třeba delší agregace a zrovna databáze nemá žádné výsledky, které by posílala klientovi.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.