我正在使用symfony2 / finder组件通过aws/aws-sdk-php
的流包装器访问Amazon S3存储桶。我通过以下方式将finder组件从2.7.4升级到最新的2.7.25版本(2.7.25):
composer require symfony/finder:2.7.25
在这个过程中,我发现当一个目录的路径中有一个尾部斜杠时,没有找到任何文件。
$directory = "s3://{$bucket}/{$taskHandle}/transmissions-{$thread}/"; // valid for finder 2.7.4, yet not >=2.7.5 due to traling slash at the end
我特别感到困惑的是为什么没有抛出异常或错误。然而,在调试时我发现了这种奇怪的行为:
这将执行得很好,但会产生空输出(误报执行):
$files = (new Finder())
->name('*')
->in($directory)
->filter(
function (SplFileInfo $file) use ($lastRuntime) {
return $file->isFile() && ($file->getMTime() < $lastRuntime);
}
)
->files();
然而,当我删除回调的内联并改为执行此操作时:
...
->filter(
function (SplFileInfo $file) use ($lastRuntime) {
$isFile = $file->isFile(); // will now trigger a fatal error
$modifiedAt = $file->getMTime();
return $isFile && ($modifiedAt < $lastRuntime);
}
)
然后我确实看到致命的错误:
Fatal error: Uncaught RuntimeException: File or directory not found: s3://somebucket/somekey/foo/bar.csv in vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php:738 Stack trace: #0 vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php(738): trigger_error('File or directo...', 512) #1 vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php(912): Aws\S3\StreamWrapper->triggerError('File or directo...', 0) #2 vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php(301): Aws\S3\StreamWrapper->boolCall(Object(Closure), 0) #3 vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php(246): Aws\S3\StreamWrapper->createStat('s3://...', 0) #4 [internal function]: Aws\S3\StreamWrapper->url_stat('s3://...', 0) #5
... SplFileInfo->getMTime() #6 [internal function]: UserInterface\Con in vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php on line 738
这对我没有意义。我站在那里,代码应该是等价的。我没有得到什么?