Php Как запустить внешнюю программу - возникли проблемы с системой и exec

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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ожидание приложения:

system('start notepad.exe');

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

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

Ответ 3

Еще один супер поздний ответ, но это появляется в 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');