SlideShare a Scribd company logo
1 of 78
Download to read offline
Filesystem Management
with Flysystem
Mark Niebergall
👏 Thank you!
• Organisers
• Delegates
• Speakers
• Sponsors
- Nucleus Security
🧑💻 PHP Community
• You are amazing
• Attending a conference
- Learn
- Network
- Have fun
- Apply what you learned
🧑💻 PHP Community
• You made it to Thursday afternoon! 🤯
• 🙋 Poll: Who is already using Flysystem?
https://img
fl
ip.com/i/779qzd
🤔 Question
• How do you e
ff
ectively manage
fi
les with code?
🤔 Question
• Common solution
- fopen
-
fi
le_get_contents
-
fi
le_put_contents
- delete
- chmod
https://img
fl
ip.com/i/778h2c
AwsS3Service
Local
In Memory
AWS S3
Azure
SFTP
File
LocalService
InMemoryService
AzureService
SftpService
😵💫 The Problem
• “Flysystem is a
fi
le storage library for PHP. It provides one
interface to interact with many di
ff
erent types of
fi
lesystems. When you use Flysystem, you’re not only
protected from vendor lock-in, you’ll also have a
consistent experience for which ever storage is right for
you.”
Flysystem
Local
In Memory
AWS S3
Azure
SFTP
File
✅ Objective
• Familiarity with Flysystem API
• Ideas on implementation
• Improved
fi
lesystem interactions
📋 Overview
• Adapters
• Flysystem API
• Implementation Strategies
• Testing
Adapters
https://gifer.com/en/EgDb
Adapters
• Traditional
- Di
ff
erent code for local vs external
- Di
ff
erent code for each adapter
Adapters
• Use case
- Local for development
- SFTP for QA
- S3 storage for Production
Adapters
• Use case
- Variety of
fi
le types
Adapters
public function readLocal(string $location): string
{
return file_get_contents($location);
}
public function readS3(string $location): string
{
// read file from S3 storage
return 'File Contents';
}
public function getContents(string $storage, string $location): string
{
return match ($storage) {
'local' => $this->readLocal($location),
'awss3' => $this->readS3($location),
default => throw new InvalidArgumentException('Not configured'),
};
}
Adapters
• Flysystem is con
fi
gurable
- Local
- External services
Adapters
• O
ffi
cial Adapters - Local
- Local
- InMemory
Adapters
• O
ffi
cial Adapters - External
- AWS S3
- AsyncAws S3
- Azure Blob Storage
- Google Cloud Storage
- SFTP
- WebDAV
Adapters
• Community Adapters
- GitLab
Adapters
• Decorators
- Read-Only
‣ $adapter = new
InMemoryFilesystemAdapter();
$readOnlyAdapter = new
LeagueFlysystemReadOnlyReadOnlyFile
systemAdapter($adapter);
$filesystem = new Filesystem($adapter);
Adapters
• Decorators
- Path Pre
fi
xing
‣ $pathPrefixedAdapter = new
LeagueFlysystemPathPrefixngPathPref
ixedAdapter($adapter, 'a/path/prefix');
Flysystem API
http://www.quickmeme.com/meme/3uywoc
Flysystem API
• Decent documentation online
- https://
fl
ysystem.thephpleague.com/docs/
- Make sure you are on the correction version of
documentation!
Flysystem API
• Exists
- fileExists(string $location): bool
- directoryExists(string $location): bool
- has(string $location): bool
‣ $this->adapter->fileExists(
$path
)
|| $this->adapter->directoryExists(
$path
);
Flysystem API
• File CRUD
- C: Write
- R: Read
- U: Move
- D: Delete
Flysystem API
• Write
- write(
string $location,
string $contents,
array $config = []
): void
- writeStream(
string $location,
$contents,
array $config = []
): void
Flysystem API
• Read
- read(string $location): string
- readStream(string $location)
Flysystem API
• Delete
- delete(string $location): void
- deleteDirectory(string $location): void
Flysystem API
• Directory
- createDirectory(
string $location,
array $config = []
): void
- listContents(
string $location,
bool $deep = self::LIST_SHALLOW
): DirectoryListing
Flysystem API
• Files
- move(
string $source,
string $destination,
array $config = []
): void
- copy(
string $source,
string $destination,
array $config = []
): void
Flysystem API
• Metadata
- lastModified(string $path): int
- fileSize(string $path): int
- mimeType(string $path): string
- checksum(
string $path,
array $config = []
): string
Flysystem API
• Permissions
- setVisibility(
string $path,
string $visibility
): void
- visibility(string $path): string
Flysystem API
• URLs
- S3, Azure, Google Cloud, WebDAV
‣ publicUrl(
string $path,
array $config = []
): string
‣ temporaryUrl(
string $path,
DateTimeInterface $expiresAt,
array $config = []
): string
Flysystem API
• Frameworks
- Bundled with Laravel
- Available with Symfony
- Can be used with other frameworks too
Implementation Strategies
https://makeameme.org/meme/and-then-we-5b7d94
Implementation Strategies
• Con
fi
guration
• Exception Handling
• Wrapper
• Mount Manager
Implementation Strategies
• Con
fi
guration
- Injectable con
fi
guration for adapters
'filesystem' => [
'local' => [
'directory' => '/tmp/filesystem/files/',
],
'awss3' => [
'client' => [
'credentials' => [
'key' => 'key...',
'secret' => 'secret...',
],
'region' => 'us‑west‑1',
'version' => 'latest',
],
'bucket' => 'my-bucket-name',
],
],
Implementation Strategies
• Con
fi
guration
- Application
fl
exibility
- Variety of sources
‣ Database
‣ PHP con
fi
guration
fi
les
Implementation Strategies
• Con
fi
guration
- UI interface to con
fi
gure
- Scalability
Implementation Strategies
• Exception Handling
- Generic exception
‣ FilesystemException
- Speci
fi
c exceptions
‣ UnableToReadFile
‣ UnableToWriteFile
‣ UnableToDeleteFile
‣ UnableToCheckExistence
‣ ...
Implementation Strategies
• Exception Handling
- Full list of exceptions
‣ https://
fl
ysystem.thephpleague.com/docs/usage/
fi
lesystem-api/
Implementation Strategies
• Exception Handling
1. Catch Flysystem speci
fi
c exceptions
2. Handle the exception
3. Throw own meaningful exception
Implementation Strategies
public function read(string $location): string
{
try {
$contents = $this->filesystem->read($location);
} catch (UnableToReadFile $exception) {
// handle unable to read exception
// throw an exception
} catch (FilesystemException $exception) {
// handle general error
// throw an exception
}
return $contents;
}
Implementation Strategies
• Wrapper
- Wrapper or Facade Pattern
- Abstracts away underlying package
- Swappable package
- Unit testable
Implementation Strategies
• Wrapper
- Useful pattern for many services
‣ Filesystem
‣ Email
‣ SMS
‣ Database
‣ Queue system
Implementation Strategies
class FileStorageService
{
public function __construct(
protected Filesystem $filesystem
) {}
public function read(string $location): string
{
return $this->filesystem->read($location);
}
Implementation Strategies
• Mount Manager
- Scenario
‣ Retrieve
fi
les from an external service
‣ Write locally for processing
Implementation Strategies
• Mount Manager
- Scenario
‣ Move
fi
les between external adapters upon an event
Implementation Strategies
• Mount Manager
- Scenario
‣ Many customers
‣ Reports created, stored locally
‣ Reports delivered based on con
fi
guration
‣ Variety of
fi
le storage locations
Implementation Strategies
• Mount Manager
- Interact with
fi
les in many storage services
- Specify adapter in location
‣ awss3://subfolder/
fi
le.txt
‣ local://path/to/
fi
le.txt
MountManager
Local
In Memory
AWS S3
Azure
SFTP
Implementation Strategies
Implementation Strategies
class FileManager
{
public function __construct(
protected MountManager $mountManager
) {}
public function read(string $location): string
{
return $this->mountManager->read($location);
}
Implementation Strategies
class FileManagerFactory
{
public function __construct(
protected FileStorageAdapterFactory $adapterFactory
) {}
public function create(array $mounts): FileManager
{
$mountManageConfig = [];
foreach ($mounts as $storage => $config) {
$mountManageConfig[$storage] = new Filesystem(
$this->adapterFactory->create($storage, $config)
);
}
return new FileManager(new MountManager($mountManageConfig));
}
Implementation Strategies
class FileStorageAdapterFactory
{
public function create(string $adapter, array $config): FilesystemAdapter
{
return match ($adapter) {
'awss3' => new AwsS3V3Adapter($config['client'], $config['bucket']),
'local' => new LocalFilesystemAdapter($config['directory']),
};
}
Testing
https://img
fl
ip.com/i/7ami3u
Testing
• Historically problematic testing
fi
le interactions
- Test
fi
les
- Inject
fi
le content
- git ignore directory for testing
fi
les
- Skip testing that code
- Integration tests vs Unit tests
Testing
public function testRead(): void
{
$file = __DIR__ . '/TestingFile.txt';
$service = new FileStorageLocalLegacyService();
$contents = $service->read($file);
$this->assertSame(
'Test file contents 123 ...',
$contents
);
}
Testing
• Flysystem abstraction layer allows for testing
- Mock calls to
fi
le interactions
- Pushes for single purpose code
- Centralized
fi
lesystem management
Testing
public function testRead(): void
{
$text = 'Test text!';
$testPath = uniqid('/tmp/test/') . '.txt';
$filesystemMock = $this->getMockBuilder(Filesystem::class)
->disableOriginalConstructor()
->onlyMethods(['read'])
->getMock();
$filesystemMock->method('read')
->with($testPath)
->willReturn($text);
$service = new FileStorageService($filesystemMock);
$contents = $service->read($testPath);
$this->assertSame($text, $contents);
}
🗣 Discussion
🗣 Discussion
• Bene
fi
ts of Flysystem?
• Cons of Flysystem?
🗣 Discussion
• Security
• Credentials
🗣 Discussion
• Conversion cost
• Scalability
• Maintenance
📋 Review
• External Services
• Flysystem API
• Implementation Strategies
• Testing
Mark Niebergall @mbniebergall
• PHP since 2005
• Masters degree in MIS
• Senior Software Engineer
• Vulnerability Management project (security scans)
• Utah PHP Co-Organizer
• CSSLP, SSCP Certi
fi
ed and Exam Developer
• Endurance sports, outdoors
Mark Niebergall @mbniebergall
Mark Niebergall @mbniebergall
Filesystem Management with Flysystem
• Questions?
• I’ll stay after to answer more questions, help with setup
and con
fi
gs
👀 References
• https://
fl
ysystem.thephpleague.com/docs/usage/
fi
lesystem-api/
• https://github.com/thephpleague/
fl
ysystem

More Related Content

What's hot (20)

"Learning through dance" by Dr Ananda
"Learning through dance" by Dr Ananda "Learning through dance" by Dr Ananda
"Learning through dance" by Dr Ananda
 
Shilajatu
ShilajatuShilajatu
Shilajatu
 
रस
रसरस
रस
 
Class -7 Science Chapter-1 nutrition in plants,
Class -7 Science Chapter-1 nutrition in plants,Class -7 Science Chapter-1 nutrition in plants,
Class -7 Science Chapter-1 nutrition in plants,
 
12.agni vichar - Sharir Kriya
12.agni vichar  - Sharir Kriya12.agni vichar  - Sharir Kriya
12.agni vichar - Sharir Kriya
 
Indian clicical dances
Indian clicical dancesIndian clicical dances
Indian clicical dances
 
अलंकार
अलंकारअलंकार
अलंकार
 
samas
samassamas
samas
 
Hindi Grammar
Hindi GrammarHindi Grammar
Hindi Grammar
 
लिंग
लिंगलिंग
लिंग
 
samas (2).ppt
samas (2).pptsamas (2).ppt
samas (2).ppt
 
Super senses class 5
Super senses class 5Super senses class 5
Super senses class 5
 
karam karak ppt
karam karak pptkaram karak ppt
karam karak ppt
 
कारक(karak)
कारक(karak)कारक(karak)
कारक(karak)
 
Grade 4 Paryayvachi Shabd
Grade 4 Paryayvachi ShabdGrade 4 Paryayvachi Shabd
Grade 4 Paryayvachi Shabd
 
हिंदी वर्णमाला
हिंदी वर्णमाला हिंदी वर्णमाला
हिंदी वर्णमाला
 
सौर उर्जा
सौर उर्जासौर उर्जा
सौर उर्जा
 
alankar
alankaralankar
alankar
 
Alankar (hindi)
Alankar (hindi)Alankar (hindi)
Alankar (hindi)
 
Visheshan
VisheshanVisheshan
Visheshan
 

Similar to Filesystem Management with Flysystem at PHP UK 2023

Filesystem Management with Flysystem - php[tek] 2023
Filesystem Management with Flysystem - php[tek] 2023Filesystem Management with Flysystem - php[tek] 2023
Filesystem Management with Flysystem - php[tek] 2023Mark Niebergall
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5Darren Craig
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207patter
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Adam Tomat
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with PuppetJoe Ray
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShellBoulos Dib
 
Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2 Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2 3camp
 
StorageQuery: federated querying on object stores, powered by Alluxio and Presto
StorageQuery: federated querying on object stores, powered by Alluxio and PrestoStorageQuery: federated querying on object stores, powered by Alluxio and Presto
StorageQuery: federated querying on object stores, powered by Alluxio and PrestoAlluxio, Inc.
 
The Solar Framework for PHP 5 (2010 Confoo)
The Solar Framework for PHP 5 (2010 Confoo)The Solar Framework for PHP 5 (2010 Confoo)
The Solar Framework for PHP 5 (2010 Confoo)Paul Jones
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkBo-Yi Wu
 
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiGrâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiJérémy Derussé
 
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)arcware
 
Rock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsRock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsPablo Godel
 
Using puppet
Using puppetUsing puppet
Using puppetAlex Su
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasaggarrett honeycutt
 
Drupal Security from Drupalcamp Bratislava
Drupal Security from Drupalcamp BratislavaDrupal Security from Drupalcamp Bratislava
Drupal Security from Drupalcamp BratislavaGábor Hojtsy
 

Similar to Filesystem Management with Flysystem at PHP UK 2023 (20)

Filesystem Management with Flysystem - php[tek] 2023
Filesystem Management with Flysystem - php[tek] 2023Filesystem Management with Flysystem - php[tek] 2023
Filesystem Management with Flysystem - php[tek] 2023
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with Puppet
 
Symfony2 revealed
Symfony2 revealedSymfony2 revealed
Symfony2 revealed
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2 Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2
 
StorageQuery: federated querying on object stores, powered by Alluxio and Presto
StorageQuery: federated querying on object stores, powered by Alluxio and PrestoStorageQuery: federated querying on object stores, powered by Alluxio and Presto
StorageQuery: federated querying on object stores, powered by Alluxio and Presto
 
The Solar Framework for PHP 5 (2010 Confoo)
The Solar Framework for PHP 5 (2010 Confoo)The Solar Framework for PHP 5 (2010 Confoo)
The Solar Framework for PHP 5 (2010 Confoo)
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
 
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiGrâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
 
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
 
Rock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsRock Solid Deployment of Web Applications
Rock Solid Deployment of Web Applications
 
PyFilesystem
PyFilesystemPyFilesystem
PyFilesystem
 
Using puppet
Using puppetUsing puppet
Using puppet
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
 
Drupal Security from Drupalcamp Bratislava
Drupal Security from Drupalcamp BratislavaDrupal Security from Drupalcamp Bratislava
Drupal Security from Drupalcamp Bratislava
 

More from Mark Niebergall

Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Mark Niebergall
 
Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022Mark Niebergall
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentMark Niebergall
 
BDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and BehatBDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and BehatMark Niebergall
 
BDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and BehatBDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and BehatMark Niebergall
 
Relational Database Design Bootcamp
Relational Database Design BootcampRelational Database Design Bootcamp
Relational Database Design BootcampMark Niebergall
 
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)Mark Niebergall
 
Debugging PHP with Xdebug - PHPUK 2018
Debugging PHP with Xdebug - PHPUK 2018Debugging PHP with Xdebug - PHPUK 2018
Debugging PHP with Xdebug - PHPUK 2018Mark Niebergall
 
Advanced PHP Simplified - Sunshine PHP 2018
Advanced PHP Simplified - Sunshine PHP 2018Advanced PHP Simplified - Sunshine PHP 2018
Advanced PHP Simplified - Sunshine PHP 2018Mark Niebergall
 
Defensive Coding Crash Course Tutorial
Defensive Coding Crash Course TutorialDefensive Coding Crash Course Tutorial
Defensive Coding Crash Course TutorialMark Niebergall
 
Inheritance: Vertical or Horizontal
Inheritance: Vertical or HorizontalInheritance: Vertical or Horizontal
Inheritance: Vertical or HorizontalMark Niebergall
 
Cybersecurity State of the Union
Cybersecurity State of the UnionCybersecurity State of the Union
Cybersecurity State of the UnionMark Niebergall
 
Cryptography With PHP - ZendCon 2017 Workshop
Cryptography With PHP - ZendCon 2017 WorkshopCryptography With PHP - ZendCon 2017 Workshop
Cryptography With PHP - ZendCon 2017 WorkshopMark Niebergall
 
Defensive Coding Crash Course - ZendCon 2017
Defensive Coding Crash Course - ZendCon 2017Defensive Coding Crash Course - ZendCon 2017
Defensive Coding Crash Course - ZendCon 2017Mark Niebergall
 
Leveraging Composer in Existing Projects
Leveraging Composer in Existing ProjectsLeveraging Composer in Existing Projects
Leveraging Composer in Existing ProjectsMark Niebergall
 
Defensive Coding Crash Course
Defensive Coding Crash CourseDefensive Coding Crash Course
Defensive Coding Crash CourseMark Niebergall
 

More from Mark Niebergall (20)

Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023
 
Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022
 
Developing SOLID Code
Developing SOLID CodeDeveloping SOLID Code
Developing SOLID Code
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to Deployment
 
Stacking Up Middleware
Stacking Up MiddlewareStacking Up Middleware
Stacking Up Middleware
 
BDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and BehatBDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and Behat
 
BDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and BehatBDD API Tests with Gherkin and Behat
BDD API Tests with Gherkin and Behat
 
Hacking with PHP
Hacking with PHPHacking with PHP
Hacking with PHP
 
Relational Database Design Bootcamp
Relational Database Design BootcampRelational Database Design Bootcamp
Relational Database Design Bootcamp
 
Starting Out With PHP
Starting Out With PHPStarting Out With PHP
Starting Out With PHP
 
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
Automatic PHP 7 Compatibility Checking Using php7cc (and PHPCompatibility)
 
Debugging PHP with Xdebug - PHPUK 2018
Debugging PHP with Xdebug - PHPUK 2018Debugging PHP with Xdebug - PHPUK 2018
Debugging PHP with Xdebug - PHPUK 2018
 
Advanced PHP Simplified - Sunshine PHP 2018
Advanced PHP Simplified - Sunshine PHP 2018Advanced PHP Simplified - Sunshine PHP 2018
Advanced PHP Simplified - Sunshine PHP 2018
 
Defensive Coding Crash Course Tutorial
Defensive Coding Crash Course TutorialDefensive Coding Crash Course Tutorial
Defensive Coding Crash Course Tutorial
 
Inheritance: Vertical or Horizontal
Inheritance: Vertical or HorizontalInheritance: Vertical or Horizontal
Inheritance: Vertical or Horizontal
 
Cybersecurity State of the Union
Cybersecurity State of the UnionCybersecurity State of the Union
Cybersecurity State of the Union
 
Cryptography With PHP - ZendCon 2017 Workshop
Cryptography With PHP - ZendCon 2017 WorkshopCryptography With PHP - ZendCon 2017 Workshop
Cryptography With PHP - ZendCon 2017 Workshop
 
Defensive Coding Crash Course - ZendCon 2017
Defensive Coding Crash Course - ZendCon 2017Defensive Coding Crash Course - ZendCon 2017
Defensive Coding Crash Course - ZendCon 2017
 
Leveraging Composer in Existing Projects
Leveraging Composer in Existing ProjectsLeveraging Composer in Existing Projects
Leveraging Composer in Existing Projects
 
Defensive Coding Crash Course
Defensive Coding Crash CourseDefensive Coding Crash Course
Defensive Coding Crash Course
 

Recently uploaded

chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?Watsoo Telematics
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
buds n tech IT solutions
buds n  tech IT                solutionsbuds n  tech IT                solutions
buds n tech IT solutionsmonugehlot87
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 

Recently uploaded (20)

chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
buds n tech IT solutions
buds n  tech IT                solutionsbuds n  tech IT                solutions
buds n tech IT solutions
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 

Filesystem Management with Flysystem at PHP UK 2023