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)?
Respuesta
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
.
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.
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.
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".
Eclipse y PHPStorm tienen características similares. – DanMan
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.
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
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á.
Espero que ayude y no importa lo feo que sea :-) :) :) –
si lo hace ... merece un voto anticipado :) .. –
- 1. Smarty: evaluar una plantilla almacenada en una variable PHP
- 2. ¿Dónde se encuentra mstest.exe?
- 3. ¿Cómo saber dónde se define una función?
- 4. Dónde se define C++ size_t en Linux
- 5. variable de vacío define en php
- 6. Smarty - variable Además
- 7. Verificando si se define una variable?
- 8. Smarty: substr a variable
- 9. Rieles: ¿Dónde se define "params"?
- 10. ¿Dónde se encuentra modelBuilder.IncludeMetadataInDatabase en EF CTP5?
- 11. ¿Cómo puedo incrementar una variable Smarty?
- 12. ¿Dónde se define ptrdiff_t en C?
- 13. ¿Dónde se define instance_eval en Ruby 1.9.2?
- 14. ¿Cómo puedo encontrar dónde se define una constante en Ruby?
- 15. Dónde se encuentra el andamio en RubyMine
- 16. Verificando $ _POST variable se encuentra
- 17. Determinar dónde se define un tipo
- 18. Cómo definir una variable con valores aleatorios en Smarty
- 19. Cadena de concatenación con variable en smarty
- 20. ¿Dónde se define la macro DEBUG?
- 21. ¿Dónde se define la función err_sys()?
- 22. Averiguar dónde se inicializa una variable
- 23. ¿Dónde se encuentra la carpeta Android SDK?
- 24. ¿Dónde se encuentra un archivo RDL publicado?
- 25. ¿Dónde se encuentra el repositorio local?
- 26. ¿Dónde se encuentra el intérprete Ruby?
- 27. ¿Dónde se encuentra el registro de PHPMailer?
- 28. ¿Cómo se define una variable de MS-DOS?
- 29. Define la variable en Ruby
- 30. ¿Cómo detectar dónde se encuentra una pérdida de memoria?
+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