2010-09-01 33 views
9

Estoy usando el Zend Framework, y uso el .htaccess para algunas configuraciones. Ahora estoy escribiendo scripts de línea de comandos para la programación (por ejemplo, cron). Los scripts de línea de comando no miran el archivo .htaccess porque Apache no los ha servido. Me gustaría analizar el .htaccess con mi script para recuperar algunas configuraciones. Estas son las líneas Estoy especialmente interesado en:Analizando un archivo .htaccess con PHP

SetEnv APPLICATION_ENV development 

php_value date.timezone America/New_York 

me di el paquete PEAR File_HtAccess, pero parece que para hacer frente a solamente porciones de autenticación del archivo .htaccess.


SOLUCIÓN: (con crédito debido a Bamieater)

echo declaraciones para la salida de depuración, se retiran de código de trabajo.

$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

Hmmm. ¿No son los archivos de configuración de Apache bastante fáciles de analizar manualmente? Todo es 'name value' e ignora las líneas que comienzan con' # '. –

+0

estás usando linux: ubuntu o windows –

+0

@Pekka - Eso es cierto, pero pensé que podría haber un fragmento ya escrito @JapanPro - Es Linux. CentOS, creo. – Sonny

Respuesta

5

Lea el archivo .htaccess por línea y use una expresión regular para acceder a los datos.

Por ejemplo algo como esto:

$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

Solo una adición: usaría '/^\ s * php _ (?: admin _)? Value' ..., solo ese poco más de robustez. – Wrikken

+0

@Wrikken - Entiendo la parte '\ s *', pero ¿qué logra '(?: Admin _)?'? – Sonny

+0

Encontré la respuesta. La configuración 'php_admin_value' establece los mismos valores, pero no puede anularse. ¿?: 'al comienzo de un subpatrón evita que se capturen coincidencias. – Sonny

1

análisis sintáctico .htaccess, a pesar de que es fácil de hacer, no es la mejor solución en mi opinión.

La variable de entorno se puede establecer en diferentes lugares, por lo que deberá verificar todos los archivos (por ejemplo, configuración principal de Apache, otros .htaccesses).

me gustaría recomendar el establecimiento de la variable de entorno separado para las secuencias de comandos shell,

export APPLICATION_ENV=staging 

guardo esos ajustes en las propiedades globales del servidor (configuración de Apache y .bashrc), por lo que automáticamente todas las aplicaciones saben dónde son sin cambiar los archivos en la implementación.

+0

Estoy de acuerdo con su opinión, pero en mi caso no tengo control sobre el entorno Apache, ni tengo acceso a la línea de comandos, por lo que este archivo '.htaccess' es el único lugar donde se establece esta variable de entorno. Mi solución funciona para mí, pero puede no ser óptima para otros. – Sonny

+0

De acuerdo. Supuse que si puedes escribir un script de línea de comandos, también puedes exportar una variable de entorno. – takeshin

1

Una respuesta tardía, pero puede que le interese (u otros que entren en este hilo).

Escribí un pequeño analizador .htaccess, en PHP, que permite manipular el archivo como un ArrayObject.

Puede consultar el proyecto here (GitHub).

2

Tomando prestado un poco de Bamieater, aquí hay una función más completa que puede colocar al principio de su archivo cron de trabajo que establece las variables de entorno e incluye el 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'); 
}