PHP çoklu işlemleri için Grafikleri?

6 Cevap php

Hangi tasarım deseni bazı PHP süreçlerin yürütülmesini ve bir PHP süreçte sonuçların toplanmasını gerçekleştirmek için var?

Background:
I do have many large trees (> 10000 entries) in PHP and have to run recursive checks on it. I want to reduce the elapsed execution time.

6 Cevap

Amacınız az zaman ise - çözüm uygulamak için basit açıklamak için basit, ama değil.

(Sen bu konuda söz çok bilgi vermemektedir) bölmek için bir desen bulmak gerekiyor.

Sonra forks çocuklar işi yapmak için bir master işlemi kullanın. Kural olarak kullanmak işlemlerin sayısı n ve 2n, n, makine sahip çekirdeklerin sayısı olduğu arasında olmalıdır.

Eğer verimini üst düzeye çıkarmak için engellenmeyen IO kullanılarak düşünebilirsiniz bu veri dosyalarında saklanır varsayarsak. Bunu yapmamak sizin sürecinin en disk için bekleyen vakit geçirmek yapacaktır. PHP stream_select() size yardımcı olabilir vardır. Bunu kullanarak önemsiz olmadığını unutmayın.

Kullanmak için değil select karar verirseniz - süreçlerin sayısını artırarak yardımcı olabilir.


pcntl işlevlerine ilişkin olarak: Onlarla bir deamon (.., bölmek vb session id, çalışan kullanıcı, değişen uygun bir) yazdık ve bu yazılımın en güvenilir parça biri Ben yazdım. Bir hata görevlerden biri olsa bile o, her görev için işçileri çoğaltılır, çünkü diğerlerini etkilemez.

Php script, sen işlem yapmak için (exec kullanarak) başka bir komut dosyası başlatmak olabilir. Sonra ana iş parçacığı tarafından periyodik olarak okunabilir bir metin dosyasında durum güncellemelerini, kaydedin.

Not: exec 'd komut bir dosyaya çıktı tamamlamak boru için bekleyen php önlemek için:

exec('/path/to/file.php | output.log');

Alternatively, sen PCNTL fonksiyonlarını kullanarak bir komut dosyası çatal. Bu çatallı zaman ebeveyn veya çocuk olup olmadığını tespit etmek ve buna göre çalışabilir bir php komut dosyası kullanır. Orada ebeveyn / çocuk arasındaki iletişim amacıyla sinyalleri almak / göndermek işlevleri vardır, ya da bu dosyadan okunan bir dosya ve ebeveyne çocuk günlüğü var.

pcntl_fork kılavuz sayfası:

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
}

Bu, tek bir makinede tüm çalıştırmak bile, bir message queue kullanarak düşünün için iyi bir zaman olabilir.

Böyle bir btree gibi, daha verimli bir veri yapısını kullanabilirsiniz. PHP kez Java değil kullandı. Bu komut dosyasını deneyebilirsiniz: http://www.phpclasses.org/browse/file/708.html, bu btree bir uygulamasıdır.

Yeterli değilse Michael dediği gibi, sen desen azaltın / a Haritası uygulamak için Hadoop kullanabilirsiniz. Ben verimlilik için yardım görünmüyor, PHP süreç çatal olmaz.

Şahsen, ben müşteri olarak PHP kullanmak ve Hadoop'un her şeyi koymak olacaktır. Bu öğretici yardımcı olabilir: http://www.lunchpauze.com/2007/10/writing-hadoop-mapreduce-program-in-php.html.

Başka bir çözüm btree bir Java uygulaması kullanmak olabilir: http://jdbm.sourceforge.net/. JDBM bir B-ağacı + veri astructures kullanarak bir nesne veritabanı. Sonra bir web hizmeti ile veri açarak veya Quercus doğrudan erişerek PHP ile arama yapabilirsiniz

Soru biraz karışık gibi görünüyor.

Ben mutlak yürütme süresini azaltmak istiyorum.

Eğer geçen zaman demek istiyorsun? Kesinlikle verimini artıracak doğru veri yapısı kullanır, ancak belirli bir veri yapısı için, algoritmanın minmimum sırası algoritmasını uygulamak nasıl ile ilgisi mutlaktır, ve.

Hangi tasarım deseni .... gerçekleştirmek için var?

Design Patterns şey vardır hangi kod is, değil yazma programları için bir şablon ve müfredat tasarımı için kullanışlı bir araç. Bir model ile başlamak ve kod kendi içinde bir anti-desen sığması için.

Kimse veriler hakkında çok daha fazla ve nasıl onun yapılandırılmış, ancak verimlilik için anahtar sürücüsü, ağaç uygulamak için kullandığınız veri yapısı olacak bilerek withuot bu soruya cevap verebilir. Geçen süre sonra kesinlikle paralel yürütme bakmak önemli ise, ancak o da farklı bir araç işlemi gerçekleştiren dikkate değer olabilir - veritabanları çok büyük veri setleri ile başa çıkmak için optimize edilmiş, ancak unutmayın ki bir ağacı tanımlayan belirgin yöntem Bu alt-ağaçları ve izole ağacı yürüme gelince bir ilişkisel veritabanı çok verimsiz.

Adam düşündüren forking bir yanıt olarak size cevap verdi:

Ben PCNTL iyi bir çözüm değil "duydum". Herhangi bir deneyim?

Bunu nereden duydun? Kesinlikle bir CGI veya mod_php çağrılan komut çatallamak kötü bir fikir olduğunu, ancak komut satırından yapıyor yanlış bir şey. Uzun süren PHP süreçleri için bir google (orada kötü bir bilgi bir sürü uyardı) var mı. Ne yazmak kod temel OS bağlı olarak değişir - Eğer belirtilen ettik ki.

Ben ağacın parçaları kontrol edilmesi gereken ve sadece bu parçaların kontrol VE ağaç güncellendiğinde kontrolleri tetikleyen, ya da en azından 'kirli' olarak düğümleri işaretleme hangi belirleyerek performans sorunları büyük bir bölümünü çözmek olabilir şüpheli.

Bu faydalı bulabilirsiniz:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ http://en.wikipedia.org/wiki/Threaded_binary_tree

C.

Web veya CLI kullanarak?

Eğer internet kullanıyorsanız, size Quercus Sonra JAVA çoklu avantajlarını kullanabilirsiniz o bölümü intergrate olabilir.

Ben aslında Quercus olsa ne kadar güvenilir bilmiyorum. Ben de mesaj kuyruğuna bir tür kullanılarak ve kod üstlenmeden öneririm, bu nedenle kapsam gerekmez.

Belki bir Haritası / azaltın desen kodu yeniden olabilir. Daha sonra Sonra makineleri bir çift ile işleme kümeleyemezsiniz Hadoop'un de PHP kod çalıştırabilir.

Yararlı olup olmadığını bilmiyorum, ama aradım, başka bir proje geldi Gearman. Ayrıca PHP süreçlerini küme kullanılır. Ben Hadoop gitmek istediğiniz yol değilse, hem de azaltan komut dosyası ile birleştirmek sanırım.