教义错误:“打开失败需要'/tmp/__CG__Source.php'”

Posted

技术标签:

【中文标题】教义错误:“打开失败需要\'/tmp/__CG__Source.php\'”【英文标题】:Doctrine error: "Failed opening required '/tmp/__CG__Source.php' "教义错误:“打开失败需要'/tmp/__CG__Source.php'” 【发布时间】:2013-10-04 15:48:42 【问题描述】:

我正在尝试将我的 php 应用程序迁移到 Ubuntu 服务器,但没有成功。任何帮助将不胜感激。

首先,我按照 Doctrine 的 Getting Started 手册的第一部分(直到“生成数据库模式”)成功地将 Doctrine 安装到 /jorrit/myapp 中。其次,我将我的 PHP 脚本(使用 Doctrine)放在文件夹 /jorrit/myapp 中。

当我尝试在 CLI 中运行我的 PHP 脚本时,我收到以下错误消息:

PHP 警告:需要(/tmp/__CG__Source.php):无法打开流:/jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php 中没有这样的文件或目录第 200 行

PHP 致命错误:require():在 /jorrit/myapp/vendor 中打开所需的 '/tmp/__CG__Source.php' (include_path='.:/usr/share/php:/usr/share/pear') 失败/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 脚本的第一行:

<?php

require_once "bootstrap.php";
require_once 'classes.php';

$connection = $entityManager->getConnection();

该应用程序在我的开发环境 (Windows) 中运行良好。 /tmp 文件夹存在并且可以访问。数据库已成功迁移并存在。我没有更改供应商文件夹中的任何内容。

有什么想法吗?提前感谢您的帮助。

【问题讨论】:

只有 $isDevMode = false 才会出现问题 【参考方案1】:

TL;DR 您只需要手动生成代理类

vendor/bin/doctrine orm:generate-proxies

Doctrine 使用代理连接到数据库。代理是从实体类生成的。

在开发模式下,它会在每个请求上生成一个代理,因为您可以更改实体类。

在生产模式下,它不会每次都生成代理。出于性能原因,它假定代理存在并直接包含它们。

代理生成有几种模式:

    总是 - 它总是生成代理,这是开发模式的默认设置 从不 - 它从不生成代理,这是生产模式的默认设置 ON_DEMAND - 如果代理文件不存在,它只会生成代理。此选项的缺点是每次都必须调用 file_exists(),这可能会导致性能问题。

现在是命令

vendor/bin/doctrine orm:generate-proxies

为 /tmp 生成代理类。我会说这可能仍然会造成麻烦,因为其他应用程序 在您的服务器上可能会意外删除这些文件。一种选择是您可以将 /tmp 目录访问权限更改为 1777

sudo chmod 1777 /tmp

777前面的棘手位'1'表示,虽然每个人都可以读/写/tmp目录,但你只能对自己的文件进行操作。即您不能删除其他用户创建的文件。

如需进一步阅读,请查看 http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#auto-generating-proxy-classes-optional

您还可以将代理目录设置到其他位置,这样其他应用程序就无法修改它们。 http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#autoloading-proxies

【讨论】:

谢谢,这是正确的答案。 (我还没有足够的声望来投票。) @Zorji 我被发现是假的。我的错误是我写了错误的实体文件。 "TL;DR 您只需要手动生成代理类" - 或者只需将开发模式设置为 true 并至少运行一次应用程序 @hocikto 当然可以,但最好在生产服务器中避免这种情况。 解释得很好,绝对是我案例的正确答案。谢谢!【参考方案2】:

$config 行之后的代码中,您可以尝试 $config-&gt;setAutoGenerateProxyClasses(true);

但 CLI 版本要好得多,因为它避免了刷新重新生成,因为代码中可能无法避免。

要更改缓存目录,您可以尝试:

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



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

【讨论】:

更多关于我与它的“斗争”的信息在michalzuber.wordpress.com/2015/09/26/…【参考方案3】:

看起来像是权限问题,首先应该检查整个应用程序文件夹的权限。

同时尝试通过删除 app/cache/* 文件来硬清理缓存,然后重试。

祝你好运!

【讨论】:

以上是关于教义错误:“打开失败需要'/tmp/__CG__Source.php'”的主要内容,如果未能解决你的问题,请参考以下文章

教义错误:“打开失败需要'/tmp/__CG__Source.php'”

教义错误“无效的参数号:绑定变量的数量与标记的数量不匹配”

Doctrine2 Merge() 因复合索引而失败教义2错误?

XML 中的教义类继承

检查教义关系是不是正确

教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配