En estos dias he tenido la necesidad de instalar una copia de Symfony en un host compartido. Yo ya había instalado dicho software en un par de máquinas pero de forma totalmente libre y standard, cosa que no ocurre en los hosting compartidos donde, normalmente, existe una estructura fija que no responde a las necesidad del framework.
En este caso, mi proyecto Symfony consistía en una estructura “de manual”:
myproject
+—apps
¦ +—backend
¦ ¦ +—config
¦ ¦ +—i18n
¦ ¦ +—lib
¦ ¦ +—modules
¦ ¦ +—templates
¦ +—frontend
¦ +—config
¦ +—i18n
¦ +—lib
¦ +—modules
¦ +—templates
+—batch
+—cache
¦ +—frontend
¦ +—dev
¦ ¦ +—config
¦ ¦ +—i18n
¦ ¦ +—apps
¦ +—prod
¦ +—config
¦ +—i18n
¦ +—apps
+—config
+—data
¦ +—model
¦ +—sql
+—doc
+—lib
¦ +—model
¦ +—map
¦ +—om
+—log
+—plugins
+—test
¦ +—bootstrap
¦ +—functional
¦ ¦ +—backend
¦ ¦ +—frontend
¦ +—unit
+—web
+—css
+—images
+—js
+—uploads
+—assets
+—thumbnail
Al acceder al hosting me encuentro con una estructura donde:
El primer paso fue tomar conciencia de que era imposible instalar mi aplicación de esa forma. Symfony tiene un directorio web al que debe apuntar el virtual host y todo el resto de la aplicación debe estar por detrás de este.
En la empresa de hosting (servergrove) fueron muy gentiles, comprendieron el problema y me habilitaron un directorio por debajo de httpdocs para instalar mi aplicación. De esa forma, solo debería hacer que Symfony entendiera que su directorio web, normalmente dentro del árbol de la aplicación, estaba fuera de este, en httpdocs, algo que era posible por configuración.
Ahora el problema pasaba a ser la instalación de Symfony.
Primero intenté instalarlo a mano, descargando un tarball y poniéndolo en un directorio del host. Luego de muchas pruebas me rendí ya que no logré que eso funcionara.
La instalación normal y recomendada es utilizando PEAR y, dado que el hosting tenía PEAR instalado, imaginé que no vendría mal que hicieran la instalación ellos. Nuevamente la gente de servergrove me solucionó el problema y Symfony quedó instalado de forma standard en un directorio accesible por Apache y en el path.
Ahora ya podía ejecutar comandos de Symfony (por ejemplo limpiar el cache con symfony cc) dentro del directorio de mi aplicación. Y funcionaba !.
El siguiente paso consistía en indicarle a Symfony que el directorio web pasaría a ser httpdocs. Para hacer esto, es necesario ir al archivo index.php de nuestra aplicación y modificar lo siguiente:
define(’SF_ROOT_DIR’, dirname(__FILE__).’/../myproject’);
De forma tal que SF_ROOT_DIR apunte a nuestra aplicación.
Luego, en el archivo config/config.php de nuestra aplicación hay que modificar dos paths:
sfConfig::add(array(
’sf_web_dir’ => SF_ROOT_DIR.DIRECTORY_SEPARATOR.’www’,
’sf_upload_dir’ => SF_ROOT_DIR.DIRECTORY_SEPARATOR.’www’.DIRECTORY_SEPARATOR.sfConfig::get(’sf_upload_dir_name’),
));
De forma tal que quede así:
sfConfig::add(
array(
’sf_web_dir’ => SF_ROOT_DIR.DIRECTORY_SEPARATOR.’..’.DIRECTORY_SEPARATOR.’httpdocs’,
’sf_upload_dir’ => SF_ROOT_DIR.DIRECTORY_SEPARATOR.’..’.DIRECTORY_SEPARATOR.’httpdocs’.DIRECTORY_SEPARATOR.sfConfig::get(’sf_upload_dir_name’),
));
Cabe destacar que el archivo config a modificar es el de cada aplicación (por ej: myproject/apps/frontend/config.php) y no el del proyecto (myproject/config/config.php) porque el objeto sfConfig no esta disponible en el config del proyecto.
La instalación de Symfony tambien requiere establecer un alias en la definición del virtual host para algunos scripts y librerías que utiliza. Dado que esto es imposible en un hosting compartido, una solución sencilla es copiar el directorio sf de PEAR/symfony/ al directorio web de nuestra aplicación, en este caso httpdocs.
Con estos pasos, la aplicación esta lista para funcionar.
RSS feed for comments on this post · TrackBack URI
Leave a reply