Php komut dosyası yürütmeyi askıya alır. Crontab olmadan arka planda PHP betiği çalıştırma. # 1. Kullanım gösterimi

  • 03.11.2019

PHP komut dosyasının yürütülmesini durdurur ve biçimlendirilmiş bir HTML mesajı görüntüler.

Temel PHP işlevi die () 'nin bir benzeri. Aradaki fark, wp_die () 'nin HTML formatlı bir hata sayfası vermesidir. PHP'yi tamamen kapatmanız gerektiğinde bu işlevi kullanmanız önerilir. Bu özelliği sık kullanmanız önerilmez - kullanıcılara hata göstermemeye çalışın.

İadeler

Hiçbir şey döndürmez, ancak PHP'yi sonlandırır.

Kullanma

wp_die ($ mesaj, $ başlık, $ değişken); $ mesaj (karışık) Bir hata mesajı veya eksiksiz bir WP_Error nesnesi.
Varsayılan: "" $ başlık (dize / dizi / sayı / nesne / mantıksal) Hata başlığı. WP_Error nesnesini kullanırsanız, başlık $ data ["title"] 'dan alınacaktır, bu parametre önceden kendiniz için değiştirilebilir.
Varsayılan: "" $ args (dize / dizi)

Davranışı kontrol eden çeşitli argümanlar.
Varsayılan: hayır

    tepki (numara)
    HTTP durum kodu. 500 - dahili sunucu hatası. Bütün liste.
    Varsayılan: 500

    back_link (mantıklı)
    Önceki sayfaya geri bağlantı görüntülenip görüntülenmeyeceği.
    Varsayılan: yanlış

  • metin yönü (hat)
    Metin yönü: ltr (soldan sağa) veya rtl (sağdan sola).
    Varsayılan: "ltr"

Örnekleri

# 1. Kullanım gösterimi

Wp_die () işlevini kullanarak, şu anda $ post global değişkeninde ne olduğunu görelim:

