php pozastaviť vykonávanie skriptu. Spustenie skriptu na pozadí v PHP bez crontab. #jeden. Ukážka použitia

  • 03.11.2019

Zastaví vykonávanie skriptu PHP a vygeneruje správu vo formáte HTML.

Analóg základnej funkcie PHP die(). Rozdiel je v tom, že wp_die() vypíše chybovú stránku vo formáte HTML. Odporúča sa použiť túto funkciu, keď potrebujete úplne zastaviť PHP. Neodporúča sa používať túto funkciu často - snažte sa nezobrazovať chyby používateľom.

sa vracia

Nevráti nič, ale ukončí PHP.

Použitie

wp_die($správa, $titul, $args); $správa (zmiešané) Chybové hlásenie alebo úplný objekt triedy WP_Error.
Predvolené: ""$title (reťazec/pole/číslo/objekt/logická hodnota) Názov chyby. Ak použijete objekt WP_Error, názov bude prevzatý z $data["title"], tento parameter si môžete vopred zmeniť.
Predvolené: ""$args (reťazec/pole)

Rôzne argumenty kontrolujúce správanie.
Predvolená hodnota: nie

    odpoveď (číslo)
    Stavový kód HTTP. 500 - interná chyba servera. Celý zoznam.
    Predvolená hodnota: 500

    spätný_link (logický)
    Či sa má alebo nemá zobraziť spätný odkaz na predchádzajúcu stránku.
    Predvolená hodnota: nepravda

  • smer textu (riadok)
    Smer textu: ltr (zľava doprava) alebo rtl (sprava doľava).
    Predvolené: "ltr"

Príklady

#jeden. Ukážka použitia

Pomocou funkcie wp_die() sa pozrime, čo je momentálne v globálnej premennej $post:

Add_filter("body_class", "add_body_class_cb"); funkcia add_body_class_cb($classes) (globálny $post; wp_die("

" var_export($post, true) ."
"); }

#2. Úprava štýlu bloku wp_die

Ak stránka potrebuje zmeniť dizajn tohto bloku, môžete použiť háčik wp_die_handler:

500); $r = wp_parse_args($args, $predvolené); $have_gettext = function_exists("__"); if (function_exists("is_wp_error") && is_wp_error($message)) ( if (empty($title)) ( $error_data = $message->get_error_data(); if (is_array($error_data) && isset($error_data[" title"])) $title = $error_data["title"]; ) $errors = $message->get_error_messages(); switch (count($errors)) (case 0: $message = ""; break; case 1 : $message = ""; prestávka; predvolená hodnota: $message = "

    \n\t\t
  • ".join("
  • \n\t\t
  • ", $errors). "
  • \n\t
"; break; ) ) elseif (is_string($message)) ( $message = ""; ) if (isset($r["back_link"]) && $r["back_link"]) ( $back_text = $have_gettext? __("" Späť") : "" Späť"; $message .= "\n

$späť_text

"; ) if (! did_action("admin_head")) : if (!headers_sent()) ( status_header($r["response"]); nocache_headers(); header("Typ obsahu: text/html; charset= utf-8"); ) if (empty($title)) $title = $have_gettext ? __("WordPress › Chyba") : "WordPress › Chyba"; $text_direction = "ltr"; if (isset($r[ "text_direction"]) && "rtl" == $r["text_direction"]) $text_direction = "rtl"; elseif (function_exists("is_rtl") && is_rtl()) $text_direction = "rtl"; ?> > <?php echo $title ?>

Kód wp zomrieť: wp-includes/functions.php WP 5.2.2

$args); ) elseif (is_int($title)) ( $args = array("response" => $title); $title = ""; ) if (wp_doing_ajax()) ( /** * Filtruje spätné volanie na zastavenie spustenia WordPress pre Žiadosti Ajax.* * @od verzie 3.4.0 * * volateľný @param $function Názov funkcie spätného volania.*/ $function = apply_filters("wp_die_ajax_handler", "_ajax_wp_die_handler"); ) elseif (wp_is_json_request()) ( /** * Filtre spätné volanie na zastavenie vykonávania WordPress pre požiadavky JSON. * * @od 5.1.0 * * @param callable $function Názov funkcie spätného volania. */ $function = apply_filters("wp_die_json_handler", "_json_wp_die_handler"); ) elseif (wp_is_jsonp_request() ) ( /** * Filtruje spätné volanie na zastavenie vykonávania WordPress pre požiadavky JSONP. * * @od verzie 5.2.0 * * @param callable $function Názov funkcie spätného volania. */ $function = apply_filters("wp_die_jsonp_handler", "_jsonp_wp_die_handler") ; ) elseif (defined("XMLRPC_REQUEST") && XMLRPC_REQUEST) ( /** * Filtruje spätné volanie na zastavenie spustenia WordPress n pre požiadavky XML-RPC. * * @od 3.4.0 * * @param callable $function Názov funkcie spätného volania. */ $function = apply_filters("wp_die_xmlrpc_handler", "_xmlrpc_wp_die_handler"); ) elseif (wp_is_xml_request() || isset($wp_query) && (function_exists("is_feed") && is_feed() || function_exists("is_comment_feed") && is_comment_feed() || function_exists("is_trackback(")) && is_trackback ) ( /** * Filtruje spätné volanie na zastavenie vykonávania WordPress pre požiadavky XML. * * @od verzie 5.2.0 * * @param callable $function Názov funkcie spätného volania. */ $function = apply_filters("wp_die_xml_handler", "_xml_wp_die_handler") ; ) else ( /** * Filtruje spätné volanie na zastavenie vykonávania WordPress pre všetky požiadavky iné ako Ajax, JSON, XML. * * @od 3.0.0 * * Volateľné @param $funkcia Názov funkcie spätného volania. */ $function = apply_filters("wp_die_handler", "_default_wp_die_handler"); ) call_user_func($funkcia, $správa, $názov, $args); )

