と同等の機能を 呼び出すだけstream_set_timeout
で、特定のタイムアウト後にブロッキングの読み取りと書き込みを終了させることができます。
$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($s, '127.0.0.1', 0)) die("bind failed");
if (!socket_listen($s)) die("listen failed");
socket_getsockname($s, $localA, $localPort);
echo 'Listening on ' . $localA . ': ' . $localPort . "\n";
$c = socket_accept($s);
// Warning: Ugly hack ahead.
// This just mitigates the problem somewhat, and doesn't actually solve it
socket_set_option($c, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>2,'usec'=>0));
socket_set_option($c, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>2,'usec'=>0));
$r = socket_read($c, 1024);
echo 'read finished: got ' . var_export($r, true) . "\n";
これはハックであることに注意してください。悪意のある攻撃者は、1秒あたり1バイト程度しか送信できません。
これらのクレイジーなハックに時間を費やす代わりに、実際には非ブロッキングIOに切り替えるか、受け入れられたソケットを別のスレッド/プロセスで処理する必要があります。