Вот простой пример, использующий PHP 7 и Laravel 5, как построчно читать файл из Amazon S3:
S3StreamReader.php
<?php
declare(strict_types=1);
namespace App\Helpers\Json;
use App\Helpers\S3StreamFactory;
use Generator;
use SplFileObject;
final class S3StreamReader
{
/**
* @var \App\Helpers\S3StreamFactory
*/
private $streamFactory;
/**
* @param \App\Helpers\S3StreamFactory $s3StreamFactory
*/
public function __construct(S3StreamFactory $s3StreamFactory)
{
$this->streamFactory = $s3StreamFactory;
}
/**
* @param string $filename
* @return \Generator
*/
public function get(string $filename): Generator
{
$file = new SplFileObject($this->streamFactory->create($filename), 'r');
while (!$file->eof()) {
yield $file->fgets();
}
}
}
S3StreamFactory.php
<?php
declare(strict_types=1);
namespace App\Helpers;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
final class S3StreamFactory
{
/**
* @var \League\Flysystem\AwsS3v3\AwsS3Adapter
*/
private $adapter;
/**
* @param \League\Flysystem\AwsS3v3\AwsS3Adapter $adapter
*/
public function __construct(AwsS3Adapter $adapter)
{
$this->adapter = $adapter;
$adapter->getClient()->registerStreamWrapper();
}
/**
* @param string $filename
* @return string
*/
public function create(string $filename): string
{
return "s3://{$this->adapter->getBucket()}/{$filename}";
}
}
Пример использования:
$lines = (new S3JsonReader(new S3StreamFactory(Storage::disk('s3')->getAdapter())))->get($sourceFile);
while ($lines->valid()) {
$line = $lines->current();
// do something with the current line...
$lines->next();
}
Даже если вы не используете Laravel, вы все равно можете использовать этот код, поскольку Laravel просто использует пакет league / flysystem-aws-s3-v3 .