Yukarıda ve dış: Ajax ile PHP zaman sınırlarından ve bellek sınırlarından kaçınmak
Diğer bazı programlama dillerinden farklı olarak, PHP belirli istekleri işlemeyi durdurduğunda tamamen ölür.Farklı programlama dillerinin çok farklı bir ömrü vardır.Örneğin, bilgisayarınızın işletim sistemi, sürekli olarak çalışır, bellek harcıyor, vb. Bilgisayarınız yanar.Bilgisayarınızın kapatılacak ve klavyenizdeki düğmeye yapılan her vurgu arasında geri çekilecek olup olmadığını düşünün!Kulağa çılgınca geliyor (ve işletim sistemi için olacak), PHP çalışmasının birçok yolu.PHP, özellikle birçok istemciden bir kez istekte bulunarak bir web sunucusunda çalışacak şekilde tasarlanmıştır.Sunucu, aynı anda birçok (milyonlarca) müşteri ile konuştuğundan, en iyisi, istek tamamlandığında tüm istemci kaynaklarını serbest bırakmaktır.Sonuç olarak, belirli istekleri işlemeyi durdururken PHP tamamen ölür.
Bu nedenle, PHP kod tabanına yapılan her yeni istek, PHP’nin kendisini baştan yeniden inşa etmesini gerektirir – bu nedenle, örneğin, WordPress siteniz init ve üstünden birisi, birisi blogunuzda yeni bir yazı görmek istediğinde kendini inşa eder. Bu, ziyaretçiler her seferinde kendini yeniden inşa eden bir otel gibidir, ancak bunun web trafiğine hizmet etmenin en iyi yolu olduğu ortaya çıkıyor. PHP sonsuza kadar çalışamıyor PHP, uzun süren bir süreci ele almada çok kötü olduğu ortaya çıkıyor. PHP süreci çalıştığı veya mevcut olmadığı için, PHP uzun süren bir süreci ele almada çok kötü olduğu ortaya çıkıyor. PHP’yi bir trilyon satıra sahip bir veritabanı aracılığıyla işlemek veya 100GB video dosyasını sıkıştırmak ve dışa aktarmak veya insan genomlarını çözmek için kullanmak istiyorsanız, sorunlar yaşayacaksınız. PHP, o kadar uzun yaşamak için tasarlanmamıştır: PHP, istemeye veya hiçbir şey sormayan müşteriye bir yıldırım tepkisi sunmalıdır. “Arka planda yürümez”. Çözülmesi için birkaç saniyeden fazla bir komut dosyası yazarsanız, aşağıdaki sorunları deneyimlemeye başlayacaksınız: Sunucudan biter, zaman miktarını belirler Bu bir PHP işlemi tarafından kullanılabilir. Sunucu, bir PHP işlemi tarafından kullanılabilecek sürenin sınırını ayarlar. Bu iyi: Yaramaz PHP süreci kendini tekrar tekrar aramaya devam etmek istiyorsa, örneğin, arka arkaya beş yıl, çok külfetli bir sunucu. Süreci daha hızlı kesmek daha iyidir – örneğin 60 veya 120 saniye. Dolayısıyla, PHP zaman sınırı hatası, tamamlanması ve kapatılması için çok uzun süre istediğiniz PHP işleminin anlamına gelir.
Sunucu belleği sınırı hataları ayrıca PHP işlemleri tarafından kullanılabilecek sunucu kaynaklarının miktarını da sınırlar. Sunucu ayrıca PHP işlemleri tarafından kullanılabilecek sunucu kaynağı miktarını da sınırlar. Örneğin, veritabanını bir trilyon satırla dışa aktarmaya çalışan PHP işlemi, tüm sunucu belleğini kolayca alabilir, çünkü sunucu işlem sırasında her satırla ilgili ayrıntıları kaydetmeye çalışır. Sunucuyu bellekten bu şekilde çalıştırmak, durduğu diğer tüm şeylere neden olur. Dolayısıyla sunucu, PHP’nin aynı anda çok fazla bilgi depolama yeteneğini sınırlayan bir bellek sınırı -128MB, 256MB veya başka bir sayı vardır. Sunucu ayarlarınızı ayarlayarak bu iki hatanın belirli bir ölçüde üstesinden gelebilirsiniz. David, Php.ini ve Phpinfo () ‘daki makalesinde bu konuyu tartışan olağanüstü bir iş yaptı. Ama bu sadece şimdiye kadar çalışıyor; Özellikle, birçok ortak barındırma paketi sunucu yapılandırmanız üzerinde kontrol içermez. Bazen PHP’de büyük şeyler yapmanız gerekir, daha sonra tek tek çalıştırılan bir dizi daha küçük bireysel süreçte çok büyük bir PHP işlemini engellemek için Ajax kullanabilirsiniz. Web dünyası zaman alan zamanla doludur ve PHP’nin bazılarına dokunması gerekir. Büyük veritabanı geçişi açık bir şeydir ve örneğin, yüzlerce büyük görüntüyü toplu olarak medya kütüphanenize aktarın, bu da çok makul bir müşterinin isteği olabilir. WordPress kullanırsanız, PHP yeni işlevselliğin nasıl oluşturulacağı konusunda ana oyundur. Ne yapalım?
Bugün bir çözüm sunuyoruz: AJAX kullanın, daha sonra tek tek çalıştırılan bir dizi daha küçük bireysel sürece çok büyük bir PHP işlemini engellemek için kullanın. Kod: Ajax’ı aşağıdaki örnekte bellek sınırını ve zaman sınırını geri ödemek için kullanarak, zaman sınırları ve bellek hakkında endişelenmeden birçok sonsuz büyük dosyayı WordPress kurulumuna aktarmak için PHP’yi kullanabiliriz. Kod uyarı devam eden kod, PHP, JavaScript, JQuery, WordPress’teki AJAX, WordPress Hook System ve WP_LOCALICAL_SCRINK () hakkındaki bilgilere bağlıdır. Yani biraz önde. Konulardan birini cilalamanız gerekiyorsa, uygun bağlantıya tıklayın, konunun sitesini keşfedin veya bu makalenin yorumlarında bizimle iletişime geçin ve yardımcı olmaktan memnuniyet duyarız! Son kod çalışma kodunun bir numara alması gereken şey diğer sitelerden büyük dosyaların ve onu WordPress wpsout kurulumuna aktarın. Bunu yaparken, dosya boyutuyla birlikte yazdığı her dosyanın tarayıcı konsoluna kaydolur:
Büyütmek için tıklayın
Bu çözüm, örneğin, yakında sona erecek bir barındırma hesabından dışa aktarılması gereken 1.000 büyük görüntüye (örneğin IMG001.jpg) sahip müşterileriniz varsa ve müşteri kimlik bilgisi FTP bulamazsa yararlı olabilir. . Bu yöntem, kimlik bilgileriniz olsa bile FTP’den biraz daha hızlıdır!
Genel yaklaşım ve JavaScript sezgisi, PHP yapamasa da sürekli olarak çalışabilir, böylece AJAX kullanarak PHP’ye bir dizi bireysel istekte bulunan devam eden JavaScript yazabiliriz.
JavaScript’i bekleyen ve dosya işlemeyi yapan son noktayı sağlayan wpshout-ajax-file-copier.php.php
Ajax özyinelemeli istekleri yapan ve tarayıcı konsoluna bir yanıt kaydeden wpshout-ajax-file-copie.js
Komple eklentiler buradan indirilebilir: wpshout-ajax-file-copier.zip php kodu: wpshout-ajax-file-copier.php add_action (‘wp_enqueue_scripts’, ‘wpshout_ajax_copier_script’); İşlev wspout_ajax_copier_script () {if (! Is_single (‘yukarıda ve ötesinde: Ajax ile PHP zaman aşımı ve bellek sınırı hatalarından kaçınmak)) {return; } wp_enqueue_script (‘wpshout-ajax-file-copier’, eklenti_dir_url (__file__). $ Target_files = Array (‘Ebook.mobi’, ‘podcast.mp3’, ‘Video.mp4’); WP_LOCITALLE_SCRIPT (‘WPSHOUT-AJAX-FILE-COPIER’, ‘AJAX_VARS’, dizi (‘ajax_url’ => admin_url (‘admin-ajax.php’), ‘Target_files’ => $ Target_files))); } Add_action (‘wp_ajax_wpshout_copy_file_over’, ‘wspout_php_file_copier’); Add_action (‘wp_ajax_nopriv_wpshout_copy_file_over’, ‘wspout_php_file_copier’); İşlev wspout_php_file_copier () {$ file = $ _post [‘file’]; $ base = ‘https://presupinc.com/’; $ filestring = file_get_contents ($ base. $ file); $ bayt = file_put_contents (get_home_path (). $ dosya, $ filestring); if ($ bayt === yanlış) {echo ‘-1’; } else {echo $ bayt; } ölmek; } Yukarıdaki kod yorumları iki şey yapar. wspspout_ajax_copier_script () javascript dosyamızı kuyrukla, wpshout-ajax-file-copie.js. Ayrıca, kopyalamak istediğimiz dosya adı da dahil olmak üzere, oluşturduğumuz JS dosyasına bir dizi anahtar değişkeni sürdürmek için WP_LOCALICAL_SCRINK () kullanıyoruz.
İkincisi, Ajax isteklerini işleyen wpshout_php_file_copier () var. $ _Post aracılığıyla verilen (dize olarak) dosya adını almak için file_get_contents () kullanır, ardından dize geçerli WordPress kurulumunun ana dizininde aynı dosya adıyla yeni bir dosyaya yazmak için File_put_Contents () kullanır. Bu daha sonra Echo hata kodunu veya kopyalanan dosyadaki bayt sayısını döndürür. Kayıt için, yukarıdaki is_single () kontrolü, bu kodun yalnızca sitedeki belirli yayınlarda çalıştığı anlamına gelir, çünkü her site ziyaretçisi olduğunda 200 MB dosyayı kopyalamak istemiyoruz! (Sormadan önce, eklenti devre dışı bırakılır; sunucumuzu eritmezsiniz.) Bu sınavı gerçekten kullanmak için, büyük olasılıkla başka biri tarafından bulunmayan bir sayfa oluşturacaksınız (“Ajax fotokopi makinesi sayfalarım”) ve Set IS_PAGE () Kontrol edin veya daha da iyisi, kodun yalnızca WordPress yöneticisinde bir yerde düğmeye bastığınızda çalıştığından emin olmak için çok tembel/retas olmayan bir şey yapın.
JavaScript kodu: wpshout-ajax-file-copier.js jQuery (belge) .Ready (işlev ($) {var i = 0; işlev prosesFile () {if ((typeof ajax_vars.target_files [i] == ‘ ) {return;} $ .post (ajax_vars.ajax_url, {‘eylem’: ‘wspout_copy_file_over’, ‘dosya’: ajax_vars.target_files [i]}, işlev (yanıt) { ) {Console.log (‘dosya yazılamadı’ + ajax_vars.target_files [i] + ‘.’);} Else {console.log (‘Dosya yazdı’ + ajax_vars.target_files [i] + ‘,’ bytes toplamda . ‘);} i ++; processFile ();});} processFile ();});WP_LOCALICAL_SCRIPT () aracılığıyla verilen her dosya için yorumlar, bu JavaScript dosyası WP_AJAX_WPSHOUT_COPY_FILE_OVER () adresine Ajax istekleri yapar, dosya adına $ _Post dosyası özelliği olarak devam edin.Dahası, başarılı bir yanıt bekledi – aradığı PHP sürecinden bir şey döndü.”-1″ ise (“Bu başarısız” için kişisel kodumuz