2013-09-28 14 views
27

Sto provando a migrare la mia applicazione PHP su un server Ubuntu, ma senza successo. Qualsiasi aiuto sarebbe apprezzato.Errore di Doctrine: "Apertura fallita richiesta '/tmp/__CG__Source.php'"

Prima ho installato Doctrine correttamente in/jorrit/myapp, seguendo la prima parte del manuale di Doctrine Getting Started (fino a "Generazione dello schema del database"). In secondo luogo ho inserito i miei script PHP (che usano Doctrine) nella cartella/jorrit/myapp.

Quando provo ad eseguire il mio script PHP nella CLI, ottengo questo messaggio di errore:

PHP Warning: require(/tmp/__CG__Source.php): failed to open stream: No such file or directory in /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 200

PHP Fatal error: require(): Failed opening required '/tmp/__CG__Source.php' (include_path='.:/usr/share/php:/usr/share/pear') in /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 200

bootstrap.php si presenta così:

<?php 
// bootstrap.php 
use Doctrine\ORM\Tools\Setup; 
use Doctrine\ORM\EntityManager; 

require_once "vendor/autoload.php"; 

// Create a simple "default" Doctrine ORM configuration for Annotations 
$isDevMode = false; 
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode); 

// the connection configuration 
$dbParams = array(
     'driver' => 'pdo_mysql', 
     'host'  => 'xx', 
     'user'  => 'xx', 
     'password' => 'xx', 
     'dbname' => 'xx', 
     'profiler' => 'false' 
); 


// obtaining the entity manager 
$entityManager = EntityManager::create($dbParams, $config); 

?> 

Le prime righe del mio script PHP :

L'applicazione funziona correttamente nel mio ambiente di sviluppo (Windows). La cartella/tmp esiste ed è accessibile. Il database viene migrato correttamente ed esiste. Non ho cambiato nulla nella cartella del venditore.

Qualche idea? Grazie in anticipo per il vostro aiuto.

+1

Il problema si verifica solo con $ isDevMode = falsi –

risposta

48

TL; DR ti basta per generare i classi proxy manualmente

vendor/bin/doctrine orm:generate-proxies 

Dottrina usa le procure per collegare la al database. I proxy sono generati dalle classi Entity.

In modalità di sviluppo genera un proxy su ogni richiesta perché è possibile apportare modifiche alle classi di entità.

In modalità produzione, non genera proxy ogni volta. Per motivi di prestazioni, presuppone che i proxy esistano e li includa direttamente.

ci sono alcune modalità per la generazione di proxy:

  1. SEMPRE - Genera alwayes proxy, questa è l'impostazione predefinita per la modalità di sviluppo
  2. MAI - Non è mai genera proxy, questa è l'impostazione predefinita per modalità di produzione
  3. ON_DEMAND - Genera solo i Proxy se i file proxy non esistono. Lo svantaggio di questa opzione è che deve chiamare file_esistenze() ogni volta che potrebbe potenzialmente causare un problema di prestazioni.

Ora il comando

vendor/bin/doctrine orm:generate-proxies 

genera classi proxy per/tmp. Direi che questo potrebbe ancora causare problemi perché altre applicazioni sul tuo server potrebbero eliminare questi file in modo imprevisto.Una possibilità è che si può cambiare il vostro/tmp permesso di accesso alla rubrica per 1777

sudo chmod 1777 /tmp 

Il bit Stricky '1' di fronte a 777 significa che, anche se tutti possono leggere/scrivere nella directory/tmp, ma è solo in grado di operare sui propri file. Ad esempio, non è possibile rimuovere file creati da altri utenti.

Per ulteriori approfondimenti, si prega di dare un'occhiata alla http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#auto-generating-proxy-classes-optional

È inoltre possibile impostare la directory Proxy da qualche altra parte in modo da nessun'altra applicazione li possono modificare. http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#autoloading-proxies

+0

Grazie, questa è la risposta giusta. (Non ho ancora abbastanza reputazione per votare.) –

+0

Nessun problema amico :) – Zorji

+0

non funziona per me: | – delirehberi

1

Sembra un problema di autorizzazione, in primo luogo dovrebbe controllare le autorizzazioni per l'intera cartella dell'applicazione.

Prova anche a pulire la cache eliminando i file app/cache/* e riprova.

Buona fortuna!

3

Nel codice dopo $config linea che si potrebbe provare $config->setAutoGenerateProxyClasses(true);

Ma la versione CLI è molto meglio, perché evita il rinfresco di rigenerazione, come nel codice potrebbe non evitare.

Per modificare la cache dir si potrebbe provare:

$cacheDir = dirname(__FILE__).'/cache'; 
if (!is_dir($cacheDir)) { 
    mkdir($cacheDir); 
} 


$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, $cacheDir); 
+0

Ulteriori informazioni sulla mia "lotta" con esso sono su https://michalzuber.wordpress.com/2015/09/26/using-symfony-entity-via-doctrine-in-custom-project/ – michalzuber

Problemi correlati