PHP () ve fgets () fsockopen kullanırken nasıl while () döngü durak değil mi?

4 Cevap php

Bu küçük bir PHP IRC bot için temel bağlantı kodudur. Sorun o IRC sunucudan veri alıncaya kadar while () döngü (), fgets ötesinde ilerleme yok gibi görünüyor olmasıdır. Ben IRC sunucusu henüz veri gönderilmez ise while () döngü olursa olsun yinelemek istiyorum. Bu mümkün mü?

$socket = fsockopen($config['irc_server'], $config['port']);
while (1) 
{
	$data = fgets($socket, 128);
	echo '[RECEIVE] ' . $data;
	$recv = explode(' ', $data);

	if ($recv[0] == 'PING')
	{
		send('PONG', $recv[1]);
	}
}

4 Cevap

Dahil bu bir socket_ * işlevleri göz atın:

socket_set_nonblock

Ayrıca socket_recv olmayan bir blok bayrağı geçebilir olabilir

Burada zorunlu hızlı ve kirli bir örnektir (hiç hata denetimi)

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $address, $service_port);
while (false === ($bytes = socket_recv($socket, $buf, 2048, MSG_DONTWAIT))) 
{ /* do stuff while waiting for data */ }

Ftell bir göz atın. İşte php belgelere ilgili örnek:

#!/usr/bin/php4 -q
<?
#following will hang if nothing is piped:
#$sometext = fgets(STDIN, 256)

$tell = ftell(STDIN);

if (is_integer($tell)==true) 
  {echo "Something was piped: ".fread(STDIN,256)."\n";}
else 
  {echo "Nothing was piped\n";}

?>

Veri soket okuma için kullanılabilir olup olmadığını stream_select() söyleyebilirim. Bir satır sonu veya dere uçları var kadar Ama fgets () geri dönmez. Peki yerine fread() kullanmak zorunda ve veri kendinizi bölmek istiyorum.

btw: Ayrıca PEAR::Net_SmartIRC paket ilginizi çekebilir.

Sorun o IRC sunucudan veri alıncaya kadar while () döngü (), fgets ötesinde ilerleme yok gibi görünüyor olmasıdır.

Ben bir sorun görmüyorum. Ne hiçbir şey alırsa bu kod yapmak istiyorsun?

Şu anda, tekrar fgets etrafında sadece döngü olacak, böylece sadece meşgul bekleme sebepsiz döngüleri yakıyorsun. Engelleme Bu durumda doğru bir davranıştır.