Команда php не работает в консоли windows

I am trying to execute the following command via PHP's exec function: D:\pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\outputfile.pdf D:\new.jpg...

I am trying to execute the following command via PHP’s exec function:

D:\pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\outputfile.pdf D:\new.jpg  

It doesn’t generate any output. But if I directly paste the command on the command line then it works…

Note: it takes a bit of time to complete when run directly on command line.

Josh's user avatar

Josh

10.9k11 gold badges67 silver badges107 bronze badges

asked Jan 16, 2012 at 13:29

Salman's user avatar

3

I would suggest using shell_exec instead of exec function here. shell_exec executes command via appropriate shell (WIndows / Unix etc) and returns the complete output as a string to you.

answered Jan 16, 2012 at 13:42

anubhava's user avatar

anubhavaanubhava

747k64 gold badges550 silver badges622 bronze badges

0

If your command is this:

exec("pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\outputfile.pdf D:\input.jpg");

PHP escapes the backslashes, so the command that reaches the shell is ... D:outputfile.pdf D:input.jpg. You have to double-escape the backslashes: once for PHP and once for the shell.

exec("pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\\outputfile.pdf D:\\input.jpg");

answered Jan 16, 2012 at 13:44

JJJ's user avatar

JJJJJJ

32.6k20 gold badges89 silver badges102 bronze badges

I am trying to execute the following command via PHP’s exec function:

D:\pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\outputfile.pdf D:\new.jpg  

It doesn’t generate any output. But if I directly paste the command on the command line then it works…

Note: it takes a bit of time to complete when run directly on command line.

Josh's user avatar

Josh

10.9k11 gold badges67 silver badges107 bronze badges

asked Jan 16, 2012 at 13:29

Salman's user avatar

3

I would suggest using shell_exec instead of exec function here. shell_exec executes command via appropriate shell (WIndows / Unix etc) and returns the complete output as a string to you.

answered Jan 16, 2012 at 13:42

anubhava's user avatar

anubhavaanubhava

747k64 gold badges550 silver badges622 bronze badges

0

If your command is this:

exec("pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\outputfile.pdf D:\input.jpg");

PHP escapes the backslashes, so the command that reaches the shell is ... D:outputfile.pdf D:input.jpg. You have to double-escape the backslashes: once for PHP and once for the shell.

exec("pstill -F a4 -2 -c -c -c -c -g -i -t -K -d 700 -a 4 -m XimgAsCMYK -m Xspot -m Xoverprint -o D:\\outputfile.pdf D:\\input.jpg");

answered Jan 16, 2012 at 13:44

JJJ's user avatar

JJJJJJ

32.6k20 gold badges89 silver badges102 bronze badges

В данном материале мы рассмотрим такие вопросы как: настройка PHP для работы в командной строке, выполнение PHP-кода в командной строке,
запуск PHP скриптов в командной строке без аргументов и с аргументами.

«На дисерт», в последнем пункте материала, будет показан процесс установки через командную строку
менеджера зависимостей для PHP getcomposer.org.

Начиная с версии 4.3.0, PHP поддерживает новый вид SAPI (интерфейс разработки серверных приложений) под названием CLI, что означает интерфейс командной строки.
Как видно из названия, этот вид SAPI предназначен для разработки консольных (или даже десктопных) приложений на PHP.

Начиная с PHP 4.3.0 дистрибутив для Windows влючает в себя CLI-модуль php.exe, расположенный в отдельной директории cli, полное имя — cli/php.exe.
Начиная с PHP 5, CLI-модуль расположен в основной директории и называется php.exe. CGI-модуль также включен в дистрибутив под названием php-cgi.exe.
Начиная с PHP 5, в дистрибутив для Windows входит новый файл php-win.exe. Он полностью эквивалентен CLI, за исключением того,
что php-win абсолютно ничего не выводит, что приводит к отстутствию консоли (окно DOS не появляется на экране).

Настраиваем работу PHP из командной строки

Прежде всего Вы должны узнать расположение CLI-модуля, файла с именем «php.exe». В моем случае полный путь до данного файла выглядит так — «C:phpphp.exe».

Теперь нам нужно проверить работает ли PHP в командной строке. Для этого откроем командную строку (желательно от имени администратора) и выполним команду:

C:Windowssystem32>C:phpphp.exe --help

