我正在尝试将我的PHP应用程序迁移到Ubuntu服务器,但没有成功。任何帮助将不胜感激。
首先,我按照Doctrine的Getting Started手册的第一部分(直到“生成数据库模式”)将Doctrine成功安装到/ jorrit / myapp中。其次,我将PHP脚本(使用Doctrine)放在文件夹/ jorrit / myapp中。
当我尝试在CLI中运行我的PHP脚本时,收到以下错误消息:
PHP警告:require(/ 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')失败第200行的/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php
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文件夹存在且可访问。数据库成功迁移并存在。我没有在供应商文件夹中更改任何内容。
有什么想法吗?在此先感谢您的帮助。
答案 0 :(得分:55)
TL; DR您只需手动生成代理类
vendor/bin/doctrine orm:generate-proxies
Doctrine使用Proxies连接到数据库。代理是从实体类生成的。
在开发模式下,它会为每个请求生成一个代理,因为您可以对实体类进行更改。
在生产模式下,它不会每次都生成代理。出于性能原因,它假定代理存在并直接包含它们。
Proxies生成有一些模式:
现在命令
vendor/bin/doctrine orm:generate-proxies
为/ tmp生成代理类。我会说这可能仍然会引起麻烦,因为其他应用程序 在您的服务器上可能会意外删除这些文件。一种选择是您可以将/ tmp目录访问权限更改为1777
sudo chmod 1777 /tmp
777前面的位置'1'表示尽管每个人都可以读/写/ tmp目录,但是你只能对自己的文件进行操作。即,您无法删除其他用户创建的文件。
您还可以将Proxies目录设置为其他位置,以便其他应用程序无法修改它们。 http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#autoloading-proxies
答案 1 :(得分:3)
在using System.Runtime.InteropServices;
namespace ConsoleStruct
{
class Program
{
[StructLayout(LayoutKind.Explicit)]
struct TestStruct
{
[FieldOffset(0)]
public double dbl;
[FieldOffset(0)]
public ulong uu;
}
public static void SimpleMethod()
{
TestStruct st;
st.uu = 0;
st.dbl = 5000.0;
Console.WriteLine(st.uu.ToString()); // ==> uu becomes 4662219572839972864
//instead of 0 :(
// it looks like the value of uu is dependent on the
//value assigned to dbl
Console.ReadLine();
}
static void Main(string[] args)
{
SimpleMethod();
}
}
}
行之后的代码中,您可以尝试
$config
但CLI版本要好得多,因为它避免了刷新再生,因为代码可能无法避免。
要更改缓存目录,您可以尝试:
$config->setAutoGenerateProxyClasses(true);
答案 2 :(得分:2)
看起来像权限问题,首先应该取消整个应用程序文件夹的权限。
还尝试通过删除app / cache / *文件来硬件清理缓存,然后重试。
祝你好运!