2010-06-04 30 views
7

Actualmente estoy trabajando en un proyecto muy grande, y estoy bajo mucha presión para terminarlo pronto, y estoy teniendo un problema grave. El programador que escribió estas últimas variables definidas de una manera muy extraña: las variables de configuración no están todas en el mismo archivo, están distribuidas en todo el proyecto de más de 500 archivos y 100k + líneas de código, y estoy teniendo muchísimo tiempo averiguando dónde está determinada variable, para poder solucionar un problema.
¿Hay alguna forma de rastrear esta variable? Creo que está usando SMARTY (que no soporto, debido a problemas como este), y la variable es una variable de plantilla. Estoy bastante seguro de que la variable que estoy buscando se definió inicialmente como una variable PHP, luego esa variable se pasa a SMARTY, por lo que me gustaría rastrear el PHP, sin embargo, si eso es imposible, ¿cómo puedo rastrearlo? donde definió la variable para SMARTY?

P.S. Estoy en Vista y no tengo acceso ssh al servidor, por lo que 'grep' está fuera de cuestión.¿Encuentra dónde se define una variable en PHP (y/o SMARTY)?

+1

+1 por no me gusta Smarty. Si bien no los utilizo yo mismo, creo que php-debugger y xdebug pueden retroceder variables/contenidos en ámbitos externos o, al menos, todas las variables existentes. De todos modos, he encendido una vela de compasión por su situación de Vista y depuración. – mario

Respuesta

5

Este tipo de cosas es la razón # 1 por la que instalo Cygwin en todas mis máquinas Windows.

grep myvariablename `find project_dir -name "*.php"` 

No puedo imaginar la programación sin un trabajo grep.

+3

Prueba ack, es mejor que grep. No, realmente: http://betterthangrep.com/ – Charles

+1

Holy Smokes que se ve increíble. Instalando ahora desde CPAN en todas partes. – Nathan

+0

Hola, he estado usando ack por un par de semanas y me encanta. Gracias de nuevo, Charles! – Nathan

2

No es una solución perfecta, pero creo que agent ransack es útil para buscar directorios y archivos de gran tamaño. Podría ayudarte a reducir las cosas. Los resultados de búsqueda le permitirán leer la línea exacta en la que encuentra una coincidencia en el panel de resultados.

1

Simplemente use uno de los IDEs de PHP disponibles (o un editor de texto simple como Notepad ++ si realmente está desesperado) y busque el nombre de la variable en todos los archivos fuente (la mayoría de los IDEs de PHP también admiten encontrar funciones/variables fueron definidos y le permiten saltar a la pieza relevante de código). Aunque parece extraño que no sepas qué parte del código llama a la plantilla (ya sea Smarty o cualquier otra cosa en realidad no importa). Debería poder desglosar el código comenzando desde el URI (usando cualquier IDE que admita la depuración), porque de esa manera es probable que vea dónde se define dicha variable.

2

Si utiliza el netbeans editor sólo "click derecho" -> "Ir a definición"

O ctrl + click sobre la variable.

Si el editor no puede resolverlo, puede recurrir a la opción "Buscar en archivos".

+0

Eclipse y PHPStorm tienen características similares. – DanMan

7

Fuerza bruta, porque a veces las variables inteligentes no se asignan directamente, pero sus nombres se pueden almacenar en variables, concatenados de muchas cadenas o ser resultado de algunas funciones, que hacen que sea imposible encontrarlos en archivos simplemente buscando/greping .

En primer lugar, escribir su propia función para imprimir traza legible, es decir:

function print_backtrace() 
{ 
    $backtrace = debug_backtrace(FALSE); 
    foreach($backtrace as $trace) 
     echo "{$trace['file']} :: {$trace['line']}<br>"; 
} 

archivo Smarty principal abierta (Smarty.class.php por defecto) y alrededor de la línea 580 no es función llamada asignar. Modificarlo para observar nombre de la variable deseada:

function assign($tpl_var, $value = null) 
{ 
    if($tpl_var == 'FOOBAR') /* Searching for FOOBAR */ 
    { 
     print_backtrace(); 
     exit; 
    } 

La misma modificación puede ser necesario para la segunda función - as- sign_by_ref.Ahora, después de ejecutar el script que debe tener una salida como que:

D:\www\test_proj\libs\smarty\Smarty.class.php :: 584 
D:\www\test_proj\classes.php :: 11 
D:\www\test_proj\classes.php :: 6 
D:\www\test_proj\functions.php :: 7 
D:\www\test_proj\index.php :: 100 

puntos de segunda línea hasta el lugar donde se le asignó primera variable.

+0

Gracias, esta es una gran idea. Definitivamente estoy guardando este código para futuras depuraciones, sin embargo terminé simplemente usando grep como se sugiere a continuación. – Jon

1

Hay otra opción interesante, fea como el infierno pero útil si estás realmente perdido.

Si desea saber dónde se definió THE_NAME, escribir líneas como estas en un lugar que está seguro es ejecutar primero:

error_reporting(E_ALL); 
define('THE_NAME', 'Chuck Norris'); 

Si más adelante PHP ejecutará la definición que busca, lo hará escribir un anuncio como el siguiente:

Notice: Constant THE_NAME already defined 
in /home/there/can-rip-a-page-out-of-facebook.com/SomeConfiguration.php on line 89 

entonces usted sabe que la definición que busca está en el archivo SomeConfiguration.php en la línea 89.

Para que esto funcione, debe tener en cuenta

  • si hay HTTP hacia delante en el marco en el camino hacia el código se establece en
  • si hay más comandos de ajuste del modo de informe de errores de PHP

Por lo tanto, a veces es útil agregar algo de exit('here') para no difuminar la salida. Tal vez tenga que reducir un poco o tiene que establecer error_reporting anteriormente, pero lo encontrará.

+0

Espero que ayude y no importa lo feo que sea :-) :) :) –

+0

si lo hace ... merece un voto anticipado :) .. –