Tu ma zmiatli, aby som napísal démona v PHP. Tie. skript, ktorý vykoná určité akcie stanovený počet krát za stanovený počet hodín v náhodnom čase (vždy náhodne), a to všetko bez použitia cronu „a.

Predtým som sa nikdy neobťažoval, ale potom po nastavení úlohy som si začal myslieť, že to nie je možné, že php skript by mal volať prehliadač ... no úloha bola nastavená, musí sa vykonať.

Prvá myšlienka je zakázať časový limit vykonávania skriptu. Zakázané hostiteľom.

Druhou myšlienkou je periodicky opakovať požiadavku Ajaxu (áno, aspoň raz za sekundu) pomocou Javascriptu. - nie je možné (požiadavka zákazníka).

V skutočnosti sa ukázalo, že prehliadač by nemal byť otvorený a nemali by sa používať crony a skript by mal fungovať nezávisle od používateľa na dobu neurčitú. Prirodzene, malo by to minimálne zaťažiť systém.

1. Balíček cigariet, noc, Google, doky, knihy, manuály….
dostanem 1…

Na výstupe dostanem:
Task_1:
Implementujte generátor času vykonávania skriptu na základe daného počtu opakovaní a počtu hodín. Tieto časy si niekde uložte.

Task_2:
Pracujte po zatvorení prehliadača

Task_3:
Po uplynutí časového limitu spustenia skriptu nezlyhajte

Task_4:
Konajte v správnom čase.

Takže…
Počiatočné údaje zapíšeme do konfigurácie:

session_start(); // Začiatok relácie $num_starts = 120; // Počet spustení skriptu za časový interval $hours = 1; // Počet hodín spúšťania skriptu $num_starts krát. $time_sec = $hodín*3600; // Počet sekúnd behu cyklu $time_to_start = array(); // V skutočnosti pole s časmi spustenia ignore_user_abort(1); // Ignorovať odpojenie prehliadača

