Прежде чем начать, извините за мой английский, я из Голландии 🙂
У меня есть вопрос относительно использования PHP fsockopen.
Мои предпосылки
В общем, у меня в фоновом режиме работает Windows-программа с удаленной консолью по TCP / IP, к которой мне нужно подключиться, чтобы я мог выполнить несколько команд. Я могу подключиться к этой консоли с Китти, и выполнить мои команды без проблем.
Мое решение
Итак, проблема, с которой я столкнулся сейчас, заключается в том, что мне нужно иметь возможность выполнять эти команды из браузера. Я искал в интернете лучшие способы сделать это, и я обнаружил, что нужно использовать PHP fsockopen подключиться к моей консоли. Код, который я попробовал, выглядит следующим образом:
$SOCKET = fsockopen("127.0.0.1", 12101, $errno, $errstr);
if($SOCKET){
echo "Connected!";
}
$firstRead = fread($SOCKET, 8000);
echo($firstRead);
И используя fputs отправить команду:
fputs($SOCKET, "HELP \r\n");
И после, зачитывая мой ответ с этим:
$response = fread($SOCKET, 8000);
echo $response;
Проблемы)
Но я столкнулся с несколькими странными проблемами при тестировании этого.
Как только я выполняю команду типа «HELP», из сеанса KiTTY я вижу, что команда была выполнена и что я получил ответ, но когда я зачитал ответ с «fread», я ничего не получил. Но когда я использую цикл для его чтения таким образом, он читает что-то из консоли при второй попытке почти каждый раз:
do {
$response = fread($SOCKET, 8000);
$i++;
} while (strlen($response) < 5 || $i < 5);
(Иногда он читает что-то из консоли с первой попытки, но в основном он читает только со второй попытки).
Вопрос
Теперь мой вопрос (ы): почему он ведет себя так странно? И это потому, что я делаю что-то не так? И действительно ли это лучший способ сделать это?
Примечание
Когда это работает, мне нужно иметь возможность вызывать эти функции PHP (или что-то подобное) с кучей AJAX-запросы и получите ответ, чтобы показать в браузере. Это абсолютно ДОЛЖНО, поэтому, пожалуйста, помните об этом при написании возможного ответа 🙂
Спасибо всем!
Когда вы создаете сокет с fsockopen
в PHP вы также можете указать, является ли он блокирующим или неблокирующим, в случае неблокирующего сокета функция socket_read
вернусь false
в случае ошибки, или если соединение было закрыто, или пустая строка до тех пор, пока не будут получены некоторые данные, в случае блокирующего сокета вместо того, когда вы читаете на нем, он будет блокироваться до тех пор, пока не будут прочитаны некоторые данные (или пустая строка, если истечет время ожидания ).
Поведение, которое вы описали, кажется неблокирующим.
Для изменения типа блокировки есть: socket_set_block
а также socket_set_nonblock
,
Когда ваш код с сокетами работает, проблем с AJAX-запросами не возникнет, но имейте в виду, что нужно установить тайм-аут в сокете PHP, в противном случае, если сервер не работает или просто слишком медленный, запрос завершится ошибкой (тайм-аут из php, если set_time_limit превышен, что является фатальной ошибкой или ошибкой JavaScript с постоянной времени ожидания браузера).
Вот ссылки на руководство socket_read а также socket_write, я думаю, что более присваиваются fread
а также fputs
,
Других решений пока нет …