PHP скрипт обнаруживает, что это включение - PullRequest
1 голос
/ 20 апреля 2011

У меня есть файл класса PHP, который используется как включение как через веб-сервер, так и процессом cron.Я ищу способ добавить некоторый код в заголовок сценария, чтобы я мог определить, запускается ли сценарий непосредственно из командной строки, а не включается в другой сценарий.Таким образом, я могу немного упростить тестирование, вызвав скрипт напрямую и с помощью функции создать экземпляр объекта и выполнить для него некоторый код без необходимости создания для него скрипта-оболочки.

Я пытался использовать if (php_sapi_name() == 'cli') {, ноэто проверяет истину, даже если скрипт включен в другой скрипт, который был вызван из командной строки.

Ответы [ 4 ]

3 голосов
/ 27 мая 2012

Проверка того, что $ argv [0] установлена, позволяет узнать, были ли вещи вызваны из командной строки;он не сообщает вам, был ли файл вызван напрямую или был включен из другого файла.Чтобы определить это, проверьте, если realpath($argv[0]) == realpath(__FILE__).

Соединение всего этого:

2 голосов
/ 20 апреля 2011

Вы можете проверить наличие $argv. Если установлено $argv[0] (имя скрипта), ваш скрипт запускается из командной строки.

1 голос
/ 20 апреля 2011

Вы можете проверить, если $_SERVER['DOCUMENT_ROOT'] пусто.Он будет пустым при выполнении командной строки, поскольку это переменная, предопределенная apache.

Что интересно, $_SERVER['DOCUMENT_ROOT'] определено, но пусто.Я бы предположил, что он не будет определен вообще при использовании cli.

Вы также можете проверить, определен ли $argv или его размер (по крайней мере, 1 при использовании CLI).Я не проверял при включении файла, но если он определен, sizeof($argv) определенно будет 0.

Другие возможные тесты: $_SERVER['argc'] (0 при выполнении сервером, 1 при выполнении из CLI) истранный $_SERVER['_'], определенный для пути к двоичному файлу PHP, который вообще не определяется при обслуживании.

В заключение я бы полагался на $_SERVER['argc'] (или $argc), который является прямым счетомколичество аргументов, передаваемых в командную строку: всегда будет 0, когда сценарий обслуживается.Полагаться на $ argv сложнее: вы должны проверить, установлена ​​ли $argv[0] или sizeof($argv)> 0.

0 голосов
/ 20 апреля 2011

Я успешно использовал if (defined('STDIN')) в качестве такой проверки.STDIN будет определено, если скрипт запускается из оболочки, но не если он находится в серверной среде.

Как вы можете видеть здесь и по ссылке, предоставленной Райаном в своем комментарии, существует множество возможностей..

...