Какая связь между php.exe, php-win.exe и cmd.exe в Windows?

Sep 05 2020

За все годы работы с PHP CLI в Windows я начал свои скрипты с .batтаких файлов:

php test.php

phpразрешается C:\PHP\php.exeиз-за моего PATH.

Никаких проблем с этим. За исключением того, что они всегда получают этот надоедливый cmd.exeзначок / группу панели задач.

Итак, всего несколько минут назад я вместо этого создал ярлык на своем рабочем столе прямо для C:\PHP\php.exeи ввел полный путь к моему сценарию в качестве аргумента. Теперь, когда я дважды cmd.exeщелкаю значок «PHP» на рабочем столе, он открывается не напрямую, а непосредственно PHP.exe, так что он получает значок PHP вместо значка cmd.exe и помещается в свою собственную группу панели задач.

Однако, кроме значка, он во всем выглядит идентично cmd.exe. Я уверен , что это cmd.exe, просто со значком PHP. Или это какой-то кастомный терминал, полностью отделенный от cmd.exe?

Также есть php-win.exeисполняемый файл в формате C:\PHP. Я никогда не мог понять, что это такое и чем отличается от php.exeтого же самого каталога. Если я сделаю с ним то же, что и выше, он сразу выйдет из строя с зарегистрированной ошибкой PHP:

cli_get_process_title(): cli_get_process_title had an error: Windows error code: 6

В файле "README" об этом исполняемом файле нет никакого упоминания.

Я много раз экспериментировал и пытался использовать PowerShell, но всегда были странные сбои и проблемы с ним, поэтому я придерживался cmd.exe. Кроме того, необходимость постоянно создавать множество ярлыков и редактировать их аргументы для представления полных путей к моим сценариям PHP намного хуже, чем наличие файлов .bat, которые запускают мои сценарии PHP гораздо лучше, хотя и с надоедливым cmd. Значок exe вместо значка PHP.

Об этом «Windows Terminal» я, кажется, слышал много лет, но его все еще нигде нет на моей машине.

В идеале я хотел бы иметь свой собственный значок, не взятый ни из cmd.exe, ни из php.exe, но единственный способ, который я нашел в прошлом, - это скопировать cmd.exe, изменить его и затем используйте это везде. Это не изящное или разумное решение.

Пожалуйста, объясните мне, для чего нужен php-win.exe, является ли php.exe на самом деле просто cmd.exe с другим значком, и если есть что-то простое, я могу сделать свой собственный значок / брендинг для моей системы CLI PHP.

Ответы

1 user1686 Sep 05 2020 at 17:37

Никаких проблем с этим. За исключением того, что они всегда получают этот надоедливый значок cmd.exe / группу панели задач.

Они будут, потому что сценарии .bat всегда запускаются через cmd.exe (например, так они получают то, что получает окно консоли cmd.exe.

Однако, кроме значка, он во всем выглядит идентично cmd.exe. Я почти уверен, что это cmd.exe, только со значком PHP. Или это какой-то кастомный терминал, полностью отделенный от cmd.exe?

Терминал всегда был отделен от cmd.exe. Вы смотрите на стандартное окно консоли Windows, теперь также известное как Conhost . (В эпоху Win2000 / XP он был частью CSRSS.)

И cmd.exe, и php.exe не имеют собственного графического пользовательского интерфейса - они просто волшебным образом вызывают Conhost при запуске.

Также есть исполняемый файл php-win.exe в C: \ PHP. Я никогда не мог понять, что это такое и чем он отличается от php.exe в том же каталоге.

Как уже упоминалось, php.exe вызывает окно терминала Conhost при запуске - но это не то, что делает php.exe , это фактически происходит автоматически, потому что Windows распознает, что файл php.exe помечен как «консольное приложение». Он всегда будет запускаться в консоли, независимо от того, унаследован ли он от cmd.exe (при запуске сценария .bat) или новый (при двойном щелчке по php.exe).

Таким образом, php-win.exe - это почти то же самое, но файл .exe не помечен как «консоль» - вместо этого он помечен как «приложение с графическим интерфейсом» и будет работать полностью невидимым (если вы не используете его для запуска сценария, который например, вызывает PHP-GTK или PHP / Tk для создания окон графического интерфейса).

По той же причине Python поставляется с python.exe и pythonw.exe в Windows - один предназначен для создания в основном инструментов на основе интерфейса командной строки, а другой - для создания графических приложений.

Об этом «Windows Terminal» я, кажется, слышал много лет, но его все еще нигде нет на моей машине.

Его можно установить через Microsoft Store, если у вас Windows 10.

(Обратите внимание, что если вы установите его, он не заменит Conhost полностью - он будет использоваться только тогда, когда вы сами откроете приложение Terminal. Двойной щелчок по консольному .exe по-прежнему будет отображать его в Conhost.)

В идеале я хотел бы иметь свой собственный значок, не взятый ни из cmd.exe, ни из php.exe, но единственный способ, который я нашел в прошлом, - это скопировать cmd.exe, изменить его и затем используйте это везде. Это не изящное или разумное решение.

Скопируйте php.exe и измените его. Или используйте php-win.exe вместе с некоторым модулем PECL (возможно, w32api), который позволяет вам создавать консольное окно по запросу.