Add_filter ("body_class", "add_body_class_cb"); function add_body_class_cb ($ sınıflar) (global $ post; wp_die ("

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

# 2. Bir wp_die bloğunun stilini belirleme

Sitede bu bloğun tasarımını değiştirmeniz gerekirse, wp_die_handler kancasını kullanabilirsiniz:

500); $ r \u003d wp_parse_args ($ değiştirgeler, $ varsayılanlar); $ have_gettext \u003d function_exists ("__"); if (function_exists ("is_wp_error") && is_wp_error ($ mesaj)) (if (empty ($ title)) ($ error_data \u003d $ message-\u003e get_error_data (); if (is_array ($ error_data) && isset ($ error_data [" title "])) $ title \u003d $ error_data [" title "];) $ error \u003d $ message-\u003e get_error_messages (); switch (count ($ error)) (case 0: $ message \u003d" "; break; case 1 : $ mesaj \u003d ""; ara; varsayılan: $ mesaj \u003d "

    \\ n \\ t \\ t
  • ". katılmak ("
  • \\ n \\ t \\ t
  • ", $ hata)."
  • \\ n \\ t
"; break;)) elseif (is_string ($ mesaj)) ($ mesaj \u003d" ";) if (isset ($ r [" back_link "]) && $ r [" back_link "]) ($ back_text \u003d $ have_gettext? __ ("" Geri "):" "Geri"; $ mesaj. \u003d "\\ N

$ geri_metin

";) if (! did_action (" admin_head ")): if (! headers_sent ()) (status_header ($ r [" yanıt "]); nocache_headers (); başlık (" İçerik Türü: text / html; charset \u003d utf-8 ");) if (boş ($ title)) $ title \u003d $ have_gettext? __ (" WordPress ›Hata"): "WordPress› Hatası "; $ text_direction \u003d" ltr "; if (isset ($ r [ "text_direction"]) && "rtl" \u003d\u003d $ r ["text_direction"]) $ text_direction \u003d "rtl"; elseif (function_exists ("is_rtl") && is_rtl ()) $ text_direction \u003d "rtl";?\u003e > <?php echo $title ?>

Kod wp ölmek: wp-includes / functions.php WP 5.2.2

$ args); ) elseif (is_int ($ title)) ($ args \u003d array ("response" \u003d\u003e $ title); $ title \u003d "";) if (wp_doing_ajax ()) (/ ** * WordPress uygulamasını sonlandırmak için geri aramayı filtreler. Ajax istekleri. * * @Since 3.4.0 * * @param çağrılabilir $ function Geri arama işlevi adı. * / $ Function \u003d apply_filters ("wp_die_ajax_handler", "_ajax_wp_die_handler");) elseif (wp_is_json_request ()) (/ ** * Filtreler JSON istekleri için WordPress yürütmesini sonlandırmak için geri arama. * * @since 5.1.0 * * @param çağrılabilir $ işlevi Geri arama işlevi adı. * / $ function \u003d apply_filters ("wp_die_json_handler", "_json_wp_die_handler");) elseif (wp_is_jsonp_request () ) (/ ** * JSONP istekleri için WordPress yürütmesini sonlandırmak için geri aramayı filtreler. * * @ 5.2.0'dan beri * * @param callable $ function Geri arama işlevi adı. * / $ Function \u003d apply_filters ("wp_die_jsonp_handler", "_jsonp_wp_die_handler") ;) elseif (tanımlı ("XMLRPC_REQUEST") && XMLRPC_REQUEST) (/ ** * WordPress uygulamasını sonlandırmak için geri çağrıyı filtreler XML-RPC istekleri için n. * * @ 3.4.0'dan beri * * @param callable $ function Geri arama işlevi adı. * / $ function \u003d 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") &&&exists ) (/ ** * XML istekleri için WordPress yürütmesini sonlandırmak için geri aramayı filtreler. * * @ 5.2.0'dan beri * * @param çağrılabilir $ function Geri çağrı işlevi adı. * / $ Function \u003d apply_filters ("wp_die_xml_handler", "_xml_wp_die_handler") ;) else (/ ** * Ajax olmayan, JSON olmayan, XML olmayan tüm istekler için WordPress yürütmesini sonlandırmak için geri aramayı filtreler. * * @since 3.0.0 * * @param çağrılabilir $ function Geri arama işlevi adı. * / $ function \u003d apply_filters ("wp_die_handler", "_default_wp_die_handler");) call_user_func ($ fonksiyon, $ mesaj, $ başlık, $ değiştirgeler); )

PHP'de bir arka plan programı yazmak konusunda beni şaşırttılar. Şunlar. belirli eylemleri belirli sayıda saat içinde, rastgele bir zamanda (her zaman rastgele) ve tüm bunları cron "a kullanmadan gerçekleştirecek bir betik.

Ondan önce hiç rahatsız etmedim, ama sonra görevi ayarladıktan sonra, php betiğinin tarayıcı tarafından çağrılması gerektiğini düşünmeye başladım ... peki, görev ayarlandı, gerçekleştirilmesi gerekiyor.

İlk düşüncem, komut dosyası yürütme zaman sınırını devre dışı bırakmaktır. Ev sahibi tarafından yasaklanmıştır.

İkinci düşünce, ajax isteğinin periyodik olarak javascript ile (en az saniyede bir) tekrarlanmasıdır. - mümkün değil (müşterinin isteği).

Aslında, tarayıcının açık olmaması ve tacın kullanılmaması gerektiği ve komut dosyasının süresiz olarak kullanıcıdan bağımsız olarak çalışması gerektiği ortaya çıktı. Doğal olarak, sistemi minimumda yüklemelidir.

1. Bir paket sigara, gece, google, dock'lar, kitaplar, kılavuzlar….
git 1 ...

Çıktıda:
Görev 1:
Belirtilen sayı ve saat sayısına dayalı olarak bir komut dosyası yürütme süreleri oluşturucu uygulayın. Bu saatleri bir yerde saklayın.

Task_2:
Tarayıcıyı kapattıktan sonra çalışın

Task_3:
Komut dosyası yürütme süresi sınırı dolduktan sonra çökme

Görev_4:
Doğru zamanda bazı eylemler gerçekleştirin.

Yani…
İlk verileri yapılandırmaya yazıyoruz:

Session_start (); // Oturumu başlat $ num_starts \u003d 120; // Belirli bir süre içinde başlatılan komut dosyası sayısı $ saat \u003d 1; // Betiği $ num_starts kez çalıştırmanız gereken saat sayısı. $ time_sec \u003d $ saat * 3600; // Başlangıç \u200b\u200bdöngüsündeki saniye sayısı $ time_to_start \u003d array (); // Aslında, başlangıç \u200b\u200bzamanlarına sahip bir dizi ignore_user_abort (1); // Bağlantısı kesilen tarayıcı bağlantısını yoksay

Ardından, başlatma zamanlarını oluşturmamıza yardımcı olacak bir işlev yazıyoruz.
İçinde 0'dan orijinal aralıktaki saniye sayısına kadar rastgele bir sayı üretiriz.
/ ****** * @desc Başlatma arasındaki aralığı oluşturun. * / function add_time2start () (global $ zaman_sec, $ zaman_başlangıç; $ yeni_saat \u003d zaman () + rand (0, $ zaman_sec); if (! in_array ($ yeni_saat, $ zaman_başlangıç)) (// Dizide böyle bir zaman yoksa - $ time_to_start \u003d $ new_time;) add_time2start (); // Eğer böyle bir zaman zaten varsa, onu yeniden oluştururuz.))

$ k \u003d 1; eğer ($ _SESSION ["num_st"] \u003d\u003d "" || $ _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; }

Şimdi, sunucu tarafından belirlenen maksimum yürütme süresine bakılmaksızın betiği çalıştırmamız gerekiyor.
Prensip aşağıdaki gibidir:
1) Komut dosyasının başlangıç \u200b\u200bzamanını belirleyin;
2) Yürütme süresi için ayarlanan sınırı belirleyin.
3) İçinde mevcut zamanı saydığımız ve betiğin toplam çalışma süresini hesapladığımız döngüyü başlatıyoruz, başlangıç \u200b\u200bzamanı dizisindeki değerlerle geçerli zamanı kontrol ediyoruz ve bir eşleşme varsa, belirtilen eylemleri gerçekleştiriyoruz (bunları exec.php dosyasında var). Dosyaları çalıştırmak için soketler kullanıyoruz.
4) Komut dosyasının çalışma süresi izin verilen maksimum değere yaklaşana kadar döngüyü tekrarlayın. Ben koydum - maksimum süre 5 saniye olana kadar.

