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');