Как запустить внешнюю программу - Проблемы с системой и exec - PullRequest
12 голосов
/ 10 сентября 2009

Я работаю в контролируемой среде XP, только для интрасети, и мне нужно запускать внешние процессы из приложений PHP. (Резервные копии, отчеты и т. Д.)

Я могу заставить систему или exec запускать процессы, которые работают тихо. Вот простой пример

<?php exec ("echo hello > hello.txt");?> 

Я могу заставить его выполнить файл bat, у которого нет видимого вывода.

Я не могу запустить ни одну программу с экраном, например генератор отчетов или блокнот ...

<?php exec ("explorer");?>

ничего не делает. или то же самое для системы

Ответы [ 3 ]

18 голосов
/ 17 ноября 2011

Очень поздний ответ, но я сам работал над этим и обнаружил, что действительно возможно запустить программу с графическим интерфейсом из PHP с сервером Apache в Windows XP.

  • Пуск-> Выполнить, введите «services.msc», чтобы вызвать управление службами (другие способы получить это, это самый простой IMO)
  • Найдите свой сервис Apache (мой был назван "wampapache" с помощью WampServer 2.0)
  • Открыть свойства сервиса (двойной щелчок или правый клик-> свойства)
  • Перейдите в учетную запись входа и убедитесь, что флажок «Разрешить службе взаимодействовать с рабочим столом» установлен на флажок
  • Вернитесь на вкладку Общие, остановите службу, запустите службу

Теперь, используя код ниже, вы можете создавать процессы пользовательского интерфейса из PHP. В первом фрагменте кода скрипт не будет ожидать закрытия приложения; второй фрагмент ожидает закрытия программы, прежде чем продолжить (блокирование).

Не ждите приложения:

pclose(popen("start /B notepad.exe", "r"));

Ждать заявки:

system('start notepad.exe');

Это было проверено на Windows XP. Я не пробовал его на других версиях Windows, ваш опыт может отличаться.

Примечание В моей конкретной установке я использовал другую опцию на вкладке «Вход в систему» ​​службы - Apache работал как пользователь домена, поэтому он мог получить доступ к нескольким сетевым ресурсам с разрешениями пользователя домена. Этот флажок недоступен для этой опции, только когда служба работает как локальная система. После обширных исследований я обнаружил, что у одного сервиса просто нет возможности как взаимодействовать с текущим рабочим столом, так и использовать учетные данные конкретного пользователя. Это предложение типа «один или другой», предлагаемое решение - разделить ваш сервис на два компонента: один, использующий учетную запись пользователя, и другой, взаимодействующий с рабочим столом. Не очень удобно, когда вы говорите о веб-сервере. Эта заметка, вероятно, довольно специфична для моего варианта использования, но я хотел бы выложить ее здесь на случай, если смогу спасти кого-то еще от разочарования в будущем.

18 голосов
/ 12 февраля 2015

Еще один супер поздний ответ, но он появляется в Google при поиске "php run gui program" ...

Мне удалось запустить приложение с графическим интерфейсом в Windows 8.1, выполнив, запустив и удалив запланированное задание:

shell_exec('SCHTASKS /F /Create /TN _notepad /TR "notepad.exe" /SC DAILY /RU INTERACTIVE');
shell_exec('SCHTASKS /RUN /TN "_notepad"');
shell_exec('SCHTASKS /DELETE /TN "_notepad" /F');
5 голосов
/ 10 сентября 2009

Какое поведение вы ожидаете? Вызов system('notepad') работает нормально - он просто не отображает графический интерфейс. Он работает в фоновом режиме, и PHP терпеливо ждет, пока блокнот не закроется (и только продолжится, если вы убьете блокнот из списка процессов).

Если вы ожидаете появления графического интерфейса, я вполне уверен, что вы не сможете этого сделать. ;) Возможно, вы можете написать пакетный сценарий (file_put_contents('runme.bat', 'notepad hello.txt')) и поставить этот пакетный сценарий в очередь (с планировщиком Windows или любым другим аналогом cron в Windows) для асинхронного выполнения (и очистить себя в конце ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...