выполнить строку кода PHP в командной строке - PullRequest
56 голосов
/ 02 июня 2010

Я хотел бы иметь возможность запускать строку PHP-кода в командной строке подобно тому, как работают следующие параметры:

:~> perl -e "print 'hi';"
:~> python -c "print 'hi'"
:~> ruby -e "puts 'hi'"

Я бы хотел иметь возможность:

:~> php "echo 'hi';"

Я читал, что есть опция -r, которая может делать то, что мне нужно для php, однако она не доступна, когда я пытаюсь ее использовать. Я пытался использовать PHP 5.2.13 и PHP 4.4.9, и ни у одного из них не доступна опция -r.

Я написал этот скрипт (который я назвал run_php.php) - который работает, но я не большой поклонник этого только потому, что я чувствую, что должен быть более "правильный" способ сделать это.

#!/usr/bin/php5 -q
<?php echo eval($argv[1]); ?> 

Мой вопрос: есть ли опция -r? Если так, почему он недоступен, когда я запускаю --help? Если нет опции -r, каков наилучший способ сделать это (без написания промежуточного скрипта, если это возможно)?

Спасибо!

=== РЕДАКТИРОВАТЬ ===

Поскольку я не думаю, что это было очень ясно выше, опция -r НЕ доступна для меня. Вот вывод php -h для обеих версий PHP, которые я использую.

PHP 4.4.9

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>] 
       php <file> [args...]
  -a               Run interactively
  -C               Do not chdir to the script's directory
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse <file>.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

php 5.2.13

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
       php <file> [args...]
  -a               Run interactively
  -C               Do not chdir to the script's directory
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse <file>.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

НЕТ опции -r. Когда я пытаюсь использовать опцию -r, я получаю:

Error in argument 1, char 2: option not found r

Извините за путаницу.

Ответы [ 5 ]

82 голосов
/ 02 июня 2010

EDIT2: Да, он есть в PHP 5,2 SAPI .

РЕДАКТИРОВАТЬ: Если вы не можете выполнить обновление, и в этом случае в PHP 5.2 такой опции нет (у меня нет ее для тестирования), вы можете сделать это:

glopes@nebm:~$ echo "<?php echo \"hi\\n\";" | php
hi

Оригинал:

Действительно, есть опция -r (хотя я не уверен насчет PHP 5.2):

D:\>php -r "echo 'hi';";
hi

Просто убедитесь, что вы используете версию PHP для командной строки. php --version должен дать вам что-то вроде этого (обратите внимание, "cli"):

D:\>php --version
PHP 5.3.0 (cli) (built: May 20 2010 19:05:12) (DEBUG)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
10 голосов
/ 26 декабря 2013

В новых версиях PHP вы просто набираете "php -a" и переходите в интерактивный режим, где вы можете экспериментировать с PHP.

4 голосов
/ 30 сентября 2015

Самый простой способ сделать это - использовать флаг -r. Тем не менее, я обнаружил, что он не допускает многострочный ввод. Чтобы обойти это, вы можете сделать это:

php -r "passthru(file_get_contents('php://stdin'));"

Который позволяет вам пайпить из stdin, вот так:

echo -n "echo 'test';" | php -r "passthru(file_get_contents('php://stdin'));"

Однако, чтобы ответить на оригинальный вопрос, если у вас нет флага -r, можно также использовать флаг -f - просто введите stdin в качестве файла для открытия: php -f /dev/stdin

Если вы сделаете это, имейте в виду, что а) вам нужно добавить пробел в начале ввода, и б) вы должны открыть с помощью <?php. Пример:

echo -ne " <?php\necho 'test';" | php -f /dev/stdin
4 голосов
/ 21 декабря 2013

Дополнительная точка с запятой не требуется в конце.

Вы можете упомянуть php -r "echo 'hi';" вместо php -r "echo 'hi';";

Другой пример (чтобы получить текущую метку времени в командной строке):

php -r 'print time()."\n";'
3 голосов
/ 02 июня 2010

Посмотрите на эту страницу Функции командной строки PHP , если вы еще этого не сделали.Есть некоторые сообщения о проблемах, основанных на ОС и двойных или одинарных кавычках.

Я также проверю информацию PHP

php -i

посмотрите, был ли PHP скомпилирован с отключенной поддержкой CLI (--disable-cli).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...