PHP diş var mı?

12 Cevap php

Ben bu PECL package called threads buldum, ama bir sürüm henüz yoktur. Ve hiçbir şey PHP web sitesinde geliyor.

12 Cevap

Ben farkında olduğumu kullanılabilir bir şey yok. Sonraki en iyi şey, sadece tek bir komut CLI üzerinden başka yürütmek için olurdu, ama bu biraz ilkel bulunuyor. Yapmaya çalıştığınız ve ne kadar karmaşık olduğunu ne bağlı olarak, bu ya da bir seçenek olmayabilir.

pthreads uzantısı için PHP manuel:

pthreads PHP kullanıcı-kara multi-threading sağlayan bir nesne Orientated API. Bu Web veya Konsolu hedefleyen çok iş parçacıklı uygulamaları oluşturmak için gereken tüm araçları içerir. PHP uygulamaları oluşturmak, okuma, yazma, yürütme ve lifler, İşçi ve Takılabilir ile senkronize edebilirsiniz.

Bu sesler gibi inanılmaz gibi, bu tamamen doğru. Bugün, PHP bunu denemek isteyenler için-konu çoklu olabilir.

PHP4, 2000, 22 Mayıs ilk sürümü, PHP bir iş parçacığı güvenli mimarisi ile sevk edildi - o multi-threaded SAPI (Server API) ortamları ayrı konuda tercüman birden çok örneğini çalıştırmak için bir yol. Son 13 yılda, bu mimari tasarım muhafaza edilmiştir ve gelişmiş: O zamandan beri dünyanın en büyük web sitelerinde üretim kullanımı olmuştur.

Kullanıcı arazi Threading PHP takım için bir endişe yoktu, ve bu gibi bugün kalır. Donanım eklemek - Sen PHP bir iş yapar dünyada, ölçekleme tanımlanmış bir yöntem zaten var olduğunu anlamalıdır. Uzun yıllar boyunca PHP, var olan donanım ucuz ve daha ucuz var ve bu yüzden bu PHP takım için bir endişe daha az oldu. O ucuzluyor iken, aynı zamanda çok daha güçlü var; Bugün, bizim cep telefonları ve tabletler çift ve dört çekirdekli mimarileri ve bol RAM onunla gitmek için, bizim masaüstü ve sunucular var yaygın biz her zaman iki olması mümkün olmayabilir ama, 8 veya 16 çekirdeği, 16 ve RAM 32 gigabayt bütçe içinde ve iki masaüstü sahip çoğumuz için pek yararlı değildir.

Ayrıca, PHP olmayan programcı için yazılmış birçok hobi anadili. Öğrenmek ve yazmak kolay bir dildir çünkü PHP kolayca benimsenen nedenidir. PHP bugün çok güvenilir nedeni, tasarım bulunuyor girer işin büyük miktarda ve PHP grubu tarafından yapılan her bir karar olduğunu. Bu güvenilirlik ve saf ihtişamı bütün bu yıllar sonra, spot ışık tutmak oluyor; s rakipleri zaman ya basınca düşmüş nerede.

Multi-parçacıklı programlama bile en tutarlı ve güvenilir API ile, düşünmek, farklı şeyler, ve pek çok yanlış var, çoğu için kolay değildir. - Ve haklı PHP grup çekirdek özelliği olmayı kullanıcı kara çoklu iş parçacığı için istemiyorsanız, ciddi önem verilir olmamıştı. PHP herkes için, karmaşık olmamalıdır.

Daha eklerken, her şeyi kabul, PHP biz ne en iyi şekilde yapmak için bir araç sağlamak için bu kadar üretim hazır ve test özellikleri kullanmak için izin gelen vardı için faydaları hala vardır, her zaman bir seçenek değildir, ve bir çok görevleri gerçekten ihtiyaç asla.

evreleri, multi-thread PHP uygulamaları için bir kullanıcı izin vermez bir API keşfetmek isteyenler için, başarır. Bu API var çok devam eden bir çalışma olduğunu, istikrar ve bütünlüğü bir beta düzeyi belirlenen.

