2013-09-28 213 views
27

Tôi đang cố gắng di chuyển ứng dụng PHP của mình sang máy chủ Ubuntu, nhưng không cần succes. Bất kỳ trợ giúp sẽ được đánh giá cao.Lỗi học thuyết: "Không mở được yêu cầu '/tmp/__CG__Source.php'"

Trước tiên, tôi đã cài đặt Doctrine thành công vào/jorrit/myapp, theo phần đầu tiên của tài liệu hướng dẫn Getting Started của Doctrine (cho đến khi "Tạo lược đồ cơ sở dữ liệu"). Thứ hai, tôi đã đặt các kịch bản PHP của tôi (sử dụng Doctrine) trong thư mục/jorrit/myapp.

Khi tôi cố gắng chạy kịch bản PHP của tôi trong CLI, tôi nhận được thông báo lỗi này:

PHP Warning: require(/tmp/__CG__Source.php): failed to open stream: No such file or directory in /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 200

PHP Fatal error: require(): Failed opening required '/tmp/__CG__Source.php' (include_path='.:/usr/share/php:/usr/share/pear') in /jorrit/myapp/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 200

Bootstrap.php trông như thế này:

<?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); 

?> 

Các dòng đầu tiên của kịch bản PHP của tôi :

<?php 

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

$connection = $entityManager->getConnection(); 

Ứng dụng hoạt động tốt trong môi trường phát triển của tôi (Windows). Thư mục/tmp tồn tại và có thể truy cập được. Cơ sở dữ liệu được di chuyển thành công và tồn tại. Tôi không thay đổi gì trong thư mục nhà cung cấp.

Bất kỳ ý tưởng nào? Cảm ơn trước sự giúp đỡ của bạn.

+1

Vấn đề chỉ xảy ra với $ isDevMode = false –

Trả lời

48

TL; DR Bạn chỉ cần để tạo ra các lớp proxy của bạn bằng tay

vendor/bin/doctrine orm:generate-proxies 

thuyết sử dụng proxy để kết nối tới cơ sở dữ liệu. Proxy được tạo ra từ các lớp Entity.

Trong chế độ phát triển, nó tạo một Proxy trên mọi yêu cầu vì bạn có thể thực hiện thay đổi đối với các lớp Thực thể.

Ở chế độ sản xuất, mỗi lần không tạo Proxies. Vì lý do hiệu suất, nó giả định rằng các Proxy tồn tại và bao gồm chúng trực tiếp.

Có một vài phương thức cho thế hệ Proxies:

  1. LUÔN - Nó alwayes tạo Proxy, đây là thiết lập mặc định cho chế độ phát triển
  2. KHÔNG BAO GIỜ - Nó không bao giờ tạo ra Proxies, đây là thiết lập mặc định cho chế độ sản xuất
  3. ON_DEMAND - Nó chỉ tạo các Proxy nếu các tệp Proxy không tồn tại. Hạn chế của tùy chọn này là nó phải gọi file_exists() mỗi lần có khả năng gây ra vấn đề hiệu suất.

Bây giờ lệnh

vendor/bin/doctrine orm:generate-proxies 

tạo lớp Proxy để/tmp. Tôi sẽ nói điều này có thể vẫn gây ra sự cố vì các ứng dụng khác trên máy chủ của bạn có thể xóa các tệp này bất ngờ.Một lựa chọn là bạn có thể thay đổi/tmp phép truy cập thư mục của bạn để 1777

sudo chmod 1777 /tmp 

Bit stricky '1' trước 777 có nghĩa là, mặc dù tất cả mọi người có thể đọc/ghi vào thư mục/tmp, nhưng bạn chỉ có thể hoạt động trên các tệp của riêng bạn. nghĩa là Bạn không thể xóa các tệp do người dùng khác tạo.

Để đọc thêm, xin vui lòng có một cái nhìn tại http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#auto-generating-proxy-classes-optional

Bạn cũng có thể thiết lập các thư mục Proxy để ở một nơi khác vì vậy không các ứng dụng khác có thể thay đổi chúng. http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#autoloading-proxies

+0

Cảm ơn, đây là câu trả lời đúng. (Tôi chưa có đủ danh tiếng để bỏ phiếu.) –

+0

Đừng lo lắng nhé :) – Zorji

+0

không có tác dụng với tôi: | – delirehberi

1

Trông giống như vấn đề về quyền, trước tiên nên chuyển sang quyền đối với toàn bộ thư mục ứng dụng.

Cũng cố gắng dọn dẹp bộ nhớ cache bằng cách xóa các tệp ứng dụng/cache/* và thử lại.

Chúc may mắn!

3

Trong mã sau $config dòng bạn có thể thử $config->setAutoGenerateProxyClasses(true);

Nhưng phiên bản CLI là tốt hơn nhiều, bởi vì nó tránh được trên refresh regen như trong mã có thể không tránh.

Để thay đổi bộ nhớ cache dir bạn có thể thử:

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


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

Thông tin thêm về "cuộc đấu tranh" của tôi với nó là tại https://michalzuber.wordpress.com/2015/09/26/using-symfony-entity-via-doctrine-in-custom-project/ – michalzuber