Ďalej napíšeme funkciu, ktorá nám pomôže vygenerovať počiatočné časy.
V ňom vygenerujeme náhodné číslo od 0 do počtu sekúnd v pôvodnom intervale.
/****** * @desc Vygeneruje interval medzi spusteniami. */ funkcia add_time2start() ( globálne $time_sec, $time_to_start; $new_time = time()+rand(0, $time_sec); if (!in_array($new_time, $time_to_start)) ( // Ak takýto čas neexistuje v poli - pridajte $time_to_start = $new_time; ) else ( add_time2start(); // Ak takýto čas už existuje, vygenerujte. ) )

$k = 1; if ($_SESSION["num_st"] == "" || $_SESSION["num_st"][$num_starts-1]< time()) { // проверка, что в сессию не записаны данные и что эти данные не устарели. do { add_time2start($k); $k++; } while ($k < = $num_starts); sort($time_to_start, SORT_NUMERIC); $_SESSION["num_st"] = $time_to_start; }

Teraz musíme zabezpečiť, aby skript fungoval bez ohľadu na maximálny čas vykonávania nastavený serverom.
Princíp je:
1) Určite čas začiatku skriptu;
2) Stanovíme stanovené obmedzenie času vykonania.
3) Spustíme cyklus, v ktorom počítame aktuálny čas a vypočítame celkový čas spustenia skriptu, skontrolujeme aktuálny čas s hodnotami v poli časov spustenia a ak existuje zhoda, vykonáme zadané akcie (mám ich v súbore exec.php). Na spúšťanie súborov používame zásuvky.
4) Cyklus opakujte, kým sa doba behu skriptu nepriblíži maximálnej povolenej hodnote. Nastavil som - až kým nebude maximálny čas 5 sekúnd.

Takže... zvažujeme počiatočné údaje v čase:

$start_time = microtime(); // Zistite čas spustenia skriptu $start_array = explode(" ",$start_time); // Oddelené sekundy a milisekúnd $start_time = $start_array; // získanie času spustenia skriptu $max_exec = ini_get("max_execution_time"); //Získajte maximálny možný čas spustenia skriptu
V podstate cyklus. Komentáre v kóde.

