| |
ржат-
ся имена всех таблиц, присутствующих в базе данных. Для извлечения этих имен
можно использовать функцию mysql_result() с номером колонки, равным 0.
Глава 27
Сетевые функции
Здесь я коротко рассмотрю некоторые сетевые функции, предоставляемые PHP. За
более детальной информацией обращайтесь к сопроводительной документации.
Работа с сокетами
Помните, до этого мы обсуждали функцию fopen() и замечали, что ее можно ис-
пользовать и для открытия сетевых соединений с файлами на других хостах в Сети.
Однако функция fopen() позволяла работать лишь с содержимым файла, передан-
ного по протоколу HTTP. Но ведь по HTTP, кроме "тела" документа, передаются
так-
же некоторые заголовки, посланные сервером. "Добраться" до них всех и позволяет
функция fsockopen().
int fsockopen(string $host, int $port [,int &$errno] [,string &$errstr])
Эта функция работает аналогично fopen(), но только устанавливает сетевое
соединение с
указанным хостом $host и программой, закрепленной на нем за портом $port. Она
воз-
вращает файловый дескриптор, с которым затем могут быть выполнены обычные
опера-
ции: fread(), fwrite(), fgets(), feof() и т. д. В случае ошибки, как обычно,
воз-
вращается false и, если заданы параметры-переменные $errno и $errstr, в них
записываются соответственно номер ошибки (не равный нулю) и текст сообщения об
ошибке. Если функция вернула false, но $errno тем не менее сбросилась в 0, это
скорее всего означает, что произошла ошибка инициализации сокета. Например, та-
кое может произойти, если в Windows не установлен требуемый протокол TCP/IP.
Функция fsockopen() поддерживает и так называемые сокеты домена Unix, кото-
рые представляют собой в этой системе специальные файлы, наподобие каналов. Для
использования такого режима нужно установить $port в 0 и передать в $host имя
файла сокета. Мы не будем останавливаться на этом режиме, т. к. он специфичен
для
ОС Unix.
По умолчанию сокет (соединение) открывается в режиме чтения и записи, используя
блокирующий режим передачи. Вы можете переключить режим в неблокирующий,
если вызовете функцию socket_set_blocking() (см. ниже).
В примере из листинга 27.1 мы "проэмулировали" браузер, послав в порт 80
удален-
ного хоста HTTP-запрос GET и получив весь ответ вместе с заголовками. Мы
исполь-
зуем функцию HtmlSpecialChars(), чтобы вывести HTML-код документа в тек-
стовом формате.
Часть IV. Стандартные функции PHP 382
Листинг 27.1. "Эмуляция" браузера
// Соединяемся с Web-сервером www.php.net
$fp = fsockopen("localhost", 80);
// Посылаем запрос главной страницы сервера
fputs($fp,"GET / HTTP/1.0\n\n");
// Теперь читаем по одной строке и выводим ответ
echo "";
while(!feof($fp))
echo HtmlSpecialChars(fgets($fp,1000));
echo " ";
// Отключаемся от сервера
fclose($fp);
?>
Разумеется, никто не обязывает нас использовать именно 80-й порт. Даже
наоборот:
функция fsockopen() универсальна. Мы можем использовать ее и для подключения
к telnet-порту, и к FTP — словом, для чего угодно.
int socket_set_blocking(int $sd, int $mode)
Эта функция устанавливает блокирующий или неблокирующий режим для соедине-
ния, открытого ранее при помощи fsockopen(). В режиме блокировки
($mode=true) функции чтения будут "засыпать", пока передача данных не завершит-
ся. Таким образом, если данных много, или же произошел какой-то "затор" в сети,
ваша программа остановится и будет дожидаться выхода из функции чтения. В ре-
жиме запрета блокировки ($mode=false) функции наподобие fgets() будут сразу
же возвращать управление в программу, даже если через соединение не было
переда-
но еще ни одного байта данных. Таким образом, считывается ровно столько инфор-
мации, сколько доступно на данны
|
|