2013-02-07 33 views
18

मैं अपने नए मशीन में PHPUnit परीक्षण चलाने के लिए कोशिश करते हैं और मैं इस त्रुटि मिलती है:घातक त्रुटि - बहुत अधिक फ़ाइलें खुली

PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/usr/lib/php/pear/File/Iterator): failed to open dir: Too many open files' in /usr/lib/php/pear/File/Iterator/Factory.php:114

वर्ष मशीन पर एक ही कोड अच्छी तरह से चलाने के ...

नई मशीन पर्यावरण: पीएचपी संस्करण: पीएचपी 5.3.21 (CLI) पुराने: PHP 5.3.14

PHPUnit उत्पादन हर बार:

................EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 65/66 (98%) 
E 

Time: 34 seconds, Memory: 438.50Mb 

There were 50 errors: 

1) XXXXXXXXXXX 
PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/usr/lib/php/pear/File/Iterator): failed to open dir: Too many open files' in /usr/lib/php/pear/File/Iterator/Factory.php:114 
+1

कोशिश आप 'fclose' कॉल करने के लिए भूल रहे हैं? – h2ooooooo

+0

fclose? क्षमा करें, लेकिन मैं आपकी परिषद – Mauro

उत्तर

37

यह सर्वर पर एक सीमा हो सकती है जहां कोड चल रहा है। प्रत्येक ऑपरेटिंग सिस्टम केवल खुली फाइलों/हैंडल/सॉकेट की एक निश्चित संख्या के लिए अनुमति देता है। जब सर्वर वर्चुअलाइज्ड होता है तो यह सीमा आमतौर पर कम हो जाती है। लिनक्स सर्वर पर आप मौजूदा सीमा को ulimit -n के साथ देख सकते हैं, यदि आपके पास रूट पहुंच है तो आप इसे उसी कमांड के साथ बढ़ा सकते हैं। मुझे लगता है कि विंडोज सर्वर के लिए भी एक विधि है। अन्यथा इसके बारे में आप इतना कुछ नहीं कर सकते हैं (अपने होस्टर या व्यवस्थापक को इसे बढ़ाने के लिए कहें)।

अधिक विन्यास सीमाएं:

In /etc/security/limits.conf 
    soft nofile 1024 
    hard nofile 65535 
Increase ulimit by "ulimit -n 65535" 
echo 65535 > /proc/sys/fs/file-max 
In /etc/sysctl.conf 
    fs.file-max=65535 
+2

$ ulimit -n> 256 को समझ नहीं पा रहा हूं। मैं ओएसएक्स – Mauro

+2

256 पर नहीं हूं –

+1

@Mauro मुझे Mavericks (ओएसएक्स 10.9) – JamesHalsall

1

बाद के लिए DirectoryIterator वस्तुओं की दुकान मत करो; जब आप ऑपरेटिंग सिस्टम सीमा (आमतौर पर 256 या 1024) से अधिक स्टोर करते हैं तो आपको "बहुत अधिक खुली फ़ाइलें" कहने में त्रुटि मिल जाएगी। उदाहरण के लिए

, यह एक त्रुटि है, तो निर्देशिका बहुत सारी फ़ाइलें है निकलेगा:

<?php 
$files = array(); 
foreach (new DirectoryIterator('myDir') as $file) { 
    $files[] = $file; 
} 
?> 

मुमकिन है, इस दृष्टिकोण के साथ-साथ स्मृति गहन है।

स्रोत: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425

2

php में, क्रियान्वयन से पहले, इस

exec('ulimit -S -n 2048'); 
+0

का उपयोग कर रहा हूं मेरे लिए काम नहीं करता है इस लाइन को 'setUp()' और 'setUpBeforeClass()' विधियों दोनों में जोड़ने का प्रयास किया। इकाई परीक्षण शुरू करने से पहले इसे टर्मिनल पर मैन्युअल रूप से निष्पादित करना हालांकि काम करता है। – Koen