Do( $nowtime = time(); // Aktuálny čas //// Ak je aktuálny čas v poli s časmi vykonania skriptu...... if (in_array($nowtime, $_SESSION["num_st"]) ) ( // Držíme sa súboru s hlavným obsahom akcií $http = fsockopen("test.ru",80); /// zároveň mu odovzdávame údaje o relácii a čas, kedy má work fputs($http, "GET http://test .ru/exec.php?".session_name()."=".session_id()."&nowtime=$nowtime HTTP/1.0\r\n"); fputs ($http, "Hostiteľ: test.ru\r\ n"); fputs($http, "\r\n"); fclose($http); ) //// vykonala zadanú akciu // Zistite aktuálny čas, aby ste skontrolovali, či chcete pokračovať v slučke alebo reštartovať $now_time = microtime( ); $now_array = explode(" ",$now_time); $now_time = $now_array; // odčítajte od aktuálneho času počiatočný počiatočný $exec_time = $now_time - $start_time+$exec_time; /// spomalenie na druhý spánok (1000000); // Zastavenie skriptu spusteného na pozadí, nenapadá ma iný spôsob, ak (file_exists("stop.txt")) skončí ; Overte čas chodu, ak do konca // operácie skriptu zostáva menej ako 5 sekúnd, ukončite cyklus. ) while($exec_time< ($max_exec - 5));

No, ak povolený čas skončí, dokončíme cyklus a bezpečne spustíme rovnaký skript iným procesom (určite sa stretneme s 5 sekundami)

// Spustite ten istý skript s novým procesom a ukončite aktuálny $http = fsockopen("test.ru",80); fputs($http, "GET http://test.ru/index.php?".session_name()."=".session_id()."&bu=$max_exec HTTP/1.0\r\n"); fputs($http, "Hostiteľ: test.ru\r\n"); fputs($http, "\r\n"); fclose($http);

Keď som všetko dokončil, bol som zmätený užitočnou aplikáciou ... Môžete ju použiť ako službu. Môže sledovať niečo v sieti a upozorniť vás napríklad poštou. A nepotrebujete žiadne crony.

Skript je stále možné optimalizovať – ešte nie je dokončený.
Mimochodom, to je to, od čoho som sa nemohol odtrhnúť - prehliadač musí byť stále otvorený, aby bolo možné skript na začiatku spustiť.

pred 8 rokmi

Ak sa chcete vyhnúť volaniu exit() vo FastCGI podľa komentárov nižšie, ale naozaj, pozitívne chcete ukončiť volanie vnorenej funkcie alebo zahrnúť, zvážte to spôsobom Python:

definujte výnimku s názvom `SystemExit', vyhoďte ju namiesto volania exit() a zachyťte ju v index.php s prázdnou obslužnou rutinou, aby ste dokončili vykonávanie skriptu čisto.

// súbor: index.php
class SystemExit rozširuje Exception()
skús (
/* kód kódu */
}
catch (SystemExit $e ) ( /* nerobiť nič */ )
// koniec súboru: index.php

// nejaká hlboko vnorená funkcia alebo súbor .php

Ak (SOME_EXIT_CONDITION)
hodiť nový SystemExit(); // namiesto exit()

?>

pred 10 rokmi

Jbezorg na gmail navrhol nasledovné:


header("Umiestnenie: /");

?>

Po odoslaní hlavičky `Location:" PHP hlavička _bude_ pokračovať v analýze a všetok kód pod volaním header() sa bude stále vykonávať. Namiesto toho použite:

If($_SERVER [ "SCRIPT_FILENAME" ] == __FILE__ )
{
header("Umiestnenie: /");
východ;
}

?>

pred 10 rokmi

To rich dot lovely at klikzltd dot co dot uk:

Použitie znaku „@“ pred hlavičkou() na potlačenie jej chyby a spoliehanie sa na chybu „hlavičky sú už odoslané“ sa mi zdá veľmi zlý nápad pri vytváraní akejkoľvek serióznej webovej stránky.

Toto *nie je* čistý spôsob, ako zabrániť priamemu volaniu súboru. Prinajmenšom to nie je bezpečná metóda, pretože sa spoliehate na prítomnosť výnimky odoslanej syntaktickým analyzátorom za behu.

Odporúčam použiť bežnejší spôsob, ako je definovanie konštanty alebo priradenie premennej ľubovoľnej hodnoty a kontrola jej prítomnosti v priloženom skripte, napríklad:

v index.php:
define("INDEX" , true );
?>

vo vašom priloženom súbore:
ak (! definované("INDEX"))(
zomrieť ( "Tento skript nemôžete zavolať priamo!");
}
?>

B.R.

pred 4 rokmi

Vedľajšia poznámka k použitiu exit s konečne: ak opustíte niekde v bloku pokusu, nakoniec sa nevykoná. To nemôže znieť jasne: napríklad v jazyku Java nikdy nevydáte exit, aspoň návrat vo svojom radič, v PHP sa namiesto toho môžete ocitnúť pri opustení metódy ovládača (napr. v prípade, že zadáte presmerovanie).

Tu nasleduje POC:

echo "konecne testovanie s ukončením\n" ;

skús (
echo "Skúšam, končím\n" ;

východ;
) catch (Výnimka $e ) (
echo "chytit\n" ;
) konečne (
echo "konečne\n" ;
}

echo "Na konci\n" ;
?>

Toto vytlačí:

testovanie konečne vtip exit
V pokuse, výstup

pred 1 rokom

>> Funkcie vypnutia a deštruktory objektov sa vykonajú vždy, aj keď sa zavolá exit.

Je nepravdivé, ak zavoláte exit do deštruktora.

normálny výstup:
trieda A
{
{
echo "bye A\n" ;
}
}

trieda B
{
verejná funkcia __destruct()
{
echo "bye B\n" ;
}
}

$a = nové A ;
$b = nové B ;
východ;

//Výkon:
// ahoj B
// ahoj A
?>

// Výstup do deštruktora:
trieda A
{
verejná funkcia __destruct()
{
echo "bye A\n" ;
}
}

trieda B
{
verejná funkcia __destruct()
{
echo "bye B\n" ;
východ;
}
}

$a = nové A ;
$b = nové B ;

//Výkon:
// ahoj B
?>

pred 17 rokmi

Ak používate šablóny s mnohými zahrnutiami, potom exit() ukončí váš skript a vaša šablóna sa nedokončí (č,

, atď...). Namiesto komplexnej vnorenej podmienenej logiky vo svojom obsahu jednoducho vytvorte súbor „footer.php“, ktorý zatvorí celý váš kód HTML, a ak chcete ukončiť skript, stačí pred ukončením funkcie zahrnúť () pätu ().

include("hlavička.php");
bla bla bla
if (!$mysql_connect) (
echo "nemožno sa pripojiť";
include("päta.php");
východ;
}
bla bla bla
include("päta.php");

pred 16 rokmi

Návrat môže byť v určitých situáciách vhodnejší na ukončenie, najmä pri práci s binárnym kódom PHP a shellom.

Mám skript, ktorý je príjemcom mailového aliasu, t.j. pošta odoslaná na tento alias je presmerovaná do skriptu namiesto toho, aby bola doručená do poštovej schránky. Použitie ukončenia v tomto skripte viedlo k tomu, že odosielateľ e-mailu dostal oznámenie o zlyhaní doručenia. Toto nebolo želané správanie, chcel som potichu zahodiť správy, ktoré nespĺňali požiadavky skriptu.

Po niekoľkých hodinách pokusu zistiť, akú celočíselnú hodnotu by som mal odovzdať exit(), aby som uspokojil sendmail, som skúsil použiť return namiesto exit. Fungovalo ako kúzlo. Sendmail nemal rád ukončenie, ale bol s návratom úplne spokojný. Takže ak máte problémy s ukončením a inými systémovými binárnymi súbormi, skúste namiesto toho použiť return.

Pred 3 rokmi

Okrem „zrušte informácie o informáciách“ je tu jednoduchý riadok, ktorý nevyžaduje žiadne konštanty:



Umiestnenie na začiatok súboru PHP zabráni priamemu prístupu k skriptu.

Ak chcete presmerovať na / namiesto umierania:

if (základný názov ($_SERVER [ "PHP_SELF" ]) == základný názov (__FILE__ )) (
if (ob_get_contents()) ob_clean(); // ob_get_contents() funguje aj bez aktívneho ukladania do vyrovnávacej pamäte
header("Umiestnenie: /");
zomrieť;
}
?>

Urobte to isté v jednom riadku:



Poznámka k bezpečnosti: Aj keď $_SERVER["PHP_SELF"] pochádza od používateľa, je bezpečné predpokladať jeho platnosť, pretože "manipulácia" prebieha _pred_ skutočným spustením súboru, čo znamená, že reťazec _musel_ byť dostatočne platný na spustenie súboru. Basename() je tiež binárne bezpečné, takže sa na túto funkciu môžete bezpečne spoľahnúť.

pred 7 rokmi

Pri použití php-fpm by ste mali použiť fastcgi_finish_request() namiesto register_shutdown_function() a exit()

Napríklad pod nginx a php-fpm 5.3+ to spôsobí, že prehliadače počkajú 10 sekúnd na zobrazenie výstupu:

ozvena „Musíte počkať 10 sekúnd, aby ste to videli.
"
;
register_shutdown_function("vypnutie");
východ;
vypnutie funkcie()(
spánok(10);
ozvena "Pretože exit() neukončí volania php-fpm okamžite.
"
;
}
?>

Toto neplatí:

ozvena "V prehliadači to môžete okamžite vidieť.
"
;
fastcgi_finish_request();
spánok(10);
ozvena "Toto v prehliadači nevidíte.";
?>