Подтвердить что ты не робот

Ошибка 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 существует и доступна. База данных успешно перенесена и существует. Я ничего не менял в папке поставщика.

Любые идеи? Заранее благодарим за помощь.

4b9b3361

Ответ 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/* и повторите попытку.

Удачи!