PHP mulithread

7 Cevap php

Ben şu anda çok dişli bir PHP uygulama oluşturmak çalışıyorum. Ben çoklu iş parçacığı oluşturmak için nasıl açıklar kağıt çok okudum. Tüm bu örnekler, farklı işçi PHP dosyaları üzerinde işlemler dalış üzerine inşa edilmiştir. Aslında ben de bunu yapmaya çalışıyorum ne de ancak bir sorun var :)

There are too many jobs even to divide in 30 seconds (which is the execution time limit)

Biz işlemleri aynı bellek birbirlerine ya da hisse bağlı değilsiniz gibi süreçleri tamamlamak için yerel ağdaki çoklu sunucu ortamı kullanıyor. Biz sadece onları ateş ve onları kesin bir anda çalışabilecek izin gerekiyor. Süreçlerinin her 0.5 saniye boyunca çalışır ancak 30 saniye için çalışmak için bir olasılık vardır.

Örneklerin çoğu PHP'nin kadar patlar ve sonuç bekler. Ama ne yazık ki benim durumda ben parçacığı bir sonuç beklemek gerekmez. Ben sadece komutu çalıştırmak ve kendi veritabanına sonucu yazmak gerekir.

Nasıl Phps kadar yangın ve onları 10000 süreçleri için çalışmak beklemek elde edebilirsiniz?

ADDITIONAL INFO: I know that PHP neither have multi threading feature nor is built for. But we have to create a way to use it for instance we can send request to http://server1/dothis.php?jobid=5 but standart methods makes us wait for the result. If we can manage to send request to this server without waiting for result it would solve our problem I think or we will need completely different approach such as a process divider with c++ or qt.

7 Cevap

Işaret edildiği gibi, php çoklu iş parçacığı desteklemiyor. Ancak, ve sözü tomaszsobczak gibi, siz "konuları" oluşturmak ve onları çalışmasını terk edelim, ve "Gearman" denilen bu yüzden kendi durumunu ve kontrol etmek için başka komut ile kendilerine yeniden bir kütüphanesi var.

Projenin ana sayfasından: "Gearman işi yapmak için daha uygundur, diğer makineleri veya işlemlere çalışmalarını çiftliğine genel bir uygulama çerçeve sağlar It allows you to do work in parallel, to load balance processing, and to call functions between languages. Bu gelen, çeşitli uygulamalarda kullanılabilir yüksek. veritabanı çoğaltma olaylarının taşıma kullanılabilirlik web siteleri. Diğer bir deyişle, bu dağıtılmış işlem nasıl iletişim için sinir sistemidir. "

Rasmus' blog has a great write up about it here: playing with gearman and for your case, it might just be the solution, although I've not read any in depth test cases... Would be interested to know though, so if you end up using this, please report back!

Comments dediği gibi, çoklu iş parçacığı PHP mümkün değildir. Ama Yorumlarınız dayanmaktadır:

Biz sonuç için beklemeden bu isteği sunucuya göndermek için yönetebilirsiniz eğer bence bizim sorunumuzu çözecek

Sen kullanarak arka planda çalıştırmak için bir PHP komut dosyası başlayabilirsiniz exec() , redirecting the script's output somewhere else (e.g. /dev/null). Ben alırsınız iyi olduğunu düşünüyorum. Manuel:

Not: Bir program bu fonksiyon ile başladı ise, arka planda çalışmaya devam etmek için sırayla, programın çıktısı bir dosyaya veya başka bir çıkış akımına yeniden yönlendirilmesi gerekir. Aksi takdirde PHP programı biter yürütülmesine kadar askıda kalmasına neden olacaktır.

Orada Kullanıcı Katkıda Yorumları çeşitli notlar ve noktalar vardır, örneğin, this snippet hem de Windows ve Linux platformlarında plan yürütülmesine izin söyledi.

Tabii ki, PHP komut çalıştırdığınız PHP script, devlet, ya da herhangi bir veri paylaşımı olmaz. Eğer tamamen yeni bir istekte sanki arka plan senaryoyu başlatmak zorunda olacak.

Eğer gerçekten php multi-threading olmasını istiyor musunuz?

Yoksa sadece bir php komut dosyası her saniye yürütmek istiyorsun? İkinci durumda, bir cronjob gibi linux konsol araçları yoluyla yaklaşımı "bu dosyayı her saniye yürütmek" yeterli olmalıdır.

PHP çoklu destekleme yeteneğine sahip olmadığından, oldukça size tavsiyelerde bilmiyorum. Her zaman yeni bir script PHP yeni bir örneğini yüklenir, yüklenir, böylece sunucu X Birçok PHP örnekleri işleyebilir eğer, o zaman istediğinizi yapabilirsiniz.

İşte ancak bir şey olduğunu:

Code for background execution

 <?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 
?> 

http://php.net/manual/en/function.exec.php#86329 Found at

Göreviniz HTTP istekleri bir sürü yapmak için ise, çoklu cURL kullanabilirsiniz. Bunu yapmak için iyi bir kütüphane var: http://code.google.com/p/rolling-curl/

Herkes zaten belirttiğim gibi, PHP doğal multi-threading desteklemiyor ve geçici çözümler, iyi, geçici çözümler vardır ...

O dedi, Facebook PHP Compiler duymuş? Temelde son derece optimize C + + için PHP derler ve derlemeye + g+ kullanır. Bu ancak multi-threading bunlarla sınırlı olmamak üzere, bir fırsatlar dünyasının kapılarını açıyor!

Proje açık kaynak ve onun on github olduğunu

Eğer sadece bir HTTP isteği göndermek istiyorsanız, sadece PHP CURL lib kullanarak bunu. Bu sorunu çözecektir.