2010-09-01 3 views
9

Я использую Zend Framework, и я использую .htaccess для некоторых настроек. Теперь я пишу сценарии командной строки для планирования (например, cron). Сценарии командной строки не смотрят на файл .htaccess, потому что они не обслуживаются Apache. Я хотел бы разобрать .htaccess с моим скриптом, чтобы получить некоторые настройки. Вот строки я в частности интересует:Анализ файла .htaccess с помощью PHP

SetEnv APPLICATION_ENV development 

php_value date.timezone America/New_York 

Я заметил PEAR File_HtAccess пакет, но это, кажется, только адрес части аутентификации файла .htaccess.


РЕШЕНИЕ: (с кредитом из Bamieater)

echo заявления для вывода отладки, удаленного из рабочего кода.

$htaccess = file(realpath(dirname(__FILE__)) . '/.htaccess'); 
echo '<pre>'; 
foreach ($htaccess as $line) { 
    if (preg_match('/^\s*SetEnv\s+APPLICATION_ENV\s+(.*?)\s*$/', trim($line), $matches)) { 
     defined('APPLICATION_ENV') || define('APPLICATION_ENV', $matches[1]); 
     echo APPLICATION_ENV . PHP_EOL; 
    } elseif (preg_match('/^\s*php_(?:admin_)?value\s+date\.timezone\s+(.*?)\s*$/', $line, $matches)) { 
     date_default_timezone_set($matches[1]); 
     echo date_default_timezone_get() . PHP_EOL; 
    } 
} 
echo '</pre>'; 
+1

Хммм. Не являются ли файлы конфигурации Apache довольно просто проанализировать вручную? Все это 'имя значение' и игнорировать строки, начинающиеся с' # '. –

+0

Вы используете linux: ubuntu или windows –

+0

@Pekka - Это правда, но я думал, что может быть уже написан фрагмент @JapanPro - это Linux. CentOS, я полагаю. – Sonny

ответ

5

Читайте файл .htaccess в строке и используйте регулярное выражение для доступа к данным.

Например что-то вроде этого:

$line = "php_value date.timezone America/New_York"; 
$pattern = "@^php_value date.timezone (.*)[email protected]"; 

if(preg_match($pattern,$line,$matches)) 
{ 
    print_r($matches); 
} 
+1

Просто добавление: я бы использовал '/^\ s * php _ (?: admin _)? Value' ..., только немного более уверенность. – Wrikken

+0

@Wrikken - Я понимаю часть '\ s *', но что делает '(?: Admin _)?' Выполнить? – Sonny

+0

Нашел ответ. Параметры 'php_admin_value' устанавливают одинаковые значения, но не могут быть переопределены. '?: 'в начале подшаблона предотвращает захват совпадений. – Sonny

1

Синтаксический .htaccess, несмотря на это легко сделать, это не самое лучшее решение, на мой взгляд.

Переменная окружения может быть установлена ​​в разных местах, поэтому вам нужно будет проверить все файлы (например, главную конфигурацию Apache, другие .htaccesses).

Я рекомендую установить отдельные переменные среды для ваших сценариев оболочки,

export APPLICATION_ENV=staging 

Я сохранить эти настройки в глобальных свойствах сервера (Apache конфигурации и .bashrc), поэтому автоматически все приложения знают, где они не меняют файлы при развертывании.

+0

Я согласен с вашим мнением, но в моем случае я не контролирую среду Apache и не имею доступ к командной строке, поэтому этот один файл .htaccess является единственным местом, где установлена ​​эта переменная среды. Мое решение работает для меня, но может быть не оптимальным для других. – Sonny

+0

Согласовано. Я предположил, что если вы можете написать сценарий командной строки, вы также можете экспортировать переменную среды. – takeshin

1

Поздний ответ, но он может вас заинтересовать (или другие, которые входят в эту тему).

Я написал немного .htaccess парсер в PHP, который позволяет манипулировать файлом как ArrayObject.

Вы можете проверить проект here (GitHub).

2

Заимствование немного от Bamieater, вот более полная функция, которую вы можете занести в начало вашего файла задания cron, который устанавливает переменные среды и включает в себя файл php_prepend_file.

function isCLI() { 
    return (PHP_SAPI == 'cli'); 
} 

function loadEnvironmentFromHtaccess($file) { 
    $line = file_get_contents($file); 

    $pattern = '@SetEnv (?P<env>[^ ]*) (?P<value>[^ \n]*)@'; 
    preg_match_all($pattern, $line, $matches, PREG_SET_ORDER); 
    foreach ($matches as $match) { 
     $_SERVER[$match['env']] = $match['value']; 
    } 

    $pattern = '@php_value auto_prepend_file (?P<value>[^ \n]*)@'; 
    if (preg_match($pattern, $line, $matches)) { 
     require $matches['value']; 
    } 
} 

if (isCLI()) { 
    loadEnvironmentFromHtaccess(dirname(__FILE__).'/../../.htaccess'); 
}