PHP uyumsuz yuva kullanabilir miyim?

5 Cevap php

Tipik PHP soket işlevselliği senkron olduğunu ve gelen bağlantıları ve veri için beklerken konu durdurur. (Örneğin, socket_read and socket_listen )

Nasıl aynı uyumsuz yapmalıyım? bu yüzden, vb yerine veri sorgulama, veri alınan olay verilere yanıt verebilir

5 Cevap

Evet, bu socket_set_nonblock() için budur. Sizin soket etkileşimi kodu dikkate hata kodları 11, EWOULDBLOCK özel anlamlar alarak, farklı yazılması gerekir, ve 115, EINPROGRESS, üstlenecek.

Istendiği gibi burada bir PHP senkronizasyon yuvası yoklama döngü bazı biraz-kurgulanmış örnek kod, bulunuyor:

$buf = '';
$done = false;
do {
    $chunk = socket_read($sock, 4096);
    if($chunk === false) {
        $error = socket_last_error($sock);
        if($error != 11 && $error != 115) {
            my_error_handler(socket_strerror($error), $error);
            $done = true;
        }
        break;
    } elseif($chunk == '') {
        $done = true;
        break;
    } else { 
        $buf .= $chunk;
    }
} while(true);

How do I do the same asynchronously? so I can respond to data in a data received event, instead of polling for data, etc.

Sen almak için herhangi bir veri yoktur weither kontrol etmek için komut ve sorun stream_cast yürütmek gerekir. Süreç ve geri veri göndermek.

Komut yürütme her zaman doğrusal çünkü AFAIK PHP kesinlikle, sen uyumsuz bunu yapamazsınız anlamına gelir, singlethreaded edilir.

Bu i bu yaptım beri bir süre oldu, ama kadarıyla ben hatırlamak, yalnızca yuva açın ve komut verileri aldıktan sonra yürütülmesine devam olabilir.

Terimi, "uyumsuz" sık sık ağ programlama kötüye kullanılmış. I / O için, asenkron genellikle sadece engellenmeyen için başka bir kelime olarak kullanılır. Bu işlem, ağ API üzerindeki bir çağrı iletimi tamamladı önce devam etmek mümkün olduğu anlamına gelir.

Genel işlem yürütülmesi için, asenkron birden fazla talimatları seferde (concurrently.) hesaplanması mümkün olduğu anlamına gelir

Tüm yuva okumak için veri varsa bir senkron engellenmeyen çağrı beklemek zorunda eşik olacak - Birden fazla iş parçacığı birden aynı anda meydana gelmesi kabul / yazma / okuma sağlamak için kullanılan sürece, diğer bir deyişle, asenkron I / O gerçekten uyumsuz değildir / yazılı veya başka bloke olmaz ve kesintiye değilse, büyük bir dosya yazma / okuma bile hala dakika saniye sürebilir ya da olabilir. Bu istemci ve sunucu veya TCP kendisi iletim kesecektir arasında mükemmel bir akış gerektirir unutmayın. Örneğin, bir müşteri daha hızlı gönderen bir sunucu bir yazma üzerinde bir blok neden olur indirebilirsiniz.

Yani görünümü PHP sıkı bir açıdan uyumsuz ağ, sadece sigara engelleme gerçekleştirmek mümkün değildir. Ağ çağrı çağrı yararlı okuma / yazma mümkün değil ya da blok olurdu Ancak, süreç, daha sonra devam edecektir yararlı / yazma vb okuyabilecek iken Kısacası, sürecin ilerlemesi durur. Gerçekten uyumsuz sistemde süreç ne olursa olsun devam edecek ve okuma / yazma farklı bir iş parçacığı yapılacaktır. Farklı bir iş parçacığı yapılırsa I / O engelleme hala uyumsuz yapılabilir unutmayın.

Ayrıca, PHP onu destekleyen bir uzantısı kurmadan olay güdümlü I / O yapmak mümkün değildir. Aksi takdirde PHP engellenmeyen I / O yapmak için sorgulama çeşit yapmak gerekir. Bu socket_select kullanıldığında Kaos kod işlevsel engellenmeyen okumak örnek olacaktır.

Bunu dedi, seçme fonksiyonu hala PHP gerçek dışı engelleme davranışı sağlayacaktır. C, yoklama hizmetleri sürülen olay üzerinde bir performans kaybı var, bu yüzden PHP için aynı olurdu eminim. Ama bu kayıp çağrı beklemek yapılırsa olmayan bir engelleme çağrısı kaydettiğiniz zaman genellikle milisaniye, hatta saniye prizler, miktarına bağlı olarak nanosaniye-mikrosaniye olduğunu.