DevelNext – Запуск внешнего процесса
В DevelNext есть возможность запускать сторонние процессы и получать от них данные из потоков stdout и stderr.
Демо проект
Если нужно по-быстрому получить результат выполнения команды, подойдёт следующий код
1 2 |
$result = (new Process(['cmd.exe', '/c ping google.com -n 1']))->start()->getInput()->readFully(); $result = str::decode($result, 'cp866'); // командная строка windows работает с кодировкой OEM-866 |
А если мне нужно в писать в один и тотже процесс
Сначало запускаю
sudo nano …
Потом вписуваю
pass111
Кодировка неверная указана, нужно использовать ‘Windows-1251’.
Обнаружился глюк в devNext: метод readFully не отображается в подсказках.
Альтернативный вариант:
$process = execute(‘php -r “print_r(\’абв\’);”‘, true);
$result = $process->getInput()->readFully();
var_dump(str::decode($result, ‘Windows-1251’)); // string(3) “абв”
Командная строка по умолчанию работает в кодировке CP866. Некоторые команды возвращают ответ в “своей” кодировке,будь то windows-1251, utf-8 и т.д. Если php настроен на кодировку windows-1251, не значит, что указана неверная кодировка.
Короче нифига не работает этот код:
$result = (new Process([‘cmd.exe’, ‘/c dir’]))->start()->getInput()->readFully();
pre($result);
НЕ РАБОТАЕТ DevelNext 16.7 и.. ?
А что в getError? Может у текущего пользователя недостаточно прав?
Как правильно работать с консольными утилитами, типо mysql? Из этого примера получается, что запускается процесс, выполняется команда и всё. В случае с консолью mysql, то посылается команда, например что бы войти “mysql -ulogin -ppassword”, после входа как-то надо отправлять команды дальше, уже внутри mysql, как я понимаю, не завершая процесс. Как в этом случае поступить?
Присоединяюсь к вопросу, как отправлять команды в уже запущенный процесс без его повторного запуска.
Почему не работает?:
$biosnum = (new Process([‘cmd.exe’, ‘/c “wmic bios get serialnumber”‘]))->start()->getInput()->readFully();
Нужно, чтоб в команде не было пробелов
А разве так работать не будет?)
$result = str::decode((new Process([‘cmd.exe’, ‘/c ping google.com -n 1’]))->start()->getInput()->readFully(), ‘cp866’);
будет, это эквивалентно тому коду, что я написал, только без переменной
Ты правильно все сделал, так читается легче. А паренёк просто выеживается