(PHP 4 >= 4.3.0, PHP 5)
stream_select — Belirtilen akım dizisi üzerinde belirtilen zaman aşımı ile select() sistem çağrısının eşdeğeri olarak çalışır
&$oku
, array &$yaz
, array &$dış
, int $saniye
[, int $mikrosaniye
= 0
] )stream_select() işlevi akımları diziler halinde kabul eder ve durumları değişinceye kadar bekler. Akımlar üzerinde işlem yapması dışında socket_select() işlevinin benzeridir.
oku
oku
dizisindeki akımlar için veri okunabilir
hale gelene kadar beklenir (daha doğrusu, okumanın engellenmediğini
görene kadar - özellikle de akım özkaynağının dosya sonunda olduğu,
fread() işlevinin sıfır uzunlukta bir dizge
döndürdüğü duruma kadar).
yaz
yaz
dizisindeki akımlar için yazmanın
engellenmediği görülene kadar beklenir.
dış
dış
dizisindeki akımlar için yüksek öncelikli
istisnai ("band dışı") veri gelinceye kadar beklenir.
stream_select() işlevine bu dizilerin hepsini aktarmak zorunda değilsiniz. Kullanmayacağınız dizileri ya boş bırakın ya da dizi yerineBilginize:
stream_select() dönerken
oku
,yaz
vehariç
dizilerinde akım özkaynaklarının değişen durumlarını belirten değişklikler yapılır.
NULL
belirtin. Ayrıca, bu dizilerin gönderimli
aktarıldıklarını ve stream_select() dönerken
bunlarda değişiklik yapılacağını da unutmayın.
saniye
Son iki değiştirgenin toplamı stream_select() işlevinin dönmeden önce bekleyebileceği zaman aşımı süresini belirler. Bu değiştirgelerin ikisine de 0 belirtilirse stream_select() veri için beklemeden akımların durum bilgisiyle hemen dönecektir.
saniye
değiştirgesinde NULL
belirtilirse
stream_select(), izlediği akımlardan birinde bir
olay vuku bulana kadar (veya sistem çağrısı bir sinyal ile durdurulana
kadar), gerekirse sonsuza kadar engellenebilir.
Zaman aşımı olarak 0 belirtilmesi akımların anlık durumlarının dönmesini sağlar. Ancak, işlevi sıfır zaman aşımı ile bir döngüye sokmak çok fazla işlemci zamanı harcanacağından iyi bir fikir değildir.
Bir kaç saniyelik bir zaman aşımı belirtmek ve bu arada diğer denetimleri ve işlemleri yapmak daha iyidir. 200000 mikrosaniyelik bir zaman aşımı betiğinizin işlemci kullanımını düşürmenize yardımcı olacaktır.
Zaman aşımı değerinin beklenecek azami süreyi belirttiğini unutmayın. stream_select() işlevi istenen akımlar kullanıma hazır olunca, sürenin bitmesini beklemeden dönecektir.
mikrosaniye
saniye
değiştirgesinin açıklamasına bakınız.
stream_select() işlevi başarı durumunda değişikliğe
uğrayan akımların sayısını döndürür. Hiçbir olay vuku bulmadan zaman aşımı
dolmuşsa işlev 0 döndürebilir. Bir hata durumunda işlev
FALSE
döndürür ve bir uyarı çıktılanır (sistem çağrısı bir sinyal ile
kesilince de bu olur).
Örnek 1 - stream_select() örneği
Bu örnekte $oku1
ve $oku2
akımlarına okumak için bir veri gelmiş mi diye bakılmaktadır. Zaman aşımı
değeri 0 olduğundan işlev beklemeden dönmektedir.
<?php
/* Oku dizisini hazırlayalım */
$oku = array($oku1, $oku2);
$yaz = NULL;
$dış = NULL;
if (false === ($değişen_akım_sayısı = stream_select($oku, $yaz, $dış, 0))) {
/* Hata durumunda yapılacaklar */
} elseif ($değişen_akım_sayısı > 0) {
/* Akımların en azından birinde değişiklik olmuş */
}
?>
Bilginize:
Zend motorunun sınırlamalarından dolayı, gönderimli aktarılan bir değiştirgeye doğrudan
NULL
belirtmek mümkün değildir. Bu nedenleNULL
değerini doğrudan değil, bir değişken veya bir ifade üzerinden belirtin:<?php
$d = NULL;
stream_select($o, $y, $d, 0);
?>
Bilginize:
Hat durumlarını sınarken === işlecini kullanmanız gerektiğini unutmayın. Çünkü işlev 0 döndürdüğünde == işleci bunu
TRUE
olarak değerlendirir. Örnek:<?php
$d = NULL;
if (false === stream_select($o, $y, $d, 0)) {
echo "stream_select() başarısız oldu\n";
}
?>
Bilginize:
Bir akıma okuma/yazma işlemi yapıyorsanız işlemek istediğiniz verinin tamamını işleme sokabileceğiniz gibi bir kanıya kapılmayın. Bazen ilk baytta işlem duruverir.
Bilginize:
Windows uyumluluğu: Windows 98 altında, proc_open() işlevinden dönen bir boru üzerinde stream_select() kullanımı veri kaybına sebep olabilir.
Windows altında, proc_open() işlevinden dönen dosya tanıtıcıları üzerinde stream_select() kullanımı başarısız olabilir ve
FALSE
dönebilir.