Я работаю в контролируемой среде xp, intranet, и мне нужно запустить внешние процессы из приложений PHP. (Резервные копии, отчеты и т. Д.)
Я могу заставить систему или exec запустить процессы, которые работают молча. Вот простой пример
<?php exec ("echo hello > hello.txt");?>
Я могу заставить его выполнить файл bat, который не имеет видимого выхода.
Я не могу получить любую программу, которая имеет экран для запуска, например, генератор отчетов или блокнот …
<?php exec ("explorer");?>
ничего не делает. или же для системы
Какое поведение вы ожидаете? system('notepad')
звонков system('notepad')
отлично работает – она просто не отображает графический интерфейс. Он работает в фоновом режиме, и PHP сидит там терпеливо, ожидая, когда блокнот закроется (и только продолжит, если вы убьете блокнот из списка процессов).
Если вы ожидаете, что он появится в графическом интерфейсе, я уверен, что вы не сможете этого сделать. 😉 Опция может состоять в том, чтобы выписать пакетный скрипт ( file_put_contents('runme.bat', 'notepad hello.txt')
) и file_put_contents('runme.bat', 'notepad hello.txt')
этот пакетный скрипт в очередь (с планировщиком Windows или любым другим, что эквивалентен cron-эквиваленту в Windows), чтобы запускаться в асинхронном режиме (и в конце концов проясняться).
Очень поздний ответ, но я сам работал над этим и обнаружил, что действительно можно запустить программу GUI с PHP с сервером Apache в Windows XP.
Теперь, используя приведенный ниже код, вы можете создавать процессы пользовательского интерфейса с PHP. В первом фрагменте кода сценарий не будет ждать закрытия приложения; второй фрагмент ждет закрытия программы, прежде чем продолжить (блокирование).
Не ждите приложения:
pclose(popen("start /B notepad.exe", "r"));
Ждите приложения:
system('start notepad.exe');
Это было протестировано в Windows XP. Я не пробовал его ни в каких других версиях Windows, ваш размер может отличаться.
Примечание. В моей конкретной установке я использовал другую опцию на вкладке «Вход» службы – Apache работал как пользователь домена, чтобы иметь доступ к нескольким сетевым ресурсам с разрешениями пользователя домена. Этот флажок недоступен для этого параметра, только если служба работает как локальная система. После обширных исследований я обнаружил, что нет единого способа, чтобы одна служба взаимодействовала с текущим рабочим столом и использовала учетные данные конкретного пользователя. Это одно или другое предложение, предлагаемое средство состоит в том, чтобы разделить вашу службу на два компонента: один, который использует учетные записи пользовательской учетной записи и тот, который взаимодействует с рабочим столом. Не очень практично, когда служба, о которой вы говорите, является веб-сервером. Эта заметка, вероятно, довольно специфична для моего варианта использования, но я хотел поместить ее здесь, если я могу спасти кого-то еще от разочарования в будущем.
Еще один супер поздний ответ, но это появляется в 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');