2011-07-20 2 views
31

Мне нужно выполнить php-файл с параметрами через оболочку.Shell run/execute php script с параметрами

вот как я бы запустить файл PHP:

PHP -q HTDOCS/file.php

мне нужно иметь параметр 'шоу' быть пропущено и

PHP -q HTDOCS/file.php? показать = SHOW_NAME

не работает

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

+0

Лучший ответ, чем принятый: вместо «php» используйте исполняемый файл «php-cgi». См. Http://stackoverflow.com/a/11965479/543738 –

ответ

35

test.php:

<?php 
print_r($argv); 
?> 

Shell:

$ php -q test.php foo bar 
Array 
(
    [0] => test.php 
    [1] => foo 
    [2] => bar 
) 
+1

Итак, я не могу получить параметры через $ _GET в php, но через $ argv, спасибо. Мне потребовалось некоторое время, чтобы понять это. –

3

Вам необходимо прочитать параметры командной строки от $argc и $argv.

Использование вопросительного значка - это то, что вы делаете в URL-адресе и не имеет ничего общего с выполнением PHP из командной строки.

Смотрите также: http://www.sitepoint.com/php-command-line-1/

2

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

FOO=42 BAR=quux php test.php 

Они будут доступны в суперглобальном $_ENV.

+0

При вводе этой команды я получаю сообщение об ошибке «FOO». Я использую команду оболочки xampp для Windows, это что-то меняет? –

+0

Вероятно, он не будет работать в Windows, но он будет отлично работать в большинстве оболочек типа unix. – troelskn

+0

Я получил его на работу, я ожидал, что он будет получен функцией PHP $ _GET []. Мне потребовалось некоторое время, чтобы понять, что $ arvg содержит все параметры. Благодарю. –

0

Если вы используете его из PHP-файл, то вы можете использовать POPEN() и сделать что-то вроде этого:

$part = $show_name; //or whatever you want with spaces 

$handle = popen("php -q nah.php -p=". escapeshellarg($part) . " 2>&1", "r"); 

Это использует функцию escapeshellarg(), чтобы обернуть $part переменную в кавычки (и избегать любых кавычек внутри него), так что он может быть безопасно использован в качестве аргумента оболочки.

5

Если у вас есть веб-сервер (устанавливается не только PHP интерпретатором, но LAMP/LNMP/и т.д.) - просто попробуйте это

wget -O - -q -t 1 "http://mysite.com/file.php?show=show_name" >/dev/null 2>&1 

где:

  • «-О -» - (Letter «O», а не ноль!) Перенаправление "загруженное HTML" на стандартный вывод
  • «>/DEV/нуль 2> & 1» - перенаправление STDOUT & выхода Stderr в никуда
  • «-q» - тихий Wget пробег
  • «-t 1 »- просто пытаются подключиться (не так, как по умолчанию 20)

в РНР "Exec", это будет чем-л так:

function exec_local_url($url) { 
    exec('/usr/bin/wget -O - -q -t 1 "http://'. $_SERVER['HTTP_HOST'] .'/' 
    . addslashes($url) . '" >/dev/null 2>&1' 
); 
} 

// ... 

exec_local_url("file.php?show=show_name"); 
exec_local_url("myframework/seo-readable/show/show_name"); 

Итак, вам не нужно менять свои скрипты для обработки argc/argv и, как обычно, может использовать $ _GET.

Если вы хотите, чтобы работа выполнялась в фоновом режиме - см. Ex. Unix/Windows, Setup background process? from php code

Я использую подход с wget в своих работах cron; Надеюсь, поможет.

+0

Есть ли разница между использованием команд 'wget' и' php' при выполнении заданий с 'exec' в отношении безопасности или производительности? – Gixty

+0

Я уверен, что безопасность такая же. Производительность - разумеется, 'wget' будет более медленным, но очень удобным, как у указанного верхнего. С помощью wget запрос проходит все скрытые этапы или обрабатывает запросы, такие как кеши apache/nginx/lighttpd, переписывает и так далее. При прямом вызове 'php' вы будете обвинять столь сложное обходное решение, т. Е. Оно применимо не во всех случаях. Во всяком случае, я думаю, вы просто должны принять ваш текущий случай, ваш мозг, инструмент для сравнения и просто перетасовать его хорошо! ;) – FlameStorm