Как выполнить код PHP из командной строки?

163

Я хотел бы выполнить один оператор php, как if(function_exists("my_func")) echo 'function exists';непосредственно в командной строке, без необходимости использовать отдельный файл php.

Как это возможно ?

Стив
источник
1
выполнение функции function_exists () без использования каких-либо других файлов, содержащих пользовательские функции, не принесет особого успеха, за исключением тестирования версии PHP, которую вы можете узнать другими способами. Какую функцию вы хотите проверить?
Мэтт Гибсон
Я ищу для тестирования этой функции: sg_load ()
Стив
2
Похоже, что вы действительно хотите узнать, включено ли расширение sourceguardian php?
Мэтт Гибсон
2
тогда phpinfo () должен сказать вам.
Jpic

Ответы:

257

Если вы собираетесь использовать PHP в командной строке, я рекомендую установить phpsh, достойную оболочку PHP . Это намного веселее.

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

-r <code>        Run PHP <code> without using script tags <?..?>
-R <code>        Run PHP <code> for every input line

Вы можете использовать параметр php -r как таковой:

php -r 'echo function_exists("foo") ? "yes" : "no";'

Приведенная выше команда PHP должна выводить no и возвращать, 0 как вы можете видеть:

>>> php -r 'echo function_exists("foo") ? "yes" : "no";'
no
>>> echo $? # print the return value of the previous command
0

Еще один забавный переключатель - php -a :

-a               Run as interactive shell

Это немного неуместно по сравнению с phpsh , но если вы не хотите устанавливать потрясающую интерактивную оболочку для php, созданную Facebook, чтобы получить завершение вкладки, историю и т. Д. , То используйте -a как таковой :

>>> php -a
Interactive shell

php > echo function_exists("foo") ? "yes" : "no";
no
php > 

Если он не работает на вашем компьютере, как на моем компьютере * es * ( протестирован на Ubuntu и Arch), то, вероятно, ваши настройки PHP нечеткие или неверные . Если вы запустите эту команду:

php -i | grep 'API'

Вы должны увидеть:

Server API => Command Line Interface

Если вы этого не сделаете , это означает, что, возможно, другая команда предоставит CLI SAPI . Попробуйте php-cli, возможно это пакет или команда, доступная в вашей ОС.

Если вы видите, что ваша команда php использует CLI (интерфейс командной строки) SAPI (Server API), то запустите, php -h | grep codeчтобы выяснить, какой сумасшедший переключатель - поскольку он не изменился за год - позволяет запускать код в вашей версии / настройке.

Еще пара примеров, просто чтобы убедиться, что это работает на моих коробках:

>>> php -r 'echo function_exists("sg_load") ? "yes" : "no";' 
no
>>> php -r 'echo function_exists("print_r") ? "yes" : "no";' 
yes

Также обратите внимание, что возможно, что расширение загружено в CLI, а не в CGI или Apache SAPI. Вполне вероятно, что несколько PHP SAPI используют разные файлы php.ini , например, /etc/php/cli/php.iniпротив /etc/php/cgi/php.inivs /etc/php/apache/php.iniна коробке Gentoo. Узнайте, какой файл INI используется с php -i | grep ini.

jpic
источник
Может быть, ваша настройка PHP не работает. Я обновил свой ответ, включая подсказки, чтобы понять это.
Jpic
Добавлена ​​заметка о php -a, которая может быть вам полезна.
Jpic
6
Обратите внимание, что phpsh больше не поддерживается его автором (Facebook), и кто-то на странице групп Google сказал в 2012 году, что «phpsh на самом деле больше не поддерживается и не полезен» . Вы можете заглянуть в Boris REPL для улучшенной консоли php.
Бен Криси
3

В командной строке:

php -i | grep sourceguardian

Если это там, то вы получите текст. Если нет, вы ничего не получите.

Мэтт Гибсон
источник
4
Либо я слепой, либо этот ответ не имеет ничего общего с вопросом. Как этот ответ должен ответить на вопрос « Как запустить PHP-код непосредственно из командной строки, без сохранения PHP-кода в .phpфайл? »?
Трейдер
15
@trejder Какое-то время я задавался вопросом, ответил ли я не на тот вопрос, но потом я посмотрел историю изменений и комментарии. Это отвечает тому, что ОП действительно нужно: выяснить, было ли загружено конкретное расширение PHP. С тех пор этот вопрос был перефразирован, поэтому сейчас он не очень хорошо подходит.
Мэтт Гибсон
3

Ты можешь использовать :

 echo '<?php if(function_exists("my_func")) echo "function exists"; ' | php

Короткий тег " <? = " Также может быть полезен:

 echo '<?= function_exists("foo") ? "yes" : "no";' | php
 echo '<?= 8+7+9 ;' | php

Закрывающий тег "?>" Необязателен, но не забывайте последний ";" !

fred727
источник
2
Кажется, это больше проблем, чем 7-летний принятый ответ. При использовании php -rвам не нужно беспокоиться об открытии тегов PHP.
miken32