php for Due applicazioni Laravel sullo stesso server sono in conflitto tra loro




root laravel (2)

Dopo ulteriori scavi (leggi la frenetica ricerca di google), ho trovato il problema e la soluzione qui

La linea di fondo, quando il sito A accetta una richiesta, php carica le sue variabili .env per l'intera lunghezza della richiesta http. Durante tale richiesta, quando il sito A chiama il sito B, poiché sono sullo stesso server che esegue lo stesso php, php usa ancora il .env dal sito A e non carica affatto il file .env del sito B.

La spiegazione migliore dell'autore:

Il file .env con le variabili è stato creato in modo che le persone non inserissero le proprie credenziali nei repository github e in altri luoghi in cui potrebbero condividere la fonte.

Ora, essendo variabili d'ambiente, diventano globali per l'intera durata della richiesta http (in questo caso l'esecuzione dello script). Il punto è che hai una sceneggiatura di lunga durata.

Per trovare una soluzione definitiva potresti andare in uno dei tre modi.

....

'namespace' le variabili ENV.

Ho 2 applicazioni Laravel in esecuzione sullo stesso server. Il server è Apache 2.4 e ho i vhosts impostati per servire ogni applicazione su un dominio diverso.

La prima applicazione è un'API e il suo file .env è impostato in questo modo:

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 seconda applicazione è un'interfaccia utente che, tra le altre cose, utilizza l'API della prima applicazione. Il suo file .env è impostato in questo modo:

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

Posso inviare messaggi alla mia API dal mio editor Swagger, da Postman e da altri server e tutto funziona come previsto.

Anche la mia seconda applicazione funziona da sola come previsto.

Tuttavia, se la mia seconda applicazione invia una richiesta all'API, l'applicazione API genera questo errore:

eccezione 'PDOException' con messaggio 'SQLSTATE [42S02]: tabella di base o vista non trovata: 1146 Tabella' asapps.preprocessor_config 'non esiste' in C: \ notify \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connection .php: 332

WTH?

Il database per l'API è impostato su DB_DATABASE = notifica e sicuramente utilizza correttamente tale connessione quando invio messaggi da altri server. Allora perché diavolo sta provando ad usare la connessione al database della seconda applicazione quando chiamo l'API da quell'app ??? È quasi come se stesse memorizzando nella cache la connessione DB e cercando di continuare ad usare quello stesso .... Come posso smettere di farlo?

La tabella 'asapps.preprocessor_config' non esiste '


Questo è più un commento che una risposta, ma non ho ancora un rappresentante per commentare. Ho avuto un problema simile, però e potrei essere in grado di aiutare.

Se queste due applicazioni condividono qualsiasi directory, laravel usa il filesystem per memorizzare automaticamente la cache.

Se si desidera condividere un codebase con due diverse connessioni al database, utilizzare invece il database per la memorizzazione nella cache. È possibile pubblicare la migrazione per creare la tabella della cache con il comando php artisan cache:table

Quindi, esegui semplicemente php artisan migrate e cambia la riga CACHE_DRIVER nel tuo file .env in 'database'