не пойму в чем ошибка
Записать в базу результаты. Желательно опрашивать несколько десламов одновременно. -
Решила попробовать через сокеты, но получаю ерунду какую-то. Где ошибка? Использовала как основу скрипт с сайта
http://job-interview.ru/articles/post/194
Скрипт:
<?
//получить содержимое
$urls = array($ip1, $ip2);
$rtasks = array(); // задачи чтения
$wtasks = array(); // задачи записи
$results = array(); // результаты
foreach ($urls as $url) {
// открываем отдельный сокет
$sh = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$sh) continue;
// таймаут для чтения
socket_set_option($sh, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 10, "usec" => 0));
// таймаут для записи
socket_set_option($sh, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 10, "usec" => 0));
// задаем неблокирующий режим сокетов
socket_set_nonblock($sh);
// соединяемся через telnet-порт
socket_connect($sh, $url, 23);
// добавляем в задачи для записи
$wtasks[$url] = $sh;
}
// продолжаем, пока есть задачи для записи или чтения
while ($wtasks || $rtasks) {
// массив для сокетов с возможностью чтения
$rtasks_ = $rtasks;
// массив для сокетов с возможностью записи
$wtasks_ = $wtasks;
// ждем результатов из сокетов
$n = socket_select($rtasks_, $wtasks_, $e=null, 10);
if ($n > 0) {
// сокеты, доступные для записи
foreach ($wtasks_ as $sh) {
// ищем урл страницы по дескриптору сокета в массиве задач записи
$url = array_search($sh, $wtasks);
// удаляем из задач записи
unset($wtasks[$url]);
// добавляем в задачи чтения
$rtasks[$url] = $sh;
// формируем задание
$per =$login."\r\n";
$per .=$password."\r\n";
$per .="enable\r\n";
$per .="display vlan all\r\n";
$per .="\r\n";
// записываем в сокет
if (socket_write($sh, $per) === false) fclose($sh);
}
// сокеты, доступные для чтения
foreach ($rtasks_ as $sh) {
// ищем урл страницы по дескриптору сокета в массиве задач чтения
$url = array_search($sh, $rtasks);
if (!$url) continue;
// считываем результат из сокета
$result = '';
while ($r = socket_read($sh, 1024)) $result .= $r;
// закрываем сокет
socket_close($sh);
// удаляем из задач чтения
unset($rtasks[$url]);
// заносим html в массив результатов
$results[$url] = $result;
}
}
else {
break;
}
}
Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Операция на незаблокированном сокете не может быть завершена немедленно. in C:\www\project\dslamopros0.php on line 30
Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Операция на незаблокированном сокете не может быть завершена немедленно. in C:\www\project\dslamopros0.php on line 30
Array ( [$ip] => яыяы )
автор статьи пишет, что несмотря на выдаваемую ошибку все работает
PHP Manual:
Note:
If the socket is non-blocking then this function returns FALSE with an error Operation now in progress.
Короче говоря, попытка соединения в неблокирующим режиме не дает однозначного результата об успехе соединения, о чем, собственно, и написано. Сокет надо переключать после соединения, а проще просто писать @socket_connect. Кроме того, в этой статье в комментариях приводятся жалобы на постоянные проблемы с получением неполного содержимого страниц, приводятся советы автора по введению паузы в цикл чтения, однако этот эффект является всего лишь проявлением ошибки 10035, которая является всего лишь некоторым уведомлением о невозможности немедленного завершения операции чтения (актуально именно для неблокирующих сокетов).
MSDN:
При неудачной опреции чтения ($res === false) надо проверять номер последней ошибки функцией socket_last_error и не закрывать сокет в случае ошибки 10035.