WordPress’te PHP Asenkron Nasıl Kullanılır

PHP kodu seri olarak yürütür, yani bir şey birbiri ardına yapılır.Bir oturumda çok fazla işlem yapmanız gerektiğinde veya harici yangın çağrılarına güveniyorsanız bu bir sorun olabilir.Bu makalede, bu sorunun üstesinden gelmek için WordPress’te PHP Asenkron nasıl kullanılacağını göstereceğim.Sunucunun her bir istek için 30 saniyelik bir bekleme süresi sınırı ile yapılandırılması olağandışı değildir, bu da her oturum için işlerini yapmak için yapılması gereken süreyi sınırlar.Tabii ki, ön uç isteği tamamlamak için işlem gerekiyorsa, son kullanıcının 30 saniye sürmesi mümkün değildir.
Son zamanlarda ele almam gereken gereksinimlerin bir talepte ele alınamadığı bir durum yaşadım. Bunun için müşterim, biri yavaş ve güvenilmez bir hizmet olan üç harici yangın talebini tetiklemek için bir potansiyel form kullanıyor. Buna ek olarak, site ziyaretçilerini en kısa sürede teşekkür ederiz. Bir yangın talebi beklemem gerektiğini biliyorum, yüklenmesi 20 saniye süren bir teşekkür sayfası olacak. Güvenilemeyen uzaktan ateş, WordPress’te veri depolama gerektirdiğinden ve gerektiğinde yeniden seçilebilmesi ve yangın talebinin durumunu kaydetmek için gerekli iş miktarı 30 saniye içinde yapılamaz. işitme. Ayrıca veri depolayamayız, istekte bulunamayız, istek durumunu güncelleyemeyiz ve ardından yavaş yükleme süresi ile hayal kırıklığına uğramadan önce kullanıcıyı teşekkür sayfasına yönlendiremiyoruz. Cevap, verileri kaydetmek, görevleri eşzamansız atama yöneticileri ile planlamak, ardından kullanıcıyı yeniden yönlendirmektir. Daha sonra, üç yangın talebinin her biri kendi oturumlarında çalışacak, 30 saniye tamamlanacak ve kullanıcının deneyimini etkilemez. Veri depolamasını asenkron atamalara da taşıyabilirim – ancak bu gerekli değildir.
WordPress için özel olarak tasarlanmış birkaç eşzamansız atama yöneticisi vardır, ancak en iyi ve kullanımı en kolay olanlardan biri, TechCrunch’tan açık kaynaklı bir görevin yöneticisi olan ve 10UP tarafından geliştirilen WP-Async görevidir. WP-Async görevlerini kullanmak nasıl çalışır, eylem kancalarını kullanmanız gerekir. Bu, çekirdek, diğer eklentiler veya DO_ACE () aracılığıyla Hook ile olabilir. Genellikle, kanca oluştuğunda seri olarak birkaç işlem yapmak için doğrudan kancaya bağlanırsınız. WP-ASYNC ile kancanın işlenmesi bir sonraki oturuma askıya alındı. Bunu yapmak aslında oldukça basit. Kancalara, mülkle sınıflara ve sınıf örnekleri oluşturmak için iki yönteme ihtiyacımız var. Ve sonra kanca tarafından üretilen kancaya bağlanmamız gerekiyor. Görev Yöneticisi, WordPress’e yeni bir yazı isteği yapar ve daha sonra ikinci oturumda orijinal kancadan yeni kancanıza verileri sürdürür – bu genellikle yaptığınız bir şey değildir. Sorun: bir kerede veya bir sonraki bölümde hiç , Süreç boyunca size rehberlik edeceğim. Ama önce, bununla çalışmak için değiştireceğimiz kod türüne bakalım: add_action (‘Save_post’, ‘Josh_Send_to_Api’);
josh_send_to_api işlevi ($ id) {
$ thing = get_post_meta ($ id, ‘bir şey’, doğru);
$ r = wp_safe_remote_post (add_query_arar (‘id’, $ thing, ‘http://apisexample.com/’));
if (! Is_wp_error ($ r)) {
$ body = json_decode (wp_remote_retirve_body ($ r)));
if (isset ($ body-> anahtar)) {
update_post_meta ($ id, ‘api_response’, $ body-> tuş);
} değilse {
update_post_meta ($ id, ‘api_response’, ‘none’);
}
}
}
Bu kodla ilgili sorun, uzun mesafeli bir API talebi tamamlanana kadar bir yayın depolama sürecinin tamamlanmayacağıdır. Uzun mesafeli bir API isteği, sunucunun zamanından daha uzun sürerse, tamamlanmayacaktır. Mesajları depolamak, uzun mesafeli API’lara veri göndermek ve sonuçları meta olarak kaydetmek ayrı bir süreç olmak zorunda değildir. Bunun yerine, gönderinin her zamanki gibi saklanmasına izin verebiliriz ve daha sonra ikinci PHP oturumunda verileri alın ve yanıtları meta posta olarak kaydedin. WP-Async görevini kullanarak düzenlemek oldukça kolaydır, çünkü tüm ağır işler kütüphanenin kendisi tarafından ele alınır. Kütüphaneyi uygulamak, WP_ASYNC_TASK sınıfını genişleten ve üç basit şey yapan bir sınıf gerekir.
Bu sınıf, bu eşzamansız görev tarafından kullanılan eylemin adı olan mülk eylemini korumalı olmalıdır. Bu durumda, “Save_post” olacaktır. Deneyimlerime göre, birçok görevi bir kancayla ilişkilendirmenin güvenilemeyeceğini buldum. Bunun yerine, tek tek çalışan üç kanca yaptım ve ateşim için üç isteğim için bir tane kullandım.
Basit şeyleri korumak için “Save_post” a tutunalım. Sınıfa başlayalım: Josh_task sınıfı wp_async_task {

/**
* Bu görevi tetiklemek için kullanılan eylemler
*
* @var dize
*/
Korumalı $ aksiyon = ‘save_post’;
} İhtiyacımız olan bir sonraki şey, veri hazırlamak için kullanacağımız “prepare_data” adlı korunan bir yöntemdir. Bu yöntem hakkında bilinmesi gereken önemli şey, bu yöntemin, onu işleyen görevi değil, asenkronizmin atanmasını tetikleyen bir oturum sırasında çalışmasıdır. Hatırlamak önemlidir, çünkü mevcut oturumdaki tüm küresel ve süperglobal, bir sonraki oturuma iletilecek veriler olarak sizin için kullanılabilir. Bu yöntem tüm kanca parametrelerini içeren veri dizisini geçecektir. Üç parametre gösteren bir kanca kullanırsanız, birincisi sıfır anahtarda, ikincisi kilitte olur. Bu örnekte, ilk parametreyi yalnızca Save_Post ve ID Post’tan alıp bir sonraki oturuma göndermemiz gerekir. Prepare_data yöntemi, eşzamansız atamalar yapan oturumlar için verileri oluşturur. Oturumda ne istediğimiz ne olursa olsun prepare_data’da döndürülmeli veya veritabanında depolanmalıdır. Aşağıda bir yayın kimliği göndermek için güncellenmiş bir sınıf: Josh_task sınıfı wp_async_task {
/**
* Bu görevi tetiklemek için kullanılan eylemler
*
* @var dize
*/
Korumalı $ aksiyon = ‘save_post’;
/**
* Görevi işleyen bir oturuma gönderilecek yayın yayınlayın
*
* @Param Array $ veri paramleri kancalardan
*
* @return dizisi
*/
Korumalı işlev hazırlama_data ($ data) {
Dönüş dizisi (
‘Post_id’ => $ Veri [0]
);
}
}
Bu sınıfın üçüncü ve son yöntemi olan “Run_action”, gerçekten görevleri yerine getirmek için kullanılan korumalı bir işlevdir. Bu yöntem prepae_data’dan farklı bir oturumda çalıştırılır. Sonuç olarak, görevi yerine getirmek için ihtiyacınız olan verileri almak için bir Superglobal sonrası kullanmalısınız. Neyse ki, Post verileri hazırladığınız şeydir. Bu yöntemde, post_id’i gönderi ve sette doğrularız ve tamsayılar oluruz ve eğer öyleyse, diğer eylemleri gerçekleştirmek için kullanırız. WP-ASYNC-görev yazarı önek olarak wp_async_ kullanmayı önerir. Sınıf Josh_task wp_async_task {
/**
* Bu görevi tetiklemek için kullanılan eylemler
*
* @var dize
*/
Korumalı $ aksiyon = ‘save_post’;
/**
* Görevi işleyen bir oturuma gönderilecek yayın yayınlayın
*
* @Param Array $ veri paramleri kancalardan
*
* @return dizisi
*/
Korumalı işlev hazırlama_data ($ data) {
Dönüş dizisi (
‘Post_id’ => $ Veri [0]
);
}
/**
* Eşzamansız atamalar çalıştırın
*
* Send_to_api () çağıran
*/
Run_action () korumalı işlev () {
if (isset ($ _post [‘post_id’]) && 0 eylem”, $ _post [‘post_id’], get_post ($ _post [‘post_id’]);
}
}
}
Dersten sonra şimdi birleştirmek yerine, bunların hepsini birkaç basit adımda yapabiliriz. İlk adım, sınıf örnekleri oluşturmak için Plugins_Loaded veya daha yenidir. Açıkçası, WP-Async görev kütüphanesi orada olmalı ve bu noktadan önce dahil olmalıdır. Besteci aracılığıyla yüklemenizi öneririm. Ayrıca eklenti olarak yükleyebilirsiniz, bu da çok kötü bir fikirdir, çünkü eklenti devre dışı bırakılabilir. Yapmamız gereken ikinci şey, sınıfta çalışan yeni eylemlerimizi orijinal arka görüşmemize ilişkilendirmektir. İşte görünüm: add_action (‘wp_async_save_post’, ‘josh_send_to_api’);
josh_send_to_api işlevi ($ id) {
$ thing = get_post_meta ($ id, ‘bir şey’, doğru);
$ r = wp_safe_remote_post (add_query_arar (‘id’, $ thing, ‘http://apisexample.com/’));
if (! Is_wp_error ($ r)) {
$ body = json_decode (wp_remote_retirve_body ($ r)));
if (isset ($ body-> anahtar)) {
update_post_meta ($ id, ‘api_response’, $ body-> tuş);
} değilse {
update_post_meta ($ id, ‘api_response’, ‘none’);
}
}
} Daha AShnchronous Umarım bu makale neden PHP asenkron kullanmanız gerekebileceğini anlamanıza yardımcı olur. Pratik bir örnekle, artık sıradan WordPress siteleri kullanarak bunu nasıl yapacağınızı anlamalısınız. PHP asenkron için iki seans kullanmak olmasına rağmen, PHP asenkron ile ayaklarınızı PHP ile ıslatın, çünkü PHP7 PHP asenkronunu destekleyecektir.

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir