boolean stream_register_wrapper(string protocol, string class)
Функция stream_register_wrapper (листинг 9.41) позволяет применить оболочку для потокового протокола. Второй аргумент представляет собой имя класса, реализующего определенный набор методов, описанных ниже. Существующую оболочку потокового протокола перекрыть нельзя. В табл. 9.9 приведены методы, поддерживаемые данным классом.
Операционная система
Операционная система
Листинг 9.41. Функция stream_register_wrapper

<?php
class MemoryStream

{

var $filename; var $filedata; var $position;
function stream_open($path, $mode, $options, &$opened_path)
{
// разбиение URL на части $url = parse_url($path); // установить имя файла $this->filename = $url["host"]; // установка открытого пути $opened_path = $this->filename; // начать с нуля $this->position = 0;
// скопировать переменную из глобального диапазона $this->filedata =
$GLOBALS['MemoryStream'][$this->filename]; //открытие было успешным return(TRUE);

function stream_read($count)
{
// принять данные
$data = substr($this->filedata, $this->position,
$count); // переместить указатель вперед $this->position += strlen($data); return($data);
}
function stream_write($data)
{
//начать запись с текущего положения, сохраняя //существующие данные, если записываемых данных не хватает $this->filedata =
substr($this->filedata, 0, $this->position) .
$data .
substr($this->filedata, $this->position + strlen($data)); $this->position += strlen($data); return(strlen($data));
}
function stream_tell()
{
return($this->position);
}
function stream_eof()
{
return($this->position >= strlen($this->filedata));
}
function stream_flush()
{
// глобально скопировать весь набор данных 
$GLOBALS['MemoryStream'][$this->filename] =
$this->filedata; return(TRUE);
}
function stream_close()
{
$this->stream_flush(); return(TRUE);
}
function stream_seek($offset, $from)
{
switch($from)
{
case SEEK_SET:
$position = $offset;
break; case SEEK_CUR:
$position += $offset;
break;
case SEEK_END:
$position = strlen($this->filedata) + $offset; break; default:
return false;
}
// проверить невозможные положения if(($position < 0) OR ($position >= strlen($this->filedata)))
{
return(FALSE);
}
$this->position = $position; return(TRUE);
}
}
$GLOBALS['MemoryStream']['test.txt'] = 'test test test test';
// зарегистрировать новую оболочку RAM- диска if(!stream_register_wrapper('ram', 'MemoryStream'))
{
print('Невозможно зарегистрировать оболочку RAM-диска.'); exit;
}
// открыть файл в RAM- диске
if(!($fp = fopen('ram://test.txt', 'r+')))
{
print('файл невозможно открыть.'); exit;
}
// записать три строки
fwrite($fp, "test 1n");
fwrite($fp, "test 2n");
fwrite($fp, "test 3n");
// поместить указатель на начало
rewind($fp);
// прочитать содержимое
while(!feof($fp))
{
print(fgets($fp) . '<br>');
}
// закрыть fclose($fp);
?>

integer stream_select(array read, array write, array exception, integer timeout_seconds, integer timeout_microseconds)
Функция stream_select отслеживает изменения в потоках, а именно: поступление новых данных в потоках, заданных массивом read; готовность к приемке новых данных в потоках, заданных массивом write; наличие ошибок в потоках, заданных массивом exception. Функция возвращает результат, если время, указанное в секундах в аргументе timeout_seconds, истекло. Для задания значения тайм-аута, не превышающего 1 секунду, используется необязательный аргумент timeout_microseconds.
Функция stream_select возвращает число изменившихся потоков или значение FALSE в случае ошибки. При превышении значения тайм-аута эта функция возвращает нулевое значение. Кроме того, она вносит изменения в заданных массивах таким образом, чтобы в них хранились только те изменившиеся потоки. При отсутствии потоков определенного типа, за которыми необходимо осуществлять наблюдение, в этом параметре указывается пустой массив или значение NULL.
boolean stream_set_blocking(resource file, boolean mode)
Функция stream_set_blocking устанавливает блокировки на определенные потоки. Если значение аргумента mode равно TRUE, операции чтения/записи в поток будут ожидать освобождения ресурса. Если значение аргумента mode равно FALSE, вызов возвращается немедленно.
boolean stream_set_timeout(resource file, integer seconds, integer microseconds)
Функция stream_set_timeout (листинг 9.42) устанавливает время, на протяжении которого PHP будет ожидать завершения операции с потоком.

| Листинг 9.42. Функция stream_set_timeout
<?php
// открыть подключение
if(!$fp = fsockopen("localhost", 80))
{
exit();
}
//ожидать 500 микросекунд stream_set_timeout($fp, 0, 500); //отправить запрос на страницу fputs($fp, "GET / HTTP/1.0rnrn"); //попытаться прочесть первые 1K print(fread($fp, 1024)); fclose($fp);

?>