Bu kütüphaneler PHP kullandığı bazı parçacığı güvenli değil ortak bilgi, bu evreleri bu değiştiremezsiniz programcı açık olmalıdır, ve denemek için teşebbüs etmez. Ancak, iş parçacığı güvenli olan herhangi bir kütüphane tercüman başka iş parçacığı güvenli kurulum olarak, kullanılabilir olduğunu.

evreleri (hatta Windows) Posix'e Konuları kullanır, ne programcı yaratır yürütmenin gerçek parçacığı vardır, ancak bu konuları yararlı olması için, onlar PHP farkında olmalıdır - kullanıcı kodu, pay değişkenleri yürütmek ve iletişim yararlı bir araç sağlamak mümkün (senkronizasyon). Böylece her iplik tercüman bir örneği ile oluşturulan, ancak tasarım, o tercüman tercüman diğer tüm örneklerden izole mi - sadece çok dişli Server API ortamlar gibi. pthreads aklı başında ve güvenli bir şekilde köprü çalışır. C parçacığı programcı kaygılar çoğu sadece tasarım, evreleri okuma kopyalamak ve (RAM ucuz) yazıp kopyalama, Pthreads bir programcı için orada değildir, bu nedenle herhangi iki durum hiç aynı fiziksel verileri işlemek , ancak her ikisi de başka bir iş parçacığı verileri etkileyebilir. PHP içinde konu güvensiz özelliklerini kullanabilirsiniz gerçeği çekirdek programlama, kullanıcı ipler tamamen alakasız olduğunu ve operasyonları tamamen güvenlidir bulunuyor.

Why copy on read and copy on write:

public function run() {
    ...
    (1) $this->data = $data;
    ...
    (2) $this->other = someOperation($this->data);
    ...
}

(3) echo preg_match($pattern, $replace, $thread->data);

(1) okuma ve yazma kilidi Pthreads üzerinde tutarken veri deposu nesne, veri nesne deposuna bellekte özgün konumundan kopyalanır. evreleri değişken refcount ayarlamak değil, Zend buna başka referanslar varsa orijinal verileri ücretsiz yapabiliyor.

Bu bir okuma kilidi tutulduğu oluşur iken (2) someOperation için argüman, kendisi (1) sonucu bir kopyası, bir zval kabın içine motoru için tekrar kopyalanan nesne deposunu, orijinal veri depolanmış, başvuruyor nesne deposu, kilit serbest bırakılır ve motor fonksiyonunu yürütebilirsiniz. Zval oluşturulduğunda, bunun için başka bir başvuru bulunması nedeniyle, işlemin tamamlanması kopyasını ücretsiz motor sağlayan, 0 bir refcount vardır.

(3) başvuruları veri deposunu preg_match'in için son argüman, bir okuma kilidi elde edilir, (1) ayarlanan veri 0 refcount ile tekrar bir zval kopyalanır. Kilidi serbest bırakılır, preg_match'in için çağrı çalışır verilerin bir kopyasını, bu özgün verilerin bir kopyasını kendisidir.

Things to know:

  • The object store's hash table where data is stored, thread safe, is
    based on the TsHashTable shipped with PHP, by Zend.

  • Nesne mağaza okuma vardır ve kilit yazmak, bir ek erişim kilit TsHashTable için sağlanan gerektiriyorsa (ve öyle, PHP motoru gibi özelliklere var_dump / print_r, doğrudan erişim onları referans istiyor) böyle evreleri TsHashTable işleyebilirsiniz tanımlanmış API dışında.

  • Kopyalama işlemleri sırasında meydana kopyalar mantıklı bir sırayla, kilitleri serbest bırakılır yapıldığında kilitleri, tutulur.

This means:

  • When a write occurs, not only are a read and write lock held, but an additional access lock. The table itself is locked down, there is no possible way another context can lock, read, write or affect it.

  • When a read occurs, not only is the read lock held, but the additional access lock too, again the table is locked down.

Hayır iki bağlamları fiziksel ne de eşzamanlı nesne deposundan aynı verilere erişebilir, ancak bir referans ile herhangi bir bağlamda yapılan yazıyor referans ile herhangi bir bağlamda okumak verileri etkileyecektir.

