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

Mau*_*uro 26 php phpunit

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

PHP致命错误:带有消息'RecursiveDirectoryIterator :: __ construct(/ usr/lib/php/pear/File/Iterator)的未捕获异常'UnexpectedValueException':无法打开dir:/ usr/lib/php/pear中的打开文件过多/File/Iterator/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
Run Code Online (Sandbox Code Playgroud)

Ger*_*der 43

这可能是运行代码的服务器的限制.每个操作系统只允许一定数量的打开文件/句柄/套接字.当虚拟化服务器时,通常会进一步减少此限制.在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 
Run Code Online (Sandbox Code Playgroud)

  • $ ulimit -n> 256.我在OSX上 (2认同)
  • 256并不多 (2认同)
  • 就我而言,无论我将 `ulimit -n` 设置得有多高(我什至尝试了 1,000,000),都会发生这种情况。事实证明,问题出在我正在测试的 PHP 类中的错误逻辑。就其价值而言,我使用的是 Laravel,并且有一个工厂状态,它在不使用闭包语法的情况下返回非标量值;我通过使用闭包语法解决了这个问题,然后“ulimit -n”为“2048”就足够了。 (2认同)

pab*_*rsk 8

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

ulimit -n 10000
Run Code Online (Sandbox Code Playgroud)

解决phpunitor / and phpdbg和的问题Warning: Uncaught ErrorException: require([..file]): failed to open stream: Too many open files in [...]


小智 5

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

exec('ulimit -S -n 2048');
Run Code Online (Sandbox Code Playgroud)