Estoy usando el componente symfony2/finder para acceder a un depósito de Amazon S3 a través del contenedor de flujo de aws/aws-sdk-php . Estaba actualizando el componente del buscador de 2.7.4 a su última versión 2.7.25 (2.7.25) a través de:
composer require symfony/finder:2.7.25En el proceso, descubrí que cuando un directorio tenía una barra inclinada en su ruta, no se encontraban archivos.
$directory = "s3://{$bucket}/{$taskHandle}/transmissions-{$thread}/"; // valid for finder 2.7.4, yet not >=2.7.5 due to traling slash at the endEstaba especialmente confundido en cuanto a por qué no se produjo ninguna excepción o error. Sin embargo, al depurar descubrí este comportamiento extraño:
Esto se ejecutará bien, pero producirá una salida vacía (ejecución de falso positivo):
$files = (new Finder()) ->name('*') ->in($directory) ->filter( function (SplFileInfo $file) use ($lastRuntime) { return $file->isFile() && ($file->getMTime() < $lastRuntime); } ) ->files();Sin embargo, cuando elimino la línea de la devolución de llamada y hago esto en su lugar:
... ->filter( function (SplFileInfo $file) use ($lastRuntime) { $isFile = $file->isFile(); // will now trigger a fatal error $modifiedAt = $file->getMTime(); return $isFile && ($modifiedAt < $lastRuntime); } )Entonces veo el error fatal:
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 738Esto no tiene ningún sentido para mí. Desde donde estoy parado, el código debería ser equivalente. ¿Qué no estoy recibiendo?