Yani ... ilk verileri zamana göre hesaplıyoruz:

$ başlangıç_süresi \u003d mikrozaman (); // Betiğin başlangıç \u200b\u200bzamanını bulun $ start_array \u003d explode ("", $ start_time); // Saniyeleri ve milisaniyeleri ayırın $ start_time \u003d $ start_array; // komut dosyasının başlangıç \u200b\u200bzamanını al $ max_exec \u003d ini_get ("max_execution_time"); // Betiğin mümkün olan maksimum çalışma süresini alın
Aslında döngü. Koddaki yorumlar.

Do ($ nowtime \u003d time (); // Geçerli saat //// Geçerli saat, komut dosyası yürütme sürelerini içeren dizide ise ...... if (in_array ($ nowtime, $ _SESSION ["num_st"])) ( // Bir soket kullanarak, $ http \u003d fsockopen ("test.ru", 80); /// eylemlerinin ana içeriğine sahip dosyaya yapışırız, aynı zamanda oturum verilerini ve fputs'u ($ http, "GET http: // test) .ru / exec.php? ". session_name ()." \u003d ". session_id ()." & nowtime \u003d $ nowtime HTTP / 1.0 \\ r \\ n "); fputs ($ http," Host: test.ru \\ r \\ ); $ now_array \u003d explode ("", $ now_time); $ now_time \u003d $ now_array; // başlangıçtaki $ exec_time \u003d $ now_time - $ start_time + $ exec_time; /// ikinci bir usleep için yavaşlama (1000000); // Komut dosyasının arka planda çalışmasını durdurun. Başka bir yol bulamadım. If (file_exists ("stop.txt")) exit; // Pr Çalışma süresini kontrol ediyoruz, betiğin sonuna kadar 5 saniyeden az kalırsa // döngüyü sonlandırıyoruz. ) while ($ exec_time< ($max_exec - 5));

İzin verilen süre sona eriyorsa, döngüyü sonlandırır ve aynı betiği diğer işlemlerle güvenli bir şekilde başlatırız (sadece 5 saniye içinde tutacağız)

// Aynı betiği yeni bir işlemle çalıştırın ve geçerli olandan çıkın $ http \u003d fsockopen ("test.ru", 80); fputs ($ http, "GET http://test.ru/index.php?".session_name()."\u003d".session_id()."&bu\u003d$max_exec HTTP / 1.0 \\ r \\ n"); fputs ($ http, "Ana Bilgisayar: test.ru \\ r \\ n"); fputs ($ http, "\\ r \\ n"); fclose ($ http);

Her şeyi yazmayı bitirdiğimde, kullanışlı uygulaması beni şaşırttı ... Hizmet olarak kullanabilirsiniz. Ağdaki bir şeyi izleyebilir ve size örneğin posta yoluyla bildirimde bulunabilir. Ve herhangi bir cron'a ihtiyacınız yok.

Komut dosyası hala optimize edilebilir - revize edilmemiştir.
Bu arada, kendimi bundan alıkoyamadığım şey de bu - betiği başlangıçta çalıştırmak için tarayıcının hala açılması gerekiyor.

8 yıl önce

FastCGI'da aşağıdaki yorumlara göre exit () 'i çağırmaktan kaçınmak, ancak gerçekten, olumlu bir şekilde iç içe geçmiş işlev çağrısından veya dahil etmekten temiz bir şekilde çıkmak istiyorsanız, bunu Python yolu ile yapmayı düşünün:

systemExit adında bir istisna tanımlayın, exit () 'yi çağırmak yerine onu atın ve komut dosyasının çalışmasını temiz bir şekilde bitirmek için index.php'de boş bir eylemciyle yakalayın.

// dosya: index.php
sınıf SystemExit Exception'ı () genişletir
deneyin (
/ * kod kodu * /
}
catch (SystemExit $ e) (/ * hiçbir şey yapma * /)
// dosyanın sonu: index.php

// derinlemesine iç içe geçmiş bir işlev veya .php dosyası

Eğer (SOME_EXIT_CONDITION)
yeni SystemExit () atar; // exit () yerine

?>

10 yıl önce

Gmail'deki Jbezorg şunları önerdi:


başlık ("Konum: /");

?>

"Location:" başlığını gönderdikten sonra PHP _will_ ayrıştırmaya devam edecek ve header () çağrısının altındaki tüm kod çalıştırılacaktır. Bunun yerine şunu kullanın:

Eğer ($ _ SERVER ["SCRIPT_FILENAME"] \u003d\u003d __FILE__)
{
başlık ("Konum: /");
çıkış;
}

?>

10 yıl önce

Klikzltd dot co dot uk şirketinde rich dot lovely için:

Hatasını bastırmak için header () 'dan önce bir "@" kullanmak ve "zaten gönderilen başlıkları" hatasına güvenmek, ciddi bir web sitesi oluştururken bana çok kötü bir fikir gibi geliyor.

Bu, bir dosyanın doğrudan çağrılmasını önlemenin temiz bir yolu * değildir *. En azından, çalışma zamanında ayrıştırıcı tarafından gönderilen bir istisnanın varlığına güvendiğiniz için bu güvenli bir yöntem değildir.

Bir sabiti tanımlamak veya herhangi bir değere sahip bir değişkeni atamak için daha yaygın bir yol kullanmanızı ve dahil edilen komut dosyasında aşağıdaki gibi varlığını kontrol etmenizi öneririm:

index.php içinde:
tanımla ("INDEX", doğru);
?>

dahil dosyanızda:
eğer (! tanımlı ("INDEX")) (
ölmek ( "Bu betiği doğrudan arayamazsınız!");
}
?>

BR.

4 yıl önce

Exit ile birlikte exit kullanımı için bir yan not: try bloğunda bir yerden çıkarsanız, sonunda çalıştırılmayacaktır. Ses gelmiyor: örneğin Java'da hiçbir zaman çıkış yapmazsınız, en azından denetleyici; PHP'de bunun yerine kendinizi bir denetleyici yönteminden çıkarken bulabilirsiniz (örneğin bir yeniden yönlendirme yaptığınızda).

İOOY aşağıdaki gibidir:

echo "nihayet çıkışla test ediliyor \\ n";

deneyin (
echo "Denemede, çıkılıyor \\ n";

Çıkış;
) catch (İstisna $ e) (
echo "yakalandı \\ n";
) en sonunda (
echo "sonunda \\ n";
}

echo "Sonunda \\ n";
?>

Bu yazdıracak:

sonunda çıkışla test etmek
Denemede çıkılıyor

1 yıl önce

\u003e\u003e Kapatma işlevleri ve nesne yıkıcılar, çıkış çağrılsa bile her zaman yürütülür.

Çıkışı desctructor'a çağırırsanız yanlıştır.

Normal çıkış:
a sınıfı
{
{
echo "güle güle A \\ n";
}
}

b sınıfı
{
public function __destruct ()
{
echo "güle güle B \\ n";
}
}

$ a \u003d yeni A;
$ b \u003d yeni B;
çıkış;

// Çıktı:
// güle güle B
// güle güle A
?>

// Açıklayıcıdan çıkın:
a sınıfı
{
public function __destruct ()
{
echo "güle güle A \\ n";
}
}

b sınıfı
{
public function __destruct ()
{
echo "güle güle B \\ n";
çıkış;
}
}

$ a \u003d yeni A;
$ b \u003d yeni B;

// Çıktı:
// güle güle B
?>

17 yıl önce

Çok sayıda içeren şablon kullanıyorsanız, exit () komut dosyasını sonlandıracak ve şablonunuz tamamlanmayacaktır (hayır, , vb ...). İçeriğinizde karmaşık iç içe geçmiş koşullu mantık kullanmak yerine, tüm HTML'nizi kapatan bir "footer.php" dosyası oluşturun ve bir komut dosyasından çıkmak istiyorsanız, çıkmadan önce () altbilgiyi dahil edin ().

include ("header.php");
blah blah blah
eğer (! $ mysql_connect) (
echo "bağlanılamıyor";
include ("footer.php");
çıkış;
}
blah blah blah
include ("footer.php");

16 yıl önce

Bazı durumlarda, özellikle PHP ikilisi ve kabuğuyla uğraşırken, geri dönüş tercih edilebilir.

Bir posta takma adının alıcısı olan bir komut dosyam var, örn. bu takma ada gönderilen posta, posta kutusuna teslim edilmek yerine komut dosyasına aktarılır. Bu komut dosyasında çıkış kullanılması, e-postayı gönderenin teslim hatası bildirimi almasına neden oldu. İstenen davranış bu değildi, betiğin gereksinimlerini karşılamayan mesajları sessizce atmak istedim.

Sendmail'i tatmin etmek için exit () 'e hangi tamsayı değerini iletmem gerektiğini bulmaya çalıştıktan birkaç saat sonra, exit yerine return kullanmayı denedim. Bir cazibe gibi çalıştı. Sendmail çıkıştan hoşlanmadı, ancak geri dönüşten çok memnun kaldı. Bu nedenle, çıkış ve diğer sistem ikili dosyalarında sorun yaşıyorsanız, bunun yerine return kullanmayı deneyin.

3 yıl once

"Boşluk bilgisi eksikliğine" ek olarak, burada sabit olmayan tek satırlık bir program vardır:



Bir PHP dosyasının başına yerleştirmek betiğe doğrudan erişimi engelleyecektir.

Ölmek yerine yönlendirmek için:

eğer (tabanadı ($ _SERVER ["PHP_SELF"]) \u003d\u003d tabanadı (__FILE__)) (
eğer (ob_get_contents ()) ob_clean (); // ob_get_contents (), aktif çıktı tamponlaması olmadan bile çalışır
başlık ("Konum: /");
ölmek;
}
?>

Aynı şeyi tek satırda yapmak:



Güvenliğe bir not: $ _SERVER ["PHP_SELF"] kullanıcıdan gelse de, "manipülasyon" gerçek dosya yürütmeden _ önce_ gerçekleştiğinden, geçerliliğini kabul etmek güvenlidir, yani _must_ dizesi yeterince geçerli olmuştur Ayrıca, basename () ikili olarak güvenlidir, bu nedenle bu işleve güvenle güvenebilirsiniz.

7 yıl önce

Php-fpm kullanırken, register_shutdown_function () ve exit () yerine fastcgi_finish_request () kullanılmalıdır

Örneğin, nginx ve php-fpm 5.3+ altında, bu, tarayıcıların çıktıyı göstermek için 10 saniye beklemesini sağlayacaktır:

eko "Bunu görmek için 10 saniye beklemelisin.
"
;
register_shutdown_function ("kapatma");
çıkış;
işlev kapatma () (
uyku (10);
Eko "Çünkü exit () php-fpm çağrılarını hemen sonlandırmaz.
"
;
}
?>

Bu değil:

eko "Bunu hemen tarayıcıdan görebilirsiniz.
"
;
fastcgi_finish_request ();
uyku (10);
Eko "Bunu tarayıcıdan göremezsiniz.";
?>