укажем полный путь до CLI-модуля, файла «php.exe» (т.е. «C:phpphp.exe»), и через пробел добавим ключ «—help».
(вызов «PHP» в консоли с ключем «—help» покажет справочную информацию).

Если после выполнения данной команды Вы получили предупреждения или сообщения об ошибках, то вероятнее всего, Вами был не верно указан путь до CLI-модуля «C:phpphp.exe».

При удачном выполнение команды должна отобразиться справочная информация. Поздравляю, Ваш PHP работает в консоли.

Вы наверное согласитесь со мной, что каждый раз указывать путь «C:phpphp.exe» довольно-таки не приятно,
и конечно же, запуск PHP можно настроить без необходимости указывать полный путь до файла «C:phpphp.exe».
Для этого необходимо в «Переменные среды» в переменную «PATH» добавить путь до этого файла.

Давайте ради интереса, до внесения изменений в переменную «PATH», попробуем вызвать в консоли PHP:

выполняем команду с опцией «php —help»

C:Windowssystem32>php --help

В ответ Вы скорее всего получите:

C:Windowssystem32>php --help
"php" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Теперь добавим путь до CLI-модуля «php.exe» в переменную «PATH». Найти данную переменную можно выполнив ряд действий (визуально представлено на изображениях ниже):

«Пуск» → пункт «Панель управления» → «Система» → «Изменить параметры» → вкладка «Дополнительно» → «Переменные среды» → в нижнем блоке (Системные переменные) выделяем Переменную «Path» или «PATH» → «Изменить»

В данной переменной уже имеются пути, которые разделены точкой с запятой (;). Вам необходимо добавить в конец переменной свой путь до CLI-модуля, файла «php.exe»,
В моем случае путь это — «C:php». (Будьте внимательны, при внесении изменений не удалите текущие значения).

добавим путь до CLI-модуля, файла «php.exe», в переменную «PATH»

Снова выполняем команду с ключем «php —help»

C:Windowssystem32>php --help
или
C:Windowssystem32>php -h

команда «php» с ключем «—help» покажет справочную информацию

Примеры работы PHP в командной строке

Откроем консоль (желательно от имени администратора) и перейдем к практике.

Рассмотрим два способа запуска PHP-кода:

  • Передача PHP-кода напрямую в командной строке
  • Указание конкретного файла для запуска

Первый способ. Опция «-r» (или «—run») позволяет выполнять PHP-код, указанный непосредственно в командной строке.
Открывающие и завершающие PHP-теги (<?php и ?>) не нужны.

C:Windowssystem32>php -r "printf(1);"
1
C:Windowssystem32>php -r "printf(1+2);"
3
C:Windowssystem32>php -r "printf('Hello world');"
или
C:Windowssystem32>php -r "print_r('Hello world');"
C:Windowssystem32>php -r "echo 'Hello world';"
Hello world
C:Windowssystem32>php -r "var_dump($_SERVER);"

Второй способ. Опция «-f» (или «—file») позволяет исполнять указанный файл. Является не обязательной и может отсутствовать,
достаточно просто указать имя файла.

Исполним индексный файл веб-сервера Apache с расширением «.html»

C:Windowssystem32>php -f C:Apache24htdocsindex.html
или
C:Windowssystem32>php C:Apache24htdocsindex.html
<html><body><h1>It works!</h1></body></html>

Исполним php скрипт

C:Windowssystem32>php C:Apache24htdocsphpinfo.php

Передаем аргументы php скрипту в консоли

Как и любое другое консольное приложение, PHP может принимает аргументы, а PHP-скрипт также может получать аргументы.
Рассмотрим данную возможность на примере. В корневой директории управления сайтами «C:Apache24htdocs» создадим файл «console.php» и внесем в него строки:

<?php
// количество аргуметов переданных в консоли
echo "The number of array elements $argv = " . $_SERVER['argc'] . "n";
// выводим массива аргументов переданных в консоли
print_r($_SERVER['argv']);
?>

Исполним php скрипт «console.php» без передачи параметров

C:Windowssystem32>php C:Apache24htdocsconsole.php
The number of array elements $argv = 1
Array
(
    [0] => C:Apache24htdocsconsole.php
)

количество аргуметов переданных в консоли равно 1,

этим аргументом является путь до файла «C:Apache24htdocsconsole.php»

Исполним php скрипт «console.php» с передачей параметров

