Ошибка Doctrine: "Не удалось выполнить открытие" /tmp/ __CG__Source.php '"
Я пытаюсь перенести свое приложение PHP на сервер Ubuntu, но не преуспеть. Любая помощь будет оценена.
Сначала я успешно установил Doctrine в /jorrit/myapp, следуя первой части инструкции Doctrine Getting Started (до "Generating the Database Schema" ). Во-вторых, я поместил свои PHP-скрипты (которые используют Doctrine) в папку /jorrit/myapp.
Когда я пытаюсь запустить PHP script в CLI, я получаю это сообщение об ошибке:
PHP Предупреждение: require (/tmp/__ CG__Source.php): не удалось открыть поток: нет такого файла или каталога в /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on строка 200
PHP Неустранимая ошибка: require(): Не удалось открыть окно "/tmp/__CG__Source.php" (include_path = '.:/usr/share/php:/usr/share/pear') в /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php в строке 200
Bootstrap.php выглядит следующим образом:
<?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);
?>
Первые строки моего PHP script:
<?php
require_once "bootstrap.php";
require_once 'classes.php';
$connection = $entityManager->getConnection();
Приложение отлично работает в моей среде разработки (Windows). Папка /tmp существует и доступна. База данных успешно перенесена и существует. Я ничего не менял в папке поставщика.
Любые идеи? Заранее благодарим за помощь.
Ответы
Ответ 1
TL; DR Вам просто нужно создать свои прокси-классы вручную
vendor/bin/doctrine orm:generate-proxies
Doctrine использует Proxies для подключения к базе данных. Прокси генерируются из классов Entity.
В режиме разработки он генерирует Proxies для каждого запроса, потому что вы можете вносить изменения в классы Entity.
В режиме производства он не генерирует Proxies каждый раз. По соображениям производительности предполагается, что существуют Прокси и включают их напрямую.
Существует несколько режимов генерации Proxies:
- ALWAYS - он всегда генерирует Proxies, это настройка по умолчанию для режима разработки
- НИКОГДА - он никогда не генерирует прокси, это значение по умолчанию для производственного режима
- ON_DEMAND - он генерирует только прокси, если файлы прокси не существуют. Недостатком этого параметра является то, что он должен вызывать файл_эксты() каждый раз, что может потенциально вызвать проблему с производительностью.
Теперь команда
vendor/bin/doctrine orm:generate-proxies
генерирует классы прокси в /tmp. Я бы сказал, что это может вызвать проблемы, потому что другие приложения
на вашем сервере могут неожиданно удалить эти файлы. Один из вариантов - вы можете изменить разрешение доступа к каталогу /tmp на 1777
sudo chmod 1777 /tmp
Ужасный бит '1' перед 777 означает, что, хотя каждый может читать/записывать в каталог /tmp, но вы можете работать только с вашими собственными файлами. т.е. вы не можете удалять файлы, созданные другими пользователями.
Для дальнейшего чтения, пожалуйста, взгляните на
http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#auto-generating-proxy-classes-optional
Вы также можете установить каталог Proxies в другое место, чтобы другие приложения не могли их модифицировать. http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#autoloading-proxies
Ответ 2
В коде после строки $config
вы можете попробовать
$config->setAutoGenerateProxyClasses(true);
Но версия CLI намного лучше, потому что она позволяет избежать регенерации обновления, так как код не может избежать.
Чтобы изменить кеш, вы можете попробовать:
$cacheDir = dirname(__FILE__).'/cache';
if (!is_dir($cacheDir)) {
mkdir($cacheDir);
}
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, $cacheDir);
Ответ 3
Похоже на проблему с разрешением, сначала нужно разрешить права доступа для всей папки приложения.
Также попробуйте кэшировать жесткую очистку, удалив файлы app/cache/* и повторите попытку.
Удачи!