2009-09-29 3 views
1

Я пытаюсь получить имя исполняемого скрипта (но не включить его вызывает).PHP Магические константы

echo basename(__FILE__); # will always output include.php 

echo basename($_SERVER['SCRIPT_FILENAME']); 
# This will do what I want (echo myscript.php), but I was wondering if there was 
# a better way to grab it, as I have had problems with $_SERVER['SCRIPT_FILENAME'] 
# when running certain scripts from a cron. 

Любые предложения?

<? 
#myscript.php 
require('include.php'); 
echo "Hello all"; 
?> 

<? 
#include.php 
echo basename(__FILE__); 
echo basename($_SERVER['SCRIPT_FILENAME']); 
?> 

Спасибо!

ответ

2

Вы должны использовать $ _SERVER [ 'SCRIPT_NAME'], как объяснено в reserved_variables человека странице

'SCRIPT_NAME' Содержит путь текущего сценария. Это полезно для страниц, которые должны указывать на себя. Константа __FILE__ содержит полный путь и имя файла текущего (т.е. включенного) файла.

+0

Просто, чтобы сообщить, по какой-либо причине, старый сервер, в котором я использовал $ _SERVER ['SCRIPT_FILENAME'] и, возможно, $ _SERVER ['SCRIPT_NAME'] ничего не возвращал при запуске через cron. Но я говорю вам об использовании SCRIPT_NAME над SCRIPT_FILENAME. Так спасибо – Lizard

+0

$ _SERVER ["argv"] [0] может иметь то, что вы хотите. – Neel

+0

argv [0] - это имя сценария, так как оно вызывается линией cmd, поэтому путь включен как абсолютный, относительный (путь/имя.php, ./path/name.php и т. Д.) В зависимости от __how__ вы вызываете скрипт , Более того, это может быть неопределенным, если не в среде cli – drAlberT

0

Я помню, используя '$_SERVER["SCRIPT_NAME"]', но понятия не имею, есть ли у него проблемы с кукурузой.

+0

Я думаю, что вы имеете в виду хрон. –

+0

Но мне нравится кукуруза. : p – NawaMan

1

Если вы используете что-то `php -f /home/me/foo.php в своем crontab (т. Е. php-cli), вам также может быть интересен массив $argv. $ argv [0] содержит путь/имя скрипта, первоначально переданного в php.

+0

Спасибо, что будет полезно! Не думал использовать это для этого сценария. – Lizard

0

Когда PHP выполняется из командной строки (вероятно, как вы хрон настроить) SCRIPT_FILENAME будет содержать путь, указанный пользователем. Если ваш скрипт выполнен как ../myscript.php, то это значение, которое вы получите. Видя, как вы передаете значение через basename() в любом случае, оно должно по-прежнему соответствовать вашим потребностям. Какие проблемы у вас были с этим?

SCRIPT_NAME еще одна предопределенных переменный смотреть, но это не всегда будет содержать абсолютного пути к исполняемому файлу либо.

+0

Не совсем уверен, почему это произошло или как, с тех пор мы переместили серверы и все работает как ожидалось сейчас. Просто хотелось проверить, что переменная $ _SERVER была той, которую я должен использовать. – Lizard

1

Я сделал несколько тестов на то, что у вас есть и не имеет, и там это решение, которое отлично работает для меня;) Файл, из которого этот код является именем Debug.php и ниже, является методом, отвечающим за имя файл журнала.

Как в браузере и в хрон результат в моем случае: test.log

public static function filename($value = null) { 
     static $_filename; 
     if (isset($value)) $_filename = $value; 
     if ($_filename === null) { 
      $_filename = ''; 
      if (strlen($_SERVER["SCRIPT_FILENAME"])) { 
       $filename = $_SERVER["SCRIPT_FILENAME"]; 
      } else if (count($_SERVER["argv"])) { // for cron calls 
       $filename = $_SERVER["argv"][0]; 
      } 
      if (!strlen($filename)) { 
       $filename = __FILE__; 
      } 
      $arr = explode('.', basename($filename)); 
      $_filename = array_shift($arr) . '.' . Debug::extension(); 
     } 
     return $_filename; 
    } 
Смежные вопросы