php - subir - heroku worker
Configura Yii2 Advanced en Heroku (1)
Necesito ayuda para configurar una aplicación avanzada Yii2 en Heroku. Ya instalé Yii localmente usando Composer, siguiendo exactamente su guía: http://www.yiiframework.com/doc-2.0/guide-tutorial-advanced-app.html
Mi sitio web funciona como debe ser local, con frontend y back-end:
http://localhost/yii2app/frontend/web/
http://localhost/yii2app/backend/web/
Cuando lo presiono y lo ejecuto en Heroku, recibo errores quejándose de que algunos archivos no se encuentran. Lo que es extraño, es con un terminal de bash a mi aplicación Heroku, ¡puedo verificar que el archivo está de hecho allí! ¿A Heroku no le gusta el ''../../'' para cambiar el directorio?
PHP Fatal error: require(): Failed opening required ''/app/frontend/web/../../common/config/main-local.php''
include_path=''.:/app/.heroku/php/lib/php'') in /app/frontend/web/index.php on line 12
En ''frontend / web / index.php'' está el código de acciones de Yii (la línea 12 es main-local.php):
$config = yii/helpers/ArrayHelper::merge(
require(__DIR__ . ''/../../common/config/main.php''),
require(__DIR__ . ''/../../common/config/main-local.php''),
require(__DIR__ . ''/../config/main.php''),
require(__DIR__ . ''/../config/main-local.php'')
);
Si tuviera que ver con ''../../'' para cambiar el directorio, entonces pensaría que el primer requerimiento tendría un error (para la entrada main.php).
¿Qué me hace falta para conseguir que Yii2 se ejecute en Heroku?
ACTUALIZACIÓN - Creé una nueva aplicación básica Yii2. Debería funcionar y ser simple, así que pensé. Aparentemente incluso la aplicación básica no funciona en Heroku. DEBE haber algo que quede fuera de los documentos, en algún lugar ... Compositor usado para instalar Yii2 básico, ponerlo bajo git, lo empujó a una nueva pila heroku. Fui a ver mi aplicación en heroku y agregué /web/index.php al final de la url.
ReflectionException
Class yii/debug/Module does not exist
Luego puse index.php en el directorio raíz que contiene phpinfo (). Puedo confirmar que recibo un informe phpinfo. Entonces php se está ejecutando, informa PHP 5.6.5.
Parece que Yii2 y Heroku no juegan bien sin algunos trucos mágicos (y no documentados). He buscado, buscado, y buscado, y no puedo encontrar nada al respecto. No puedo ser el único que intenta obtener una aplicación Yii en Heroku.
Así que probé CloudControl. Implementé mi aplicación básica Yii2 básica para el control de la nube, de nuevo recibí un informe phpinfo sobre la raíz index.php. Navegue a /web/index.php y obtenga errores:
Invalid Parameter – yii/base/InvalidParamException
The file or directory to be published does not exist: /srv/www/code/vendor/bower/jquery/dist
¡Lo que da! Puedo ejecutar esto localmente bien. Cuando lo envío a un host basado en la nube (Heroku o CloudControl) ¡falla! Pensé que la aplicación yiibasic sería mejor para al menos ejecutarla para PoC, pero Yii fuera de la caja no se ejecutará en ninguno de esos servicios. Hay algo que no se menciona que me falta.
Finalmente después de horas y horas de perder el tiempo, lo descubrí. Bueno, todavía me queda una pregunta que debo probar (y volver a intentar). Sin embargo, logré obtener las aplicaciones avanzadas yii yii avanzadas en Heroku. Todavía tengo errores en CloundControl, pero eso es por otro día.
Me faltaban 2 entradas en mi archivo composer.json. No sé por qué estos no están incluidos en la documentación de Yii si se requieren en producción. Aquí está mi bloque require (no tuve que editar la sección require-dev, solo requiero):
"fxp/composer-asset-plugin": "*",
"ext-gd": "*"
El complemento de activos del compositor era absolutamente obligatorio. La extensión GD es necesaria para la página de contacto con nosotros (supongo que el captcha). También comenté las primeras 2 líneas en web / index.php para el YII_DEBUG define. Una vez que hice eso, actualizó el compositor, actualizó git, y empujó, sucedió la magia :)
No creo que te informen que necesitas editar web / index.php para eliminarlos en los documentos Yii2. Parece que solo están interesados en ayudarte a desarrollar. Sí, el archivo de índice tiene comentarios, pero tenemos que saber qué buscar allí. Si no los elimina, Yii cargará sus herramientas de depuración, que no existen. Supongo que cuando Heroku recibe el empuje, ejecuta el compositor del bloque "requerir".
En cuanto a la plantilla avanzada, los archivos index.php frontend y backend ya tienen las constantes de depuración correctas para dev y producción. Solo tienes que ejecutar php init --env=Production --overwrite=All
en el servidor (no pude obtener heroku para hacer esto, pero otro día). Los documentos Yii te hacen ejecutar init, luego seleccionas desarrollo. Esto toma todo de la carpeta "environments / dev" y los sobrescribe en sus ubicaciones en su aplicación. Esto fracasará cuando esté en desarrollo. Por lo tanto, debe cambiarlo a producción, lo que activará sus archivos de producción. Entiendo por qué tendrías esto, así que lo entiendo .. Como dije, probé heroku run bash
, luego ejecutando php init --env=Production --overwrite=All
desde el directorio de aplicaciones, pero no parecía hacer el interruptor. Por lo tanto, a mi aplicación le faltaba el archivo frontend / web / index.php, y muchos más.
Me preguntaba cómo ''frontend / web / index.php'' ni siquiera estaba en el directorio, pero una inspección más profunda vi que muchos directorios tenían archivos de gitignore. Así que cuando ''git push heroku master'', ''frontend / web / index.php'' junto con el resto, nunca se presionen porque se ignoran. Entonces, como no pude hacer que Heroku ejecutara la producción de Yii, mis archivos simplemente no estaban allí.
Una solución simple para hacer que corriera en Heroku con Yii Advanced (incluida la adición de los 2 paquetes mencionados a composer.json): borré todos los archivos de gitignore, ejecuté init production, git actualizado y lo envié a heroku. Corre :)
Ahora necesito descubrir cómo hacer que init haga esto por mí, así no tengo que eliminar los archivos de gitignore.
En cuanto a esta pregunta, está resuelto. Heroku puede ejecutar Yii2 básico y avanzado. El mayor problema que veo es que los doctores Yii carecen de los paquetes compositores necesarios para ejecutar en producción. Entonces me pregunto si es solo que Heroku necesita esos paquetes ...