Giter Club home page Giter Club logo

screenshotter's Introduction

#Screenshotter

A PHP class for creating screenshots of web pages.

Behind the scenes it uses PhantomJS, which is installed for you when you install this package. (Linux, OSX and Windows).

##Installation

composer require lukaswhite/screenshotter

Ensure that the bin/ directory is executable:

chmod -R +x vendor/lukaswhite/screenshotter/src/bin

(Note that Composer should take care of this for you as a post-install command.)

##Usage

###1. Create an instance of the class:

$screenshotter = new \Lukaswhite\Screenshotter\Screenshotter(
  $ouputPath, 
  $cachePath
);

####Parameters

  • $outputPath is the directory you want to save the resulting screenshot to (without the filename). It should exist, and be writeable.
  • $cachePath is a directory used for caching, and is required. Again, it should exist and be writeable.

####Example:

$screenshotter = new \Lukaswhite\Screenshotter\Screenshotter(
  '/var/www/example.com/app/storage/screenshots/',
  '/var/tmp/'
);

###2. To take a screenshot:

$screenshot = $screenshotter->capture(
  $url, 
  $filename, 
  $options = []
);

####Parameters:

  • $url is the URL of the website / web page you want to take a screenshot of.
  • $filename is the filename to save the screenshot to.
  • $options is an optional array of additional options:
    • $width; if you don't provide this, it's set to 1024px
    • $height; if you don't provide this, it's set to 768px
    • $clipW; the width to clip (optional)
    • $clipH; the height to clip (optional)

####Return value:

The path to the screenshot.

####Note on Clipping

If you don't set a clip width & height, the resulting screenshot will be as tall as the web page, regardless of the $height setting. In most cases, you'll probably want to set $clipW and $clipH to match $width and $height respectively.

####Examples

$screenshot = $screenshotter->capture(
  'http://www.lukaswhite.com',
  'lukaswhitedotcom.png'
);
$screenshot = $screenshotter->capture(
  'http://www.lukaswhite.com',
  'lukaswhitedotcom.png',
  [
    'clipW' => 1024,
    'clipH' => 768
  ]
);
$screenshot = $screenshotter->capture(
  'http://www.lukaswhite.com',
  'lukaswhitedotcom.png',
  [
    'width' => 640,
    'height' => 480,
    'clipW' => 640,
    'clipH' => 480
  ]
);

###Additional Options

####Wait time

Phantomjs loads a page and then waits a certain length of time before taking the screenshot. This is to allow the page to be fully rendered, for images and fonts to be loaded, and so on.

By default it waits for one second. To set the wait time to something else, call the following method:

setWait( $value )

The value should be in milliseconds, for example:

$screenshotter->setWait( 3000 ); // wait for three seconds

####SSL Protocol

Phantomjs sometimes has difficulty connecting to HTTPS sites. Chances are if that's the case, the process will appear to suceed but the screenshot will be blank.

In many cases this is because by default Phantomjs uses SSLv3 to connect, which is often either unsupported or - thanks to the POODLE attack - has been disabled.

To get around this, you can use the setSSLProtocol() method to explictly tell Phantomjs which SSL protocol to use; the following values are valid:

  • sslv3
  • sslv2
  • tlsv1
  • any

In most cases, the simplest approach is simply to set it to all, i.e.:

$screenshotter->setSSLProtocol( 'any' );

####Ignore SSL Errors

Certain SSL errors can also cause difficulty; notably expired or self-signed certificates. You can tell Phantomjs to ignore SSL errors with the following:

$screenshotter->ignoreSSLErrors();
// or
$screenshotter->ignoreSSLErrors( TRUE );

To tell it not to ignore SSL errors - which is the default behaviour - simply set it to FALSE:

$screenshotter->ignoreSSLErrors( FALSE );

###Exceptions

If the screenshot process fails, it'll throw an Exception. Most likely this will be an instance of:

Symfony\Component\Process\Exception\ProcessTimedOutException

This type of exception (a timeout) can happen for a variety of reasons, and not just a timeout; because PhantomJS is an external process, it's not always easy to know what failed, so check your parameters. You can also increase the timeout:

$screenshotter->setTimeout(60); // Set timeout to 60 seconds, instead of the defaut 10

screenshotter's People

Contributors

lukaswhite avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.