php - proyectos - laravel tags
Dos aplicaciones de Laravel en el mismo servidor que entran en conflicto entre sí (2)
Esto es más un comentario que una respuesta, pero aún no tengo suficientes representantes para comentar. Aunque tuve un problema similar y puedo ayudar.
Si estas dos aplicaciones comparten directorios, laravel usa el sistema de archivos en la memoria caché de forma predeterminada.
Si desea compartir una base de código con dos conexiones de bases de datos diferentes, use la base de datos para el almacenamiento en caché. Puede publicar la migración para crear la tabla de caché con el comando php artisan cache:table
Luego, simplemente ejecute php artisan migrate
CACHE_DRIVER
y cambie la línea CACHE_DRIVER
en su archivo .env a ''database''
Tengo 2 aplicaciones Laravel ejecutándose en el mismo servidor. El servidor es Apache 2.4 y tengo vhosts configurados para servir cada aplicación en un dominio diferente.
La primera aplicación es una API y su archivo .env está configurado de esta manera:
APP_ENV=production
APP_KEY=YYYYYYYYYYYYYYYYYY
APP_DEBUG=false
APP_LOG_LEVEL=debug
APP_URL=https://notify.mysite.com
APP_DOMAIN=notify.mysite.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=notify
DB_USERNAME=YYYYYYYYYYYYYYYYYY
DB_PASSWORD=YYYYYYYYYYYYYYYYYY
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
La segunda aplicación es una interfaz de usuario que, entre otras cosas, utiliza la API de la primera aplicación. Su archivo .env está configurado de esta manera:
APP_ENV=local
APP_KEY=XXXXXXXXXXXXXX
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=https://asapps.mysite.com
APP_DOMAIN=asapps.mysite.com
APP_VERSION=1
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=asapps
DB_NOTIFY_DATABASE=notify
DB_FLIGHT_DATABASE=flights
DB_USERNAME=XXXXXXXXXXXXXX
DB_PASSWORD=XXXXXXXXXXXXXX
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
Puedo enviar mensajes a mi API desde mi editor Swagger, desde Postman y desde otros servidores, y todo funciona como se espera.
Mi segunda aplicación en sí misma también funciona como se esperaba.
Sin embargo, si mi segunda aplicación envía una solicitud a la API, la aplicación API arroja este error:
excepción ''PDOException'' con el mensaje ''SQLSTATE [42S02]: tabla base o vista no encontrada: 1146 Tabla'' asapps.preprocessor_config ''no existe'' en C: / notify / vendor / laravel / framework / src / Illuminate / Database / Connection .php: 332
¿WTH?
La base de datos para la API está configurada en DB_DATABASE = notificar y definitivamente usa correctamente esa conexión cuando envío mensajes de otros servidores. Entonces, ¿por qué diablos está tratando de usar la conexión de la base de datos de la segunda aplicación cuando llamo a la API desde esa aplicación? Es casi como si estuviese almacenando en caché la conexión DB e intentando seguir usando esa misma ... ¿Cómo puedo detener eso?
La tabla ''asapps.preprocessor_config'' no existe ''
Después de más excavaciones (leer googlear frenéticamente), encontré el problema y la solución aquí
En resumidas cuentas, cuando el sitio A acepta una solicitud, php carga sus variables .env para toda la longitud de la solicitud http. Durante esa solicitud, cuando el sitio A llama al sitio B, ya que están en el mismo servidor ejecutando el mismo php, php todavía está utilizando .env desde el sitio A y no carga por completo el archivo .env del sitio B.
La mejor explicación del autor:
El archivo .env con las variables se creó para que las personas no envíen sus credenciales a los repositorios de Github y a otros lugares donde puedan compartir el origen.
Ahora, al ser variables de entorno, se convierten en todo el sistema durante toda la duración de la solicitud http (en este caso, ejecución de scripts). El punto es que tienes un script de ejecución larga.
Para encontrar una solución definitiva, puede elegir una de las tres formas.
....
''namespace'' las variables ENV.