Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rethink image manipulations with Glide (ForumPH...
Search
Jonathan Reinink
November 24, 2015
Technology
750
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rethink image manipulations with Glide (ForumPHP 2015)
Jonathan Reinink
November 24, 2015
More Decks by Jonathan Reinink
See All by Jonathan Reinink
The formula to awesome docs (phpDay 2017)
reinink
0
260
How to open source a PHP package (phpDay 2017)
reinink
1
240
The formula to awesome docs (Lone Star PHP 2016)
reinink
0
1.2k
The PHP Package Checklist (Lone Star PHP 2016)
reinink
0
400
Framework agnostic packages for the win (SkiPHP 2016)
reinink
1
470
Framework agnostic packages for the win (ForumPHP 2015)
reinink
8
1.1k
Rethink image manipulations with Glide
reinink
3
640
Enough about Classes, Let's Talk Templates
reinink
8
3.9k
Practical deployments for average projects
reinink
4
490
Other Decks in Technology
See All in Technology
Bits Agent Builder の⼊⾨と活⽤事例
nulabinc
PRO
0
170
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
300
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
150
2026-08-05 IBM Z開発最前線!IBM Bob Premium Package for Zって何がすごいの?
yutanonaka
0
140
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9.1k
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.4k
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.6k
ハーレムエンジニアリング
kazuma777777
0
180
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
340
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
1
1.4k
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
150
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
670
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
A Soul's Torment
seathinner
6
3.4k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
270
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Paper Plane
katiecoart
PRO
2
53k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Un-Boring Meetings
codingconduct
0
390
The Pragmatic Product Professional
lauravandoore
37
7.4k
Transcript
None
Jonathan Reinink Software developer from Canada. Been writing PHP for
over 15 years. Marketing agency for over a decade. Started contract development this year. I <3 open source.
A native PHP template system
Warning: This talk describes some Glide 1.0 features, which hasn’t
been released yet.
What is Glide? A wonderfully easy on-demand image manipulation library
written in PHP.
Glide Intervention Image Library GD (PHP) ImageMagick
Glide has an HTTP based API. Manipulate images using GET
parameters.
/img/kayaks.jpg
/img/kayaks.jpg?w=800
/img/kayaks.jpg?w=800&h=500
/img/kayaks.jpg?w=600&h=600&fit=crop
/img/kayaks.jpg?w=600&h=600&fit=crop-left
/img/kayaks.jpg?border=10,5000,overlay
kayaks.jpg?mark=billabong.png&markw=30w&markpad=3w&markpos=top-right
/img/kayaks.jpg?blur=10
/img/kayaks.jpg?filt=sepia
/img/kayaks.jpg?fm=gif /img/kayaks.jpg?fm=png /img/kayaks.jpg?fm=jpg /img/kayaks.jpg?fm=pjpg Encoding. /img/kayaks.jpg?fm=jpg&q=90
So where did this idea come from? Anyone remember TimThumb?
None
None
Only save your original images, not the manipulations. Then request
different image sizes when they are needed.
Use GD or ImageMagick. Glide is built on the Intervention
Image library.
use League\Glide\ServerFactory; ! $server = ServerFactory::create([ 'driver' => 'imagick', ]);
Use any file storage. Glide uses the Flysystem file system
abstraction library.
Use Glide in an app, or create a separate image
server. Offload image manipulations to a separate server on larger projects
Basic Glide installation. Using out-of-the-box settings.
Route::get('/img/users/{id}', function ($id) { ! $server = ServerFactory::create([ 'source' =>
'path/to/source', 'cache' => 'path/to/cache', ]); ! $server->outputImage('users/'.$id.'.jpg', [ 'w' => 300, 'h' => 400 ]); });
Route::get('/img/{path}', function ($path) { ! $server = ServerFactory::create([ 'source' =>
'path/to/source', 'cache' => 'path/to/cache', ]); ! $server->outputImage($path, $_GET); });
Route::get('/img/{path}', function ($path) { ! $server = ServerFactory::create([ 'source' =>
'path/to/source', 'cache' => 'path/to/cache', ]); ! return $server->getImageResponse($path, $_GET); });
Route::get('/img/{path}', function (Glide $server, Request $request, $path) { return $server->getImageResponse($path,
$request->all()); });
HTTP responses. Glide supports a wide range of response types,
including PSR-7 and HttpFoundation.
use League\Glide\Responses\SymfonyResponseFactory; ! $server = ServerFactory::create([ 'response' => SymfonyResponseFactory() ]);
Setup Glide using S3. Free your images from the local
disk.
$server = ServerFactory::create([ 'source' => 'path/to/source', 'cache' => 'path/to/cache', ]);
$source = new Local('path/to/source'); $cache = new Local('path/to/cache'); ! $server
= ServerFactory::create([ 'source' => new Filesystem($source), 'cache' => new Filesystem($cache), ]);
$client = S3Client::factory([ 'key' => 'your-key', 'secret' => 'your-secret', ]);
! $s3 = new AwsS3Adapter($client, 'your-bucket'); $cache = new Local('path/to/cache'); ! $server = ServerFactory::create([ 'source' => new Filesystem($s3), 'cache' => new Filesystem($cache), ]);
Defaults & presets. Automatically set the default encoding or add
a standard watermark.
$server = ServerFactory::create([ 'defaults' => [ 'mark' => 'logo.png', 'markw'
=> '30w', 'markpad' => '5w', ] ]);
$server = ServerFactory::create([ 'presets' => [ 'small' = [ 'w'
=> 200, 'h' => 200, 'fit' => 'crop', ], ] ]);
<img src="kayaks.jpg?p=small">
<img src="kayaks.jpg?p=small,watermarked">
<img src="kayaks.jpg?p=small,watermarked&filt=sepia">
Set a max image size. Prevent accidental resizing of massive
images.
$server = ServerFactory::create([ 'max_image_size' => 2000*2000, ]);
Prevent URL hacking by signing the image URLs. An important
security step that should always be used in production.
// Create a URL builder $builder = UrlBuilderFactory::create( 'http://example.com', 'your-sign-key'
); ! // Generate a URL $url = $builder->getUrl('cat.jpg', ['w' => 500]); ! // Use the URL in your app echo '<img src="'.$url.'">';
<img src="http://example.com/img/cat.jpg? w=500&token=af3dc18fc6bfb2afb521e587c348b904">
use League\Glide\Signatures\SignatureFactory; use League\Glide\Signatures\SignatureException; ! try { // Validate HTTP
signature SignatureFactory::create('your-sign-key') ->validateRequest($path, $_GET); } catch (SignatureException $e) { // Handle error }
Disabling cache. Let another service, like Varnish, do the work.
$source = new Local('path/to/source'); $cache = new MemoryAdapter(); ! $server
= ServerFactory::create([ 'source' => new Filesystem($source), 'cache' => new Filesystem($cache), ]);
Preprocess images. Helpful on heavy traffic websites.
// Handle your image upload $image = ... ! //
Dispatch the job to your queue $this->dispatch( new ProcessImageManipulations($image) ) ! // Run the job foreach (['small', 'medium', 'large'] as $size) { $glide->makeImage($image['path'], ['p' => 'small']); }
Thanks! Follow me on Twitter at @reinink. Rate this talk
https://joind.in/15274.