Advanced File Operations
Andy Snell | Dallas PHP | March 10, 2020
@andrewsnell
What Are File Operations?
@andrewsnell
- Browsing A Filesystem
- Getting File Metadata
- Reading File Contents
- Writing a New File
- Appending an Existing File
- Deleting an Existing File
What Are File Operations?
@andrewsnell
Filesystem CRUD / BREAD
But First, A cavaet...
@andrewsnell
"Advanced" !== "Better"
Sometimes Basic is Best!
echo file_get_contents("lorem.txt");
"Procedural" !== "Wrong"
What Are "Advanced" File Operations?
@andrewsnell
Approaches to file operations that support abstraction and scalability
What Are "Advanced" File Operations?
@andrewsnell
Advanced Operations
may help you interact with a filesystem in a more efficient or maintainable way
Key Concepts
@andrewsnell
- Files as Objects
- Files and Filesystems as Iterators
- Streams: Files in the Abstract
- Using the Flysystem Library
Files & PHP
@andrewsnell
The "Standard" PHP File Operations
@andrewsnell
Entirely Procedural
~81 built-in core file operation functions
and only two operative data-types:
(string)
(resource)
The "Standard" PHP File Operations
@andrewsnell
What's a "Resource"?
A data type for holding a reference
to an external resource
Not File Specific!
106 Different Types of Resources
Run Example #0
@andrewsnell
The "Standard" PHP File Operations
@andrewsnell
Often More Than One (Right?)
To Do One Kind of Operation
fread readfile fgetc fgetcsv fscanf
file_get_contentsfgets fgetss fpassthru file
How many (core) ways to read a file?
Run Example #1
@andrewsnell
The "Standard" PHP File Operations
@andrewsnell
Frequently Multiple Steps Needed
Writing to a File and Reading It Back
-
Open the File (fopen)
-
Write to the File (fwrite)
-
Rewind the File (rewind)
-
Read the File (fread)
-
Close the File (fclose)
Run Example #2
@andrewsnell
File As Objects
@andrewsnell
Enter the SPL
@andrewsnell
The "Standard PHP Library" is an extension to PHP that defines a number of interfaces and objects meant to solve common problems.*
* At the time it was added to the language in 2004
Enter the SPL
@andrewsnell
File Metadata as Object
SplFileInfo
(Show Example #3)
Enter the SPL
@andrewsnell
File As Iterable Object
SplFileObject
(Show Examples #4, #5, #6)
Enter the SPL
@andrewsnell
File As Temporary Iterable Object
SplTempFileObject
Enter the SPL
@andrewsnell
Iterable Directory Structure
FilesystemIterator
(Show Example #7)
Streams Vs. Strings
@andrewsnell
Strings Vs. Streams
@andrewsnell
Fatal error: Allowed memory size of 8388608 bytes exhausted…
Strings Vs. Streams
@andrewsnell
Strings are easy to work with, but are memory bound.
Streams are the way of generalizing file, network, and other operations which share a common set of functions and uses. In its simplest definition, A stream is a resource object which can be read from or written to in a linear fashion, and may be able to seek to an arbitrary location within the stream.
A stream is a resource object which can be read or written in a linear fashion, and may be able to seek to an arbitrary location within the stream.
Strings are easy to work with, but are memory bound.
Flysystem
@andrewsnell
Flysystem: A Filesystem Abstraction
@andrewsnell
The "filesystem" as an object
$filesystem = new Filesystem($adapter);
// write files
$response = $filesystem->write($path, $contents);
$response = $filesystem->writeStream($path, $resource [, $config]);
// read files
$contents = $filesystem->read($path);
$resource = $filesystem->readStream($path);
// do other file things
$contents = $filesystem->listContents($path, $recursive);
$file_exists = $filesystem->has($path);
$filesystem->delete($path);
$filesystem->rename($from, $to);
Flysystem: A Filesystem Abstraction
@andrewsnell
- Local Filesystem
- Local Memory
- .zip Files
- FTP / SFTP
- AWS S3
- Azure File Storage
- Azure Blob Storage
- Google Drive
- Google Cloud Storage
- Dropbox
- chroot
- Digital Ocean Spaces
- Rackspace
- Database via PDO
- Remote via SSH
- Redis
- PHPCR
- WebDAV
- OneDrive
- GitHub
One Interface
Many "Filesystems"
Flysystem: Other Benefits
@andrewsnell
Metadata & Directory Caching
$aws_adapter = new League\Flysystem\AwsS3V3\AwsS3Adapter($aws_client, $muh_bucket);
$memory_cache = new League\Flysystem\Cached\Storage\Memory();
$redis_cache = new League\Flysystem\Cached\Storage\PhpRedis($redis_client);
$adapter = new League\Flysystem\Cached\CachedAdapter($aws_adapter, $memory_cache);
$adapter = new League\Flysystem\Cached\CachedAdapter($aws_adapter, $redis_cache);
$filesystem = new Filesystem($adapter);
Flysystem: Other Benefits
@andrewsnell
Replication Across Filesystems
Write to Local and Cloud / Read from Local Only
$source = new League\Flysystem\Adapter\Local($local_path);
$replica = new League\Flysystem\AwsS3V3\AwsS3Adapter($aws_client, $muh_bucket);
$adapter = new League\Flysystem\Replicate\ReplicateAdapter($source, $replica);
$filesystem = new Filesystem($adapter);
Flysystem 2.0
@andrewsnell
Complete Re-Write of Library
Fix Method Names to Be Predictable and Readable
Less Arrays, More ArrayAccess
Uses Generators for Directory Listings, Not Arrays
Questions?
@andrewsnell
Andy Snell
Advanced File Operations
By Andy Snell
Advanced File Operations
- 161