2013-09-28 3 views
27

मैं अपने PHP अनुप्रयोग को उबंटू सर्वर पर माइग्रेट करने का प्रयास कर रहा हूं, लेकिन बिना सफलता के। किसी भी सहायता की सराहना की जाएगी।सिद्धांत त्रुटि: "आवश्यक खोलने में विफल '/tmp/__CG__Source.php'"

सबसे पहले मैंने डॉक्टरेट Getting Started मैनुअल ("डेटाबेस स्कीमा जेनरेट करने" तक) के पहले भाग के बाद सफलतापूर्वक/jorrit/myapp में सिद्धांत स्थापित किया। दूसरी बात मैंने फ़ोल्डर/जोरिट/मैप में अपनी PHP स्क्रिप्ट्स (जो सिद्धांत का उपयोग करते हैं) रखी।

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 इस तरह दिखता है:

<?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 स्क्रिप्ट के पहले लाइनों

जब मैं CLI में मेरे PHP स्क्रिप्ट चलाने का प्रयास है, मैं इस त्रुटि संदेश :

<?php 

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

$connection = $entityManager->getConnection(); 

एप्लिकेशन मेरे विकास पर्यावरण (विंडोज) में ठीक काम करता है।/Tmp फ़ोल्डर मौजूद है और पहुंच योग्य है। डेटाबेस सफलतापूर्वक माइग्रेट किया गया है और मौजूद है। मैंने विक्रेता फ़ोल्डर में कुछ भी नहीं बदला।

कोई विचार? आपकी सहायता के लिये पहले से ही धन्यवाद।

+1

समस्या केवल $ isDevMode = false –

उत्तर

48

टी एल; डॉ तुम सिर्फ अपने प्रॉक्सी वर्गों उत्पन्न करने के लिए मैन्युअल रूप से

vendor/bin/doctrine orm:generate-proxies 

सिद्धांत प्रॉक्सी का उपयोग करता है डेटाबेस से कनेक्ट करने की आवश्यकता होगी। प्रॉक्सीज इकाई वर्गों से उत्पन्न होते हैं।

विकास मोड में, यह प्रत्येक अनुरोध पर प्रॉक्सी उत्पन्न करता है क्योंकि आप इकाई वर्गों में परिवर्तन कर सकते हैं।

उत्पादन मोड में, यह हर बार प्रॉक्सी उत्पन्न नहीं करता है। प्रदर्शन कारण के लिए, यह प्रॉक्सियों का अस्तित्व मानता है और उन्हें सीधे शामिल करता है।

प्रॉक्सी पीढ़ी के लिए कुछ मोड होते हैं: हमेशा

  1. - यह alwayes प्रॉक्सी उत्पन्न करता है, इस
  2. कभी विकास मोड के लिए डिफ़ॉल्ट सेटिंग है - यह कभी नहीं प्रॉक्सी उत्पन्न करता है, इस लिए डिफ़ॉल्ट सेटिंग है उत्पादन मोड
  3. ON_DEMAND - प्रॉक्सी फाइल मौजूद नहीं होने पर यह केवल प्रॉक्सी उत्पन्न करता है। इस विकल्प की कमी यह है कि इसे हर बार file_exists() को कॉल करना होता है जो संभावित रूप से प्रदर्शन समस्या का कारण बन सकता है।

अब आदेश

vendor/bin/doctrine orm:generate-proxies 

/tmp के लिए प्रॉक्सी वर्गों उत्पन्न करता है। मैं कहूंगा कि यह अभी भी परेशानी का कारण बन सकता है क्योंकि आपके सर्वर पर अन्य अनुप्रयोग इन फ़ाइलों को अप्रत्याशित रूप से हटा सकता है।एक विकल्प आप अपने/tmp निर्देशिका एक्सेस करने की अनुमति बदल सकते हैं 1777

sudo chmod 1777 /tmp 

777 के सामने stricky सा '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

+0

धन्यवाद के साथ होता है, यह सही जवाब है। (मेरे पास वोट करने के लिए अभी तक पर्याप्त प्रतिष्ठा नहीं है।) –

+0

कोई चिंता नहीं दोस्त :) – Zorji

+0

मेरे लिए काम नहीं है: | – delirehberi

1

अनुमति समस्या की तरह दिखता है, पहले पूरे एप्लिकेशन फ़ोल्डर के लिए अनुमतियों पर चेक करना चाहिए।

ऐप/कैश/* फ़ाइलों को हटाकर हार्ड-क्लीनअप कैश को भी आजमाएं, और पुनः प्रयास करें।

शुभकामनाएं!

3

कोड में $config पंक्ति के बाद आप $config->setAutoGenerateProxyClasses(true);

की कोशिश कर सकते लेकिन CLI संस्करण काफी बेहतर है क्योंकि यह कोड से बचने के नहीं हो सकता है के रूप में ताज़ा Regen पर से बचा जाता है है।

कैश निर्देशिका को बदलने के लिए आप की कोशिश कर सकते:

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


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

इसके साथ मेरे "संघर्ष" के बारे में अधिक जानकारी https://michalzuber.wordpress.com/2015/09/26/using-symfony-entity-via-doctrine-in-custom-project/ पर है – michalzuber

संबंधित मुद्दे