Bu hiçbir şey mimarisi ve mevcut tek yolu birlikte var olduğunu paylaşılır. Bu biraz anlayışlı, göreceksiniz ki burada olacak kopyalama çok şey var, ve bu iyi bir şey varsa onlar merak edecektir. Kopyalama oldukça çok dinamik bir çalışma içinde devam ediyor, bu dinamik bir dilin dinamikleri var. programcı yürütür kodu - - Yerel yöntemi kapsam - kilitleme ve kopya serbest bir bağlamı var iyi kontrol tek bir nesne üzerinde elde edilebilir, ancak yöntemler nedeniyle evreleri, nesnenin düzeyde uygulanır. Bir evreleri nesne durumunda nesne kapsam bağlamlar arasında veri paylaşımı için bir yol olarak tedavi edilmelidir, o amaç olması. Bu düşünceyle bunu gerekli olmadıkça böyle bir dişli nesne diğer yöntemlere yerel kapsam değişkenleri geçen ziyade onları yürütme üzerine nesne deposundan kopyalamak sahip olarak, nesne deposunu kilitleme önlemek için teknikler kabul edebilir.

PHP için mevcut kütüphaneler ve uzantıları çoğu 3. şahıslara etrafındaki ince sargı olan, bir dereceye kadar PHP çekirdek işlevsellik aynı şeydir. pthreads Posix'e Konular etrafında ince bir sarıcı değildir; Bu Posix'e Konular dayalı bir diş API. Kullanıcıların anlamıyorum ya da kullanamazsınız olduğunu PHP Konuları uygulanmasında hiçbir anlamı yoktur. Bir mutex ne olduğunu veya ne hiçbir bilgi ile bir kişinin beceri ve kaynakları açısından hem de sahip oldukları tüm yararlanmak mümkün olmamalıdır hiçbir neden yok. Bir nesne bir nesne gibi fonksiyonlar, ancak iki bağlamlar aksi çarpıştığını olurdu her yerde, evreleri istikrar ve güvenliği sağlar.

Iki iş parçacığı aynı fiziksel verileri yazmak eğer java zamanı tarafından yükseltilmiş bir hata gibi sesler - java çalıştı herkes bir evreleri nesne ve java diş, bu aynı insanlar ConcurrentModificationException adında bir hata görüldü hiç şüphem yok olacak arasındaki benzerlikleri göreceksiniz aynı zamanda. Neden var anlıyorum, ama bu beni karıştırma bu kaynaklara sahip oldukları ucuz olarak, çalışma zamanı seçtiği, bu güvenlik kullanıcı için elde edilebilir kesin ve tek seferde eşzamanlılık tespit edebilmektedir gerçeği ile birleştiğinde Zamanında bir olasılıkla ölümcül hata atmak yerine veri yürütme ve erişimi yönetmek.

Böyle aptalca hatalar API olarak istikrarlı parçacığı yapmak için yazılır, Pthreads yaydığı ve mümkün olduğu gibi uyumlu olacak, ben inanıyorum.

Multi-Threading, yeni bir veritabanı kullanarak gibi değil, yakın ilgi Pthreads ile birlikte kılavuzda ve örnekler her kelimeye dikkat edilmelidir.

Son olarak, PHP manuel:

evreleri, oldukça iyi sonuçlar ile bir deneme idi ve. Sınırlamalar veya özelliklerden biri herhangi bir zamanda değişebilir; Bu deney doğasıdır. It sınırlamalar - sık sık uygulanması dayattığı - iyi bir nedenle var; Pthreads amacı herhangi bir düzeyde PHP multi-tasking için kullanışlı bir çözüm sağlamaktır. Yürütür PThreads ortamında, bazı kısıtlamalar ve sınırlamalar istikrarlı bir ortam sağlamak için gereklidir.

İşte Wilco önerilen ne bir örnek:

$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!';
$pid = shell_exec($cmd);