C:Windowssystem32>php C:Apache24htdocsconsole.php param1 param2
The number of array elements $argv = 3
Array
(
    [0] => C:Apache24htdocsconsole.php
    [1] => param1
    [2] => param2
)

количество аргуметов переданных в консоли равно 3,
первым аргументом является путь до файла «C:Apache24htdocsconsole.php»
вторым и третим — param1, param2

Установка composer

composer

Composer (getcomposer.org) — это инструмент для управления зависимостями в PHP. Он позволяет вам объявлять зависимые библиотеки для вашего проекта, устанавливать их и обновлять.

На официальном сайте getcomposer.org есть инструкция по его установке
для «Installation — Linux / Unix / OSX»
и для «Installation — Windows».

Перед скачиванием архива «composer.phar» убедитесь, что в конфигурационном файле «C:phpphp.ini» подключено расширение «php_openssl.dll».
(Для этого раскомментируйте строку «extension=php_openssl.dll»).

для того, чтобы скачать «composer.phar» выполните следующие команды

C:Windowssystem32>cd C:Apache24htdocs
C:Apache24htdocs>php -r "readfile('https://getcomposer.org/installer');" | php
#!/usr/bin/env php
All setting correct for using Composer
Downloading...
Composer successfully installed to: C:Apache24htdocscomposer.phar
Use it: php composer.phar

первой командой перейдем в директорию «C:Apache24htdocs»
второй командой скачаем архив «composer.phar» в эту директорию
Перевод:
Все настройки верны для использования Composer
Загрузка…
Composer успешно установлен: C:Apache24htdocscomposer.phar
Использовать: php composer.phar

создадим файл «composer.bat»

C:Apache24htdocs>echo @php "%~dp0composer.phar" %*>composer.bat 

после выполнения данной команды рядом с архивом «composer.phar» появится файл «composer.bat»

теперь находясь в директории где расположены файлы «composer.phar» и «composer.bat» можно выполнить следующие команды

C:Apache24htdocs>composer -V
Composer version 1.0-dev (xx...xx) 2015-xx-xx xx:xx:xx
C:Apache24htdocs>composer -h

первая команда выводит версию composer
вторая команда выводит справочную информацию

