socket_select

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_selectBelirtilen soket dizileri üzerinde belirtilen zaman aşımı ile select() sistem çağrısını çalıştırır

Açıklama

socket_select(
    ?array&$oku,
    ?array&$yaz,
    ?array&$diğer,
    ?int$tv_sec,
    int$tv_usec = 0
): int|false

socket_select() işlevi bağımsız değişken olarak soket dizileri alır ve durumları değişinceye kadar bekler. Bu soket dizileri BSD soketlerinden kaynaklanan bir kabulle dosya tanıtıcıları olarak da bilinir. İşleve birbirinden bağımsız üç çeşit soket dizisi belirtilebilir.

Bağımsız Değişkenler

oku

Karakterlerin okunmaya hazır hale gelmesine kadar (başka bir deyişle, okumanın engellenmediği görülene kadar) dinlenecek soket dizisi. (Okunacak tek şeyin dosyasonu karakteri olduğu durumda socket_read() sıfır uzunlukta bir dizge ile döner.)

yaz

Yazmanın engellenmediği görülene kadar (soket yazmaya hazır hale gelene kadar) dinlenecek soket dizisi.

diğer

Bu dizideki soketler olağan dışı durumlara göre denetlenir.

tv_sec

Saniye cinsinden zaman aşımı. tv_sec ve tv_usec birlikte select() sistem çağrısının zamanaşımı bağımsız değişkenini oluşturur. zamanaşımı, socket_select() dönmeden önce beklenecek azami süreyi belirler. tv_sec sıfır olabilir; bu durumda socket_select() beklemeden döner. Çağrı yinelemek için yararlıdır. tv_secnull olduğu takdirde (zaman aşımı yok), socket_select() sonsuza kadar bekleyebilir.

tv_usec

Mikrosaniye cinsinden zaman aşımı. Ayrıntılar için tv_sec bağımsız değişkenine bakınız.

Uyarı

Dönüşte, soket özkaynaklarının durumlarını belirtmek için dizilerde değişiklik yapılır.

socket_select() işlevine üç diziyi de aktarmak zorunda değilsiniz. Kullanmadığınız dizileri boş bırakabilir veya bir dizi yerine null belirtebilirsiniz. Ayrıca, bu dizilerin gönderimli aktarılmaları gerektiğine de dikkat ediniz; socket_select() işlevi dönerken soket durumlarını yansıtacak şekilde bu dizilerde değişiklik yapar.

Bilginize:

Zend motorundaki bir sınırlamadan dolayı, bir işleve gönderimli aktarılması gereken bir bağımsız değişken yerine işleve doğrudan null sabitini aktarmak mümkün değildir. Bu nedenle işleve değeri null olan geçici bir değişken veya son değeri bir değişken olan bir ifade aktarmalısınız:

Örnek 1 - socket_select() ile null kullanımı

<?php
$diger
= NULL;
socket_select($oku, $yaz, $diger, 0);
?>

Dönen Değerler

Başarı durumunda socket_select(), değişiklik yapılan soketlerin sayısını döndürür. Eğer hiçbir değişiklik olmaksızın zaman aşımı dolmuşsa işlev 0 döndürür. Bir hata durumunda false döner. Hata kodu socket_last_error() ile alınabilir.

Bilginize:

İşlev, 0 değerini anlamlı bir değer olarak döndürdüğünden == işleci ile yapılan bir sınama true ile sonuçlanacağından hata durumunu sınarken === işlecini kullanmalısınız:

Örnek 2 - socket_select() sonucunu anlamak

<?php
$e
= NULL;
if (
false === socket_select($o, $y, $d, 0)) {
echo
"socket_select() başarısız oldu; sebep: " .
socket_strerror(socket_last_error()) . "\n";
}
?>

Örnekler

Örnek 3 - socket_select() örneği

<?php

$oku = array($soket1, $soket2);
$yaz = NULL;
$diger = NULL;
$degisen_soket_sayısı = socket_select($oku, $yaz, $diger, 0);

if (
$degisen_soket_sayısı === false) {

} else if ($degisen_soket_sayısı > 0) {

}
?>

Notlar

Bilginize:

Bazı soket gerçeklenimlerinin çok dikkatli olmayı gerektirdiğini bilmeniz gereken bir kaç temel kural:

  • socket_select() işlevini daima zaman aşımsız kullanmaya çalışın. İşe yarar bir veri yoksa betiğiniz hiçbir işlem yapmamalıdır. Zaman aşımlarına bağımlı bir kod taşınabilir değildir ve hata ayıklamak çok zor olur.
  • socket_select() çağrısından sonra üzerinde hiçbir işlem yapmayacağınız soket nesnelerini hiçbir diziye eklemeyin. socket_select() döndükten sonra dizilerdeki tüm soketlere mutlaka bakılmalıdır. Yazmaya hazır soketlere yazılmalı, okunmaya hazır soketler okunmalıdır.
  • Diziden dönen bir sokete oku veya yaz işlemi yapacaksanız verinin tamamını okumak veya yazmak zorunda değilsiniz. Sadece bir bayt okumaya veya yazmaya bile hazır olmalısınız.
  • Hemen tüm soket gerçeklenimlerinde diğer dizisindeki soketlerin band dışı verilerle ilgili olduğu varsayılır.

Ayrıca Bakınız

To Top