Temelde bu komut satırından PHP komut çalıştırır, ama hemen PID verir ve sonra arka planda çalışır. (Echo $! Başka bir şey PID dışında döndürülür sağlar.) Bu PHP komut devam ya da isterseniz çıkmak için izin verir. Ben bu kullandığınız zaman, her 5 ila 60 saniye bir AJAX çağrısı raporu hala çalışıyorsa kontrol etmek için yapılan bir başka sayfasında, kullanıcı yönlendirildi. (. Ben gen_id ve ile alakalı kullanıcı depolamak için bir tablo var) onay komut aşağıdaki çalıştırır:

exec('ps ' . $pid , $processState);
if (count($processState) < 2) {
     // less than 2 rows in the ps, therefore report is complete
}

Burada bu tekniği bir kısa mesaja vardır: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

Sana pcntl_fork() dişlerine benzer bir şey elde etmek için kullanabilirsiniz. Teknik olarak ayrı süreç olduğunu, bu nedenle ikisi arasındaki iletişim konuları ile basit değildir, ve ben PHP apache tarafından çağrılırsa, o iş olmaz inanıyorum.

Kısacası: Evet, orada php mulithread ancak bunun yerine çoklu işlem kullanmalısınız.

Backgroud info: threads vs. processes

Orada parçacığı ve süreçlerin ayrım hakkında biraz karışıklık her zaman, bu yüzden kısa bir süre iki anlatacağım:

  • A thread CPU işleyecek komutları bir dizidir. Bu oluşmaktadır tek bir program veri sayacıdır. Her CPU çekirdek bir seferde sadece tek bir konuyu işleyecek ancak zamanlama üzerinden farklı olanların yürütme arasında geçiş yapabilirsiniz.
  • A process paylaşılan kaynakların bir dizi. İşte bu yüzden bellek, değişkenler, nesne örnekleri, dosya kolları, muteksler, veritabanı bağlantıları ve bir parçası oluşur demektir. Her bir işlem, aynı zamanda, bir ya da daha fazla iş parçacığı içerir. Aynı süreç payı kaynaklarının tüm konuları, size başka oluşturduğunuz bir iş parçacığı bir değişken kullanabilir böylece. Bu iş parçacığı iki farklı süreçlerin parçaları ise, o zaman doğrudan birbirlerinin kaynaklarına erişemiyor. Bu durumda inter-process communication aracılığıyla ihtiyaç örn. borular, resimler, prizler ...

Multiprocessing

Php ile (aynı zamanda yeni bir konu içeren) yeni süreçler oluşturarak paralel hesaplama elde edebilirsiniz. Lütfen konuları fazla iletişimi ya da senkronizasyon ihtiyacınız yoksa süreçler izole edilmiş ve birbirlerinin çalışmalarına müdahale edemez, çünkü bu, sizin tercihinizdir. Bir çöküyor bile, bu başkalarını ilgilendirmez. Eğer fazla iletişimi ihtiyacınız yaparsanız, "çoklu" ya da okumak gerekir - ne yazık ki - süreç-arası iletişim ve senkronizasyon tenli bir sürü tanıtır nedeniyle, başka bir programlama dilini kullanarak düşünün.

Php yeni bir süreç oluşturmak için iki yol vardır:

let the OS do it for you: Yeni bir süreç oluşturmak için işletim sistemini anlatmak ve ona yeni bir (ya da aynı) php komut dosyası çalıştırabilirsiniz.

  • linux Eğer aşağıdaki kullanabilir veya düşünün için Darryl Hein's answer:

    $cmd = 'nice php script.php 2>&1 & echo $!';
    pclose(popen($cmd, 'r'));
    
  • windows Bu kullanabilirsiniz için:

    $cmd = 'start "processname" /MIN /belownormal cmd /c "script.php 2>&1"';
    pclose(popen($cmd, 'r'));
    

do it yourself with a fork: php de fonksiyonu sayesinde bölmek kullanma imkanı sağlar pcntl_fork(). Bunun için nasıl iyi bir öğretici bulunabilir here ama fork is a crime against humanity ve özellikle OOP karşı şiddetle, kullanmak için tavsiye etmiyoruz.

