致命错误 - 打开的文件太多

时间:2013-02-07 10:11:30

标签: php phpunit

我尝试在新机器上运行PHPUnit Tests,我收到此错误:

  

PHP致命错误:带有消息'RecursiveDirectoryIterator :: __ construct(/ usr / lib / php / pear / File / Iterator)的未捕获异常'UnexpectedValueException':无法打开dir:/ usr / lib /中打开的文件过多PHP /梨/文件/迭代器/ Factory.php:114

旧机器上的相同代码运行良好......

新机器环境: PHP版本:PHP 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

9 个答案:

答案 0 :(得分:42)

这可能是运行代码的服务器的限制。每个操作系统只允许一定数量的打开文件/句柄/套接字。当虚拟化服务器时,通常会进一步减少此限制。在Linux服务器上,您可以使用ulimit -n检查当前限制,如果您具有root访问权限,则可以使用相同的命令增加它。我假设有一个Windows服务器的方法。否则你无能为力(除了请你的主人或管理员增加它)。

更多可配置的限制:

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 

答案 1 :(得分:3)

如何提升文件打开限制(Linux或Max OS):

ulimit -n 10000

通过phpunit或/和phpdbg以及Warning: Uncaught ErrorException: require([..file]): failed to open stream: Too many open files in [...]

解决问题

答案 2 :(得分:2)

在php中,在执行之前,试试这个

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

答案 3 :(得分: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

答案 4 :(得分:1)

也许,文件/etc/init.d/phpx.x-fpm出错。 让我们重新启动它:

sudo /etc/init.d/php7.2-fpm restart

答案 5 :(得分:1)

当您忘记将某些内容包装在闭包中时,我注意到这在PHP中会发生。仔细查看您最近的差异,您也许可以弄清楚这件事的底线(在我的情况下,我在Laravel PHP单元工厂中引用了$faker而没有关闭。

答案 6 :(得分:0)

从睡眠模式“唤醒”我的计算机后,我遇到了这个问题。

像这样修复后重新启动php-fpm。经典关闭并再次打开解决方案。

sudo /etc/init.d/php-fpm restart

我认为这可能与我最近添加到php中的xdebug有关。

答案 7 :(得分:0)

在服务器debian上,您也可以转到

/etc/php/php7.xx/fpm/pool.d/www.conf

  

rlimit_files = 10000

/etc/init.d/php7.xx restart

答案 8 :(得分:0)

每次 PHP 尝试加载 Redis 库时,我都会遇到此错误,但这是由我一开始并没有真正想到的事情引起的。当我的程序运行一段时间时,我不断收到此错误,执行重复过程。我发现我打开了一个 cURL 会话 ($ch = new curl_init(...)),它在类的析构函数中关闭,但从未调用过该析构函数。我解决了这个问题,打开文件太多的错误消失了。