我有一个循环,其中我将一些图像保存在本地,然后将其移至S3
foreach ($images as $image) {
// download image
$stream = fopen($image['path'], 'wb');
write($stream, $image['content']);
fclose($stream);
// copy to S3
$manager->copy('local://' . $image['p'], 's3://' . $image['p']);
}
问题是我遇到failed to open stream: Too many open files error
错误
任何想法如何避免这种情况?
Warning: include(/var/www/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php): failed to open stream: Too many open files in /var/www/vendor/composer/ClassLoader.php on line 444
Fatal error: Uncaught Error: Class 'Monolog\Formatter\LineFormatter' not found in /var/www/vendor/symfony/monolog-bridge/Handler/ConsoleHandler.php:155
答案 0 :(得分:1)
在飞行系统的aws-s3驱动程序中增加ulimit -n
或禁用分段上传。是flysystem保持太多文件打开。
好的,快速解决方案是:
foreach ($images as $image) {
$resourcesOpened = count(get_resources('stream'));
while ( $resourcesOpened > 900 ) {
sleep(10);
$resourcesOpened = count(get_resources('stream'));
}
// download image
$stream = fopen($image['path'], 'wb');
write($stream, $image['content']);
fclose($stream);
// copy to S3
$manager->copy('local://' . $image['p'], 's3://' . $image['p']);
}
}