php - many - symfony 3.4 database
Error de Doctrine: "Falló la apertura requerida ''/tmp/__CG__Source.php''" (3)
En el código después de $config
, puede probar $config->setAutoGenerateProxyClasses(true);
Pero la versión CLI es mucho mejor, porque evita la regeneración de actualización ya que el código podría no ser evitado.
Para cambiar el directorio de caché, puede intentar:
$cacheDir = dirname(__FILE__).''/cache'';
if (!is_dir($cacheDir)) {
mkdir($cacheDir);
}
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, $cacheDir);
Estoy tratando de migrar mi aplicación PHP a un servidor Ubuntu, pero sin éxito. Cualquier ayuda sería apreciada.
Primero instalé Doctrine exitosamente en / jorrit / myapp, siguiendo la primera parte del manual Getting Started de Doctrine (hasta "Generar el esquema de la base de datos"). En segundo lugar coloqué mis scripts PHP (que usan Doctrine) en la carpeta / jorrit / myapp.
Cuando trato de ejecutar mi script PHP en la CLI, obtengo estos mensajes de error:
Advertencia de PHP: require (/ tmp / __ CG__Source.php): no se pudo abrir la secuencia: no existe ningún archivo o directorio en /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php en la línea 200
PHP Fatal error: require (): Falló la apertura requerida ''/tmp/__CG__Source.php'' (include_path = ''.: / Usr / share / php: / usr / share / pear'') en / jorrit / myapp / vendor / doctrine / common / lib / Doctrine / Common / Proxy / AbstractProxyFactory.php en la línea 200
Bootstrap.php se ve así:
<?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);
?>
Las primeras líneas de mi script PHP:
<?php
require_once "bootstrap.php";
require_once ''classes.php'';
$connection = $entityManager->getConnection();
La aplicación funciona bien en mi entorno de desarrollo (Windows). La carpeta / tmp existe y es accesible. La base de datos se migra con éxito y existe. No cambié nada en la carpeta del proveedor.
¿Algunas ideas? Gracias de antemano por tu ayuda.
Parece un problema de permiso, primero debe verificar los permisos para toda la carpeta de la aplicación.
También intente limpiar la memoria caché al eliminar los archivos de la aplicación / caché / * y vuelva a intentarlo.
¡Buena suerte!
TL; DR. Solo necesitará generar sus clases de proxy manualmente
vendor/bin/doctrine orm:generate-proxies
Doctrine usa Proxies para conectar la base de datos. Los proxies se generan a partir de las clases de Entity.
En modo de desarrollo, genera un Proxy en cada solicitud porque puede hacer cambios a las clases de Entidad.
En modo de producción, no genera Proxies todo el tiempo. Por razones de rendimiento, supone que los Proxies existen e incluirlos directamente.
Hay algunos modos para la generación de Proxies:
- SIEMPRE - Siempre genera Proxies, esta es la configuración predeterminada para el modo de desarrollo
- NUNCA - Nunca genera Proxies, esta es la configuración predeterminada para el modo de producción
- ON_DEMAND: solo genera los Proxies si los archivos Proxy no existen. El inconveniente de esta opción es que tiene que llamar a file_exists () cada vez que podría causar un problema de rendimiento.
Ahora el comando
vendor/bin/doctrine orm:generate-proxies
genera clases Proxy a / tmp. Yo diría que esto aún podría causar problemas porque otras aplicaciones en su servidor podrían eliminar estos archivos inesperadamente. Una opción es cambiar el permiso de acceso del directorio / tmp a 1777
sudo chmod 1777 /tmp
El "1" obstáculo frente a 777 significa que, aunque todos pueden leer / escribir en el directorio / tmp, pero solo puede operar en sus propios archivos. es decir, no puede eliminar archivos creados por otros usuarios.
Para leer más, echa un vistazo a http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#auto-generating-proxy-classes-optional
También puede establecer el directorio Proxies en otro lugar para que ninguna otra aplicación pueda modificarlo. http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#autoloading-proxies