Multithreading

Arasında kolaylıkla iletişim ve havai bir sürü olmadan bunları senkronize edebilirsiniz böylece mulithread ile tüm konuları kendi kaynaklarını paylaşır. Yarış koşulları ve kilitlenmeleri üretmek kolay ama hata ayıklamak çok zor olduğundan, diğer tarafta, ne yaptığınızı bilmeniz gerekir.

Standard php does not provide any multithreading but there is an (experimental) extension that actually does - pthreads. Its api documentation even made it into php.net. With it you can do some stuff as you can in real programming languages :-) like this:

class MyThread extends Thread {
    public function run(){
        //do something time consuming
    }
}

$t = new MyThread();
if($t->start()){
    while($t->isRunning()){
        echo ".";
        usleep(100);
    }
    $t->join();
}

linux stackoverflow evinde burada bir installation guide oradadır.

windows şimdi biri vardır için:

  • Öncelikle php evreli sürümü gerekir.
  • Sen Pthreads ve php uzantısı hem de önceden derlenmiş sürümleri gerekir. Onlar indirebilirsiniz here. Eğer php sürümü ile uyumlu olan sürümünü indirmek emin olun.
  • Php uzantısı klasör ([phpDirectory] / ext) kopyalayın php_pthreads.dll (zip sadece indirilebilir).
  • [PhpDirectory] (- uzantısı klasör değil kök klasörü) içine pthreadVC2.dll kopyalayın.
  • [PhpDirectory] / php.ini düzenleyin ve aşağıdaki satırı eklemek

    extension=php_pthreads.dll
    
  • Bazı uyku veya yorumdur orada bir şey ile yukarıdaki komut ile test edin.

Ve şimdi büyük BUT: Bu gerçekten çalışıyor olsa da, php aslında çoklu için yapılmış değildi. Orada bir php parçacığı güvenli sürümü varsa ve v5.4 olarak neredeyse bug-free gibi görünüyor ama bir çok iş parçacıklı ortamda php kullanarak hareketsiz discouraged in the php manual (ama belki onlar sadece güncelleme vermedi onların Bu manuel, henüz). Bir çok daha büyük bir sorun olabileceği ortak bir sürü extensions are not thread-safe. Yani bu php uzantısı ile konuları alabilirsiniz ama muhtemelen yarış koşulları, kilitlenmeleri ve böylece kod kendiniz yazmadınız karşılaşacak böylece bağlı olarak konum fonksiyonları hala parçacığı güvenli değildir ...

Herkes umurunda, ben * php_threading * canlandırdı var (parçacıkları aynı, ancak benzer değil) ve ben aslında (biraz) iyi çalışır noktasına var!

Project page

Download (for Windows PHP 5.3 VC9 TS)

Examples

README

Ben şimdi iki yıldır bir üretim ortamında sorunsuz çalışmakta olan bir PHP parçacığı sınıf var.

İşte ben bunun üzerine yazdığı bir makalenin bir bağlantı: http://dev.funkynerd.com/knowledgebase/articles/7

Sadece bir güncelleme, onun PHP adamlar artık konu ve mevcut destek üzerinde çalıştıklarını görünüyor.

Here is the link to it: http://php.net/manual/en/book.pthreads.php

https://github.com/krakjoe/pthreads çok umut verici görünüyor PThreads dayalı activley gelişmiş olmanın bir Threading uzantısı yok

Ben bu yolu eski bir soru olduğunu biliyorum, ama http://phpthreadlib.sourceforge.net/ bakmak olabilir

İki yönlü iletişim, Win32 için destek ve gerekli hiçbir uzantıları.

Hiç appserver techdivision yaklaşık? Duydum

Bu php yazılı ve yüksek trafik php uygulamalar için Kancalarının yönetmek appserver olarak çalışır. Hala beta ama çok promesing.

Orada oldukça belirsiz olduğunu ve yakında kalktı için, denilen özellik ticks. Şimdiye için kullandım tek şey, bir betik SIGKILL (Ctrl + C) yakalamak ve incelikle kapatmak için izin vermektir.