По итогам изучения данного материала мы осуществили настройку PHP для работы в командной строке, на практике рассмотрели примеры выполнения
PHP-кода и запуска PHP скриптов в командной строке. А также нами был выполнен процесс установки composer`a.

В CLI SAPI есть три различных способа запуска PHP-кода:

  1. Указание конкретного файла для запуска.

    $ php my_script.php
    
    $ php -f my_script.php
    

    Оба способа (с указанием опции -f или без) запустят
    файл my_script.php. Нет ограничений, какой
    файл запускать; в частности, файлы не обязаны иметь
    расширение .php.

  2. Передать PHP-код напрямую в командной строке.

    $ php -r 'print_r(get_defined_constants());'
    

    Необходимо быть особо осторожным при использовании этого способа,
    т.к. может произойти подстановка переменных оболочки при использовании
    двойных кавычек.

    Замечание:

    Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов!
    Опция -r просто в них не нуждается, и их использование
    приведёт к ошибке разбора.

  3. Передать запускаемый PHP-код через стандартный поток ввода
    (stdin).

    Это даёт мощную возможность создавать PHP-код и
    передавать его запускаемому файлу, как показано в этом
    (вымышленном) примере:

    $ some_application | some_filter | php | sort -u > final_output.txt
    

Вы не можете комбинировать любой из этих трёх способов запуска кода.

Как и любое другое консольное приложение, бинарный файл PHP
принимает аргументы, но PHP-скрипт также может получать
аргументы. PHP не ограничивает количество аргументов,
передаваемых в скрипт (оболочка консоли устанавливает
некоторый порог количества символов, которые могут быть переданы;
обычно этого лимита хватает). Переданные аргументы доступны
в глобальном массиве $argv. Первый индекс
(ноль) всегда содержит имя вызываемого скрипта из командной
строки. Учтите, что если код вызывается на лету из командной
строки с помощью опции -r, значением
$argv[0] будет "Стандартный поток" («Standard input code»); до PHP 7.2.0 это был дефис ("-"). То же самое верно и для кода,
переданного через конвейер из STDIN.

Вторая зарегистрированная глобальная переменная — это
$argc, содержащая количество элементов
в массиве $argv
не количество аргументов,
переданных скрипту).

Если передаваемые аргументы не начинаются с символа
-, то особых проблем быть не должно.
Передаваемый в скрипт аргумент, который начинается с -
создаст проблемы, т.к. PHP решит, что он сам должен его
обработать. Для предотвращения подобного поведения
используйте разделитель списка аргументов --.
После того, как этот разделитель будет проанализирован PHP, все последующие
аргументы будут переданы в скрипт нетронутыми.

# Эта команда не запустит данный код, но покажет информацию об использовании PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]

# Эта команда передаст аргумент '-h' в скрипт, предотвратив показ справки PHP
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

Однако, в Unix-системах есть ещё один способ использования
PHP для консольных скриптов. Можно написать скрипт,
первая строка которого будет начинаться с
#!/usr/bin/php (или же другой
корректный путь к бинарному файлу PHP CLI).
После этой строки можно поместить обычный PHP-код, заключённый
в открывающие и закрывающие теги PHP. Как только будут установлены
корректные атрибуты запуска на файл (например,
chmod +x test), скрипт может быть
запущен как обычный консольный или perl-скрипт:

Пример #1 Запуск PHP-скрипта как консольного


#!/usr/bin/php
<?php
var_dump
($argv);
?>

Предполагая, что этот файл назван test
и находится в текущей директории, можно сделать следующее:

$ chmod +x test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

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

Исполняемый PHP-файл может использоваться для запуска PHP-скриптов
независимо от веб-сервера. В случае работы в Unix-подобной системе,
необходимо добавить в первую строку файла #! (называемый также «shebang»)
чтобы указать, какая из программ должна запускать скрипт.
На Windows-платформах можно назначить обработчик php.exe для файлов
с расширениями .php или создать пакетный
(.bat) файл для запуска скриптов посредством PHP.
Строка, добавляемая в начале скрипта для Unix-систем,
не влияет на их работу в ОС Windows, таким образом можно
создавать кроссплатформенные скрипты. Ниже приведён простой
пример скрипта, выполняемого из командной строки:

Пример #2 Скрипт, предназначенный для запуска из командной строки (script.php)


#!/usr/bin/php
<?phpif ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

Это консольный PHP-скрипт, принимающий один аргумент.

Использование:
<?php echo $argv[0]; ?> <option>

<option> Любое слово, которое вы хотели бы
напечатать. Опции --help, -help, -h,
или -? покажут текущую справочную информацию.

<?php
} else {
echo
$argv[1];
}
?>


В приведённом выше скрипте в первой строке содержится shebang,
указывающий что этот файл должен запускаться PHP. Работа ведётся с CLI-версией,
поэтому не будет выведено ни одного HTTP-заголовка.

Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к
имени скрипта, который также подсчитывается). Если их нет, или если переданный
аргумент был —help, -help,
-h или -?, выводится
справочное сообщение с использованием $argv[0], которое содержит
имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.

Для запуска приведённого примера в Unix-системе, нужно сделать
его исполняемым и просто выполнить в консоли
script.php echothis или
script.php -h. В Windows-системе можно
создать пакетный файл:

Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)

@echo OFF
"C:phpphp.exe" script.php %*

Предполагая, что вышеприведённый скрипт называется
script.php, а полный путь к CLI
php.exe находится в
C:phpphp.exe, этот пакетный файл
запустит его с переданными параметрами:
script.bat echothis или
script.bat -h.

Также можно ознакомиться с модулем
Readline для получения
дополнительных функций, которые можно использовать для улучшения
консольного PHP-скрипта.

В Windows запуск PHP можно настроить без
необходимости указывать C:phpphp.exe или
расширение .php.
Подробнее эта тема описана в разделе
Запуск PHP из
командной строки в Microsoft Windows.

Замечание:

В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя.
При работе в сетевой службе некоторые операции не будут выполнены, поскольку
«сопоставление имён учётных записей и идентификаторов безопасности не выполнено».

php at richardneill dot org

9 years ago


On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:

1:  #!/usr/bin/php
2:  #!/usr/bin/env  php
3:  #!/usr/bin/php -n
4:  #!/usr/bin/php -ddisplay_errors=E_ALL
5:  #!/usr/bin/php -n -ddisplay_errors=E_ALL

1. is the standard way to start a script. (compare "#!/bin/bash".)

2. uses "env" to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.

3. if you don't need to use env, you can pass ONE parameter here. For example, to ignore the system's PHP.ini, and go with the defaults, use "-n". (See "man php".)

4.  or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it's too late: if your script has a parse error, it will silently die.

5. This will not (as of 2013) work on Linux. It acts as if the whole string, "-n -ddisplay_errors=E_ALL" were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.

Summary: use (2) for maximum portability, and (4) for maximum debugging.


email at alexander-bombis dot de

1 year ago


For Windows:

After the years I also have the fact that I have to use double quotation marks after php -r on Windows shell.

But in the Powershell you can use single or double quotation!


gabriel at figdice dot org

6 years ago


Regarding shebang:

In both Linux and Windows, when you execute a script in CLI with:

    php script.php

then PHP will ignore the very first line of your script if it starts with:

    #!

So, this line is not only absorbed by the kernel when the script file is executable, but it is also ignored by the PHP engine itself.

However, the engine will NOT ignore the first #! line of any included files withing your "outer" script.php.
Any "shebang" line in an included script, will result in simply outputting the line to STDOUT, just as any other text residing outside a <?php ...  ?> block.


david at frankieandshadow dot com

6 years ago


A gotcha when using #!/usr/bin/php at the start of the file as noted above:

if you originally edited the file on Windows and then attempt to use it on Unix, it won't work because the #! line requires a Unix line ending. Bash gives you the following error message if it has DOS line endings:
"bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory"

(In Emacs I used "CTRL-X ENTER f" then type "unix" and ENTER to convert)


spencer at aninternetpresence dot net

11 years ago


If you are running the CLI on Windows and use the "-r" option, be sure to enclose your PHP code in double (not single) quotes. Otherwise, your code will not run.

petruzanautico at yah00 dot com dot ar

11 years ago


As you can't use -r and -f together, you can circumvent this by doing the following:
php -r '$foo = 678; include("your_script.php");'

synnus at gmail dot com

4 years ago


in php.ini use auto_prepend_file="init.php"
first start script

I am trying to run a php script locally placed under wamp folder in cygwin command line but getting the following error —
«-bash: php: command not found»

The Local Server I am using is WAMP.
The php.exe file is in the path C:/wamp64/bin/php/php5.6.24
and I am using cygwin in windows 10.

Any suggestion regarding this will be highly appreciated.

Many thanks in advance.

Ritaja

  • php
  • cygwin
  • wamp
  • wampserver

asked Nov 17, 2016 at 10:18

user2656743's user avatar

5

  • either use a full path /cygdrive/c/wamp64/bin/php/php5.6.24/php.exe or add the directory to your cygwin environment

    Nov 17, 2016 at 10:23

  • Just never add the path to PHP into your Windows PATH

    Nov 17, 2016 at 10:24

  • Or run the script from a window command window

    Nov 17, 2016 at 10:25

  • Thanks, I have tried running the command from windows console but it has thrown an error — ‘php’ is not recognized as an internal or external command, operable program or batch file.

    Nov 17, 2016 at 10:48

I am trying to run a php script locally placed under wamp folder in cygwin command line but getting the following error —
«-bash: php: command not found»

The Local Server I am using is WAMP.
The php.exe file is in the path C:/wamp64/bin/php/php5.6.24
and I am using cygwin in windows 10.

Any suggestion regarding this will be highly appreciated.

Many thanks in advance.

Ritaja

  • php
  • cygwin
  • wamp
  • wampserver

asked Nov 17, 2016 at 10:18

user2656743's user avatar

5

  • either use a full path /cygdrive/c/wamp64/bin/php/php5.6.24/php.exe or add the directory to your cygwin environment

    Nov 17, 2016 at 10:23

  • Just never add the path to PHP into your Windows PATH

    Nov 17, 2016 at 10:24

  • Or run the script from a window command window

    Nov 17, 2016 at 10:25

  • Thanks, I have tried running the command from windows console but it has thrown an error — ‘php’ is not recognized as an internal or external command, operable program or batch file.

    Nov 17, 2016 at 10:48

Like this post? Please share to your friends:
  • Команда net send в windows 10
  • Кодировке ascii расширенной с кодовой страницей windows 1251
  • Команда move в командной строке windows
  • Кодировка файла windows 1251 что это
  • Команда mem в командной строке windows 10 не работает