| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169 |
- <?xml version="1.0" encoding="UTF-8"?>
- <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
- <channel>
- <title>PHP PhantomJs</title>
- <description>Run PhantomJS scripts through PHP</description>
- <link>http://jonnnnyw.github.io/php-phantomjs/</link>
- <atom:link href="http://jonnnnyw.github.io/php-phantomjs/feed.xml" rel="self" type="application/rss+xml" />
-
- <item>
- <title>Introduction</title>
- <description><p>PHP PhantomJS is a flexible PHP library to load pages through the PhantomJS headless browser and return the page response. It is handy for testing websites that demand javascript support and also supports screen captures.</p>
- <h2 id="feature-list">Feature List</h2>
- <ul>
- <li>Load webpages through the PhantomJS headless browser</li>
- <li>View detailed response data including page content, headers, status<br />
- code etc.</li>
- <li>Handle redirects</li>
- <li>View javascript console errors</li>
- <li>View detailed PhantomJS debuged information</li>
- <li>Save screen captures to local disk</li>
- <li>Set viewport size</li>
- <li>Define screen capture x, y, width and height parameters</li>
- <li>Delay page rendering for a specified time</li>
- <li>Execute PhantomJS with command line options</li>
- <li>Easily build and run custom PhantomJS scripts</li>
- </ul>
- <h2 id="prerequisites">Prerequisites</h2>
- <p>PHP PhantomJS requires PHP <strong>5.3.0</strong> or greater to run.</p>
- <h2 id="installation">Installation</h2>
- <p>It is recommended that you use Composer to install PHP PhantomJS. First, add the following to your project’s <code>composer.json</code> file:</p>
- <div class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="c1">#composer.json</span>
- <span class="s">&quot;scripts&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;post-install-cmd&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">[</span>
- <span class="s">&quot;PhantomInstaller\\Installer::installPhantomJS&quot;</span>
- <span class="p-Indicator">],</span>
- <span class="s">&quot;post-update-cmd&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">[</span>
- <span class="s">&quot;PhantomInstaller\\Installer::installPhantomJS&quot;</span>
- <span class="p-Indicator">]</span>
- <span class="p-Indicator">}</span></code></pre></div>
- <p>This will ensure the latest version of PhantomJS is installed for your system, in your bin folder. If you haven’t defined your bin folder in your composer.json, add the path:</p>
- <div class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="c1">#composer.json</span>
-
- <span class="s">&quot;config&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;bin-dir&quot;</span><span class="p-Indicator">:</span> <span class="s">&quot;bin&quot;</span>
- <span class="p-Indicator">}</span></code></pre></div>
- <p>Finally, install PHP PhantomJS from the root of your project:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
-
- <span class="nv">$ </span>composer require <span class="s2">&quot;jonnyw/php-phantomjs:3.*&quot;</span></code></pre></div>
- <p>If you would like to use another installation method or would like to see more detailed installation instructions, see the <a href="http://jonnnnyw.github.io/php-phantomjs/installation.html">installation</a> documentation.</p>
- <h2 id="basic-usage">Basic Usage</h2>
- <p>The following illustrates how to make a basic GET request and output the page content:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="sd">/** </span>
- <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
- <span class="sd"> **/</span>
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">,</span> <span class="s1">&#39;GET&#39;</span><span class="p">);</span>
- <span class="sd">/** </span>
- <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
- <span class="sd"> **/</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
- <span class="c1">// Send the request</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span>
- <span class="k">if</span><span class="p">(</span><span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getStatus</span><span class="p">()</span> <span class="o">===</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
- <span class="c1">// Dump the requested page content</span>
- <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
- <span class="p">}</span></code></pre></div>
- <p>And if you would like to save a screen capture to local disk:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="sd">/** </span>
- <span class="sd"> * @see JonnyW\PhantomJs\Message\CaptureRequest</span>
- <span class="sd"> **/</span>
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">,</span> <span class="s1">&#39;GET&#39;</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureFile</span><span class="p">(</span><span class="s1">&#39;/path/to/save/capture/file.jpg&#39;</span><span class="p">);</span>
- <span class="sd">/** </span>
- <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
- <span class="sd"> **/</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
- <span class="c1">// Send the request</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>For more detailed examples see the <a href="http://jonnnnyw.github.io/php-phantomjs/usage.html">usage</a> section, or to create your own custom scripts check out the <a href="http://jonnnnyw.github.io/php-phantomjs/advanced.html">advanced</a> documentation.</p>
- </description>
- <pubDate>Mon, 28 Jul 2014 00:00:00 +0100</pubDate>
- <link>http://jonnnnyw.github.io/php-phantomjs/introduction.html</link>
- <guid isPermaLink="true">http://jonnnnyw.github.io/php-phantomjs/introduction.html</guid>
- </item>
-
- <item>
- <title>Installation</title>
- <description><ul>
- <li><a href="#prerequisites">Prerequisites</a></li>
- <li><a href="#installing-via-composer">Installing via Composer</a></li>
- <li><a href="#custom-installation">Custom Installation</a></li>
- <li><a href="#installing-from-tarball">Installing from tarball</a></li>
- </ul>
- <hr />
- <h2 id="prerequisites">Prerequisites</h2>
- <p>PHP PhantomJS requires PHP <strong>5.3.0</strong> or greater to run.</p>
- <h2 id="installing-via-composer">Installing via Composer</h2>
- <p>Install <a href="https://getcomposer.org/">Composer</a> for your project:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
- <span class="nv">$ </span>curl -s http://getcomposer.org/installer <span class="p">|</span> php</code></pre></div>
- <p>Create a <code>composer.json</code> file in the root of your project:</p>
- <div class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="c1">#composer.json</span>
- <span class="p-Indicator">{</span>
- <span class="s">&quot;require&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;jonnyw/php-phantomjs&quot;</span><span class="p-Indicator">:</span> <span class="s">&quot;3.*&quot;</span>
- <span class="p-Indicator">},</span>
- <span class="s">&quot;config&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;bin-dir&quot;</span><span class="p-Indicator">:</span> <span class="s">&quot;bin&quot;</span>
- <span class="p-Indicator">},</span>
- <span class="s">&quot;scripts&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;post-install-cmd&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">[</span>
- <span class="s">&quot;PhantomInstaller\\Installer::installPhantomJS&quot;</span>
- <span class="p-Indicator">],</span>
- <span class="s">&quot;post-update-cmd&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">[</span>
- <span class="s">&quot;PhantomInstaller\\Installer::installPhantomJS&quot;</span>
- <span class="p-Indicator">]</span>
- <span class="p-Indicator">}</span>
- <span class="p-Indicator">}</span></code></pre></div>
- <p>It is important that you have the ‘scripts’ section shown above in your <code>composer.json</code> file as it will install the latest version of PhantomJS for your system to your project’s bin folder. It is recommended that you create a bin folder in the root of your project as this is where the PHP PhantomJS library will look for your PhantomJS executable. If you would prefer to use a PhantomJS executable in a custom location, see the <a href="#custom-installation">Custom Installation</a> section.</p>
- <p>Finally, install the composer depedencies for your project:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
-
- <span class="nv">$ </span>php composer.phar install</code></pre></div>
- <h2 id="custom-installation">Custom Installation</h2>
- <p>If you would prefer to use a custom install location for the PhantomJS executable, you simply need to tell the client where to find the executable file:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">setPhantomJs</span><span class="p">(</span><span class="s1">&#39;/path/to/phantomjs&#39;</span><span class="p">);</span></code></pre></div>
- <blockquote>
- <h4 id="important">Important</h4>
- <p>The PHP PhantomJS library also requires a <code>phantomloader</code> file that comes bundled with the library and is installed to the bin folder defined in your <code>composer.json</code> file. If you are setting a custom path to the PhantomJS executable, you need to make sure that the <code>phantomloader</code> file can be found in the bin folder it was installed to.</p>
- <p>See below if you wish to use a custom bin folder.</p>
- </blockquote>
- <p>If you would like composer to install all executable files to a custom bin location when installing dependencies, set the bin dir location in your project’s <code>composer.json</code> file:</p>
- <div class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="c1">#composer.json</span>
- <span class="p-Indicator">{</span>
- <span class="s">&quot;config&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;bin-dir&quot;</span><span class="p-Indicator">:</span> <span class="s">&quot;/path/to/your/projects/bin/dir&quot;</span>
- <span class="p-Indicator">}</span>
- <span class="p-Indicator">}</span></code></pre></div>
- <p>You will need to make sure that this directory exists and is writable by Composer before running the composer install.</p>
- <p>Once you have updated your bin location run composer install to install PhantomJS:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
-
- <span class="nv">$ </span>php composer.phar install</code></pre></div>
- <p>This should install the correct PhantomJS executable for your system and the required <code>phantomloader</code> file to the bin locaiton you defined in your <code>composer.json</code> file. </p>
- <p>Now you need to tell the client where to find your bin folder:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">setBinDir</span><span class="p">(</span><span class="s1">&#39;/path/to/bin/dir&#39;</span><span class="p">);</span></code></pre></div>
- <h2 id="installing-from-tarball">Installing from tarball</h2>
- <p>The PHP PhantomJS library contains several depedencies in order to function so it is recommended that you install it via composer as this will handle your dependencies for you. If you do wish to install it from a <a href="https://github.com/jonnnnyw/php-phantomjs/tags">tarball release</a> then you will need to install the dependencies manually.</p>
- <p>The PHP PhantomJS library currently requires the following depdencies:</p>
- <ul>
- <li><a href="https://github.com/symfony/Config">Symfony Config Component</a> ~2.5</li>
- <li><a href="https://github.com/symfony/Yaml">Symfony YAML Component</a> ~2.5</li>
- <li><a href="https://github.com/symfony/DependencyInjection">Symfony Dependency Injection Component</a> ~2.5</li>
- <li><a href="https://github.com/symfony/filesystem">Symfony Filesystem Component</a> ~2.5</li>
- <li><a href="https://github.com/fabpot/Twig">Twig templating Component</a> ~1.16</li>
- <li><a href="http://phantomjs.org/">PhantomJS</a> ~1.9</li>
- </ul>
- <p>Make sure the components are in your include path and that the PhantomJS executable is installed to your projects bin folder as mentioned in the <a href="#custom-installation">Custom Installation</a> section.</p>
- </description>
- <pubDate>Sun, 27 Jul 2014 00:00:00 +0100</pubDate>
- <link>http://jonnnnyw.github.io/php-phantomjs/installation.html</link>
- <guid isPermaLink="true">http://jonnnnyw.github.io/php-phantomjs/installation.html</guid>
- </item>
-
- <item>
- <title>Usage</title>
- <description><p>This page contains some common examples of how to use the PHP PhantomJS library.</p>
- <ul>
- <li><a href="#basic-request">Basic Request</a></li>
- <li><a href="#post-request">POST Request</a></li>
- <li><a href="#other-request-methods">Other Request Methods</a></li>
- <li><a href="#response-data">Response Data</a></li>
- <li><a href="#screen-captures">Screen Captures</a></li>
- <li><a href="#set-viewport-size">Set Viewport Size</a></li>
- <li><a href="#custom-timeout">Custom Timeout</a></li>
- <li><a href="#delay-page-render">Delay Page Render</a></li>
- <li><a href="#custom-run-options">Custom Run Options</a></li>
- </ul>
- <p>For more advanced customization or to load your own PhantomJS scripts, see the <a href="http://jonnnnyw.github.io/php-phantomjs/advanced.html">advanced</a> documentation.</p>
- <hr />
- <h2 id="basic-request">Basic Request</h2>
- <p>A basic GET request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">();</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setMethod</span><span class="p">(</span><span class="s1">&#39;GET&#39;</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setUrl</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span>
-
- <span class="k">if</span><span class="p">(</span><span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getStatus</span><span class="p">()</span> <span class="o">===</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
- <span class="p">}</span></code></pre></div>
- <p>You can also set the URL, request method and timeout period when creating a new request instance through the message factory:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">,</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="mi">5000</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span>
-
- <span class="k">if</span><span class="p">(</span><span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getStatus</span><span class="p">()</span> <span class="o">===</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
- <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
- <span class="p">}</span></code></pre></div>
- <h2 id="post-request">POST Request</h2>
- <p>A basic POST request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">();</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$data</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
- <span class="s1">&#39;param1&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Param 1&#39;</span><span class="p">,</span>
- <span class="s1">&#39;param2&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Param 2&#39;</span>
- <span class="p">);</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setMethod</span><span class="p">(</span><span class="s1">&#39;POST&#39;</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setUrl</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setRequestData</span><span class="p">(</span><span class="nv">$data</span><span class="p">);</span> <span class="c1">// Set post data</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h2 id="other-request-methods">Other Request Methods</h2>
- <p>The PHP PhantomJS library supports the following request methods:</p>
- <ul>
- <li>OPTIONS</li>
- <li>GET</li>
- <li>HEAD</li>
- <li>POST</li>
- <li>PUT</li>
- <li>DELETE</li>
- <li>PATCH</li>
- </ul>
- <p>The request method can be set when creating a new request instance through the message factory:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">,</span> <span class="s1">&#39;PUT&#39;</span><span class="p">);</span></code></pre></div>
- <p>Or on the request instance itself:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">();</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setMethod</span><span class="p">(</span><span class="s1">&#39;PATCH&#39;</span><span class="p">);</span></code></pre></div>
- <h2 id="response-data">Response Data</h2>
- <p>A standard response gives you access to the following interface:</p>
- <table>
- <thead>
- <tr>
- <th style="text-align: center">Accessor</th>
- <th>Description</th>
- <th style="text-align: center">Return Type</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td style="text-align: center">getHeaders()</td>
- <td>Returns an array of all response headers.</td>
- <td style="text-align: center">Array</td>
- </tr>
- <tr>
- <td style="text-align: center">getHeader(<em>header</em>)</td>
- <td>Returns the value for a specific response header e.g. Content-Type.</td>
- <td style="text-align: center">Mixed</td>
- </tr>
- <tr>
- <td style="text-align: center">getStatus()</td>
- <td>The response status code e.g. 200.</td>
- <td style="text-align: center">Int</td>
- </tr>
- <tr>
- <td style="text-align: center">getContent()</td>
- <td>The raw page content of the requested page.</td>
- <td style="text-align: center">String</td>
- </tr>
- <tr>
- <td style="text-align: center">getContentType()</td>
- <td>The content type of the requested page.</td>
- <td style="text-align: center">String</td>
- </tr>
- <tr>
- <td style="text-align: center">getUrl()</td>
- <td>The URL of the requested page.</td>
- <td style="text-align: center">String</td>
- </tr>
- <tr>
- <td style="text-align: center">getRedirectUrl()</td>
- <td>If the response was a redirect, this will return the redirect URL.</td>
- <td style="text-align: center">String</td>
- </tr>
- <tr>
- <td style="text-align: center">isRedirect()</td>
- <td>Will return true if the response was a redirect or false otherwise.</td>
- <td style="text-align: center">Boolean</td>
- </tr>
- <tr>
- <td style="text-align: center">getConsole()</td>
- <td>Returns an array of any javascript errors on the requested page along with a stack trace.</td>
- <td style="text-align: center">Array</td>
- </tr>
- </tbody>
- </table>
- <p>If the response contains a status code of 0, chances are the request failed. Check the request <a href="http://jonnnnyw.github.io/php-phantomjs/troubleshooting.html#how-to-i-debug-a-request">debug log</a> for more detailed information about what may have gone wrong.</p>
- <h2 id="screen-captures">Screen Captures</h2>
- <p>You can save screen captures of a page to your local disk by creating a screen capture request and setting the path you wish to save the file to:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$file</span> <span class="o">=</span> <span class="s1">&#39;/path/to/save/your/screen/capture/file.jpg&#39;</span><span class="p">;</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureFile</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>You will need to make sure the directory that you are saving the file to exists and is writable by your application.</p>
- <p>You can also set the width, height, x and y axis for your screen capture:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$file</span> <span class="o">=</span> <span class="s1">&#39;/path/to/save/your/screen/capture/file.jpg&#39;</span><span class="p">;</span>
-
- <span class="nv">$top</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
- <span class="nv">$left</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
- <span class="nv">$width</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span>
- <span class="nv">$height</span> <span class="o">=</span> <span class="mi">400</span><span class="p">;</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureFile</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureDimensions</span><span class="p">(</span><span class="nv">$width</span><span class="p">,</span> <span class="nv">$height</span><span class="p">,</span> <span class="nv">$top</span><span class="p">,</span> <span class="nv">$left</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h2 id="set-viewport-size">Set Viewport Size</h2>
- <p>You can easily set the viewport size for a request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$width</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span>
- <span class="nv">$height</span> <span class="o">=</span> <span class="mi">400</span><span class="p">;</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setViewportSize</span><span class="p">(</span><span class="nv">$width</span><span class="p">,</span> <span class="nv">$height</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h2 id="custom-timeout">Custom Timeout</h2>
- <p>By default, each request will timeout after 5 seconds. You can set a custom timeout period (in milliseconds) for each request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$timeout</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span> <span class="c1">// 10 seconds</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setTimeout</span><span class="p">(</span><span class="nv">$timeout</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h2 id="delay-page-render">Delay Page Render</h2>
- <p>Sometimes when taking screen captures you may want to wait until the page is completely loaded before saving the capture. In this instance you can set a page render delay (in seconds) for the request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$delay</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="c1">// 5 seconds</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setDelay</span><span class="p">(</span><span class="nv">$delay</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>You can set a page render delay for standard requests also.</p>
- <h2 id="custom-run-options">Custom Run Options</h2>
- <p>The PhantomJS API contains a range of command line options that can be passed when executing the PhantomJS executable. These can also be passed in via the client before a request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">addOption</span><span class="p">(</span><span class="s1">&#39;--load-images=true&#39;</span><span class="p">);</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">addOption</span><span class="p">(</span><span class="s1">&#39;--ignore-ssl-errors=true&#39;</span><span class="p">);</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>You can also set a path to a JSON configuration file that contains multiple PhantomJS options:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">addOption</span><span class="p">(</span><span class="s1">&#39;--config=/path/to/config.json&#39;</span><span class="p">);</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>See the <a href="http://phantomjs.org/api/command-line.html">PhantomJS Documentation</a> for a full list of command line options.</p>
- </description>
- <pubDate>Sat, 26 Jul 2014 00:00:00 +0100</pubDate>
- <link>http://jonnnnyw.github.io/php-phantomjs/usage.html</link>
- <guid isPermaLink="true">http://jonnnnyw.github.io/php-phantomjs/usage.html</guid>
- </item>
-
- <item>
- <title>Advanced Usage</title>
- <description><ul>
- <li><a href="#phantomjs-command-line-options">PhantomJS command line options</a></li>
- <li><a href="#custom-phantomjs-scripts">Custom PhantomJS scripts</a>
- <ul>
- <li><a href="#writing-a-custom-script">Writing a custom script</a></li>
- <li><a href="#using-custom-request-parameters-in-your-script">Using custom request parameters in your script</a></li>
- <li><a href="#loading-your-script">Loading your script</a></li>
- </ul>
- </li>
- </ul>
- <hr />
- <h2 id="phantomjs-command-line-options">PhantomJS command line options</h2>
- <p>The PhantomJS API contains a range of command line options that can be passed when executing the PhantomJS executable. These can also be passed in via the client before a request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">addOption</span><span class="p">(</span><span class="s1">&#39;--load-images=true&#39;</span><span class="p">);</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">addOption</span><span class="p">(</span><span class="s1">&#39;--ignore-ssl-errors=true&#39;</span><span class="p">);</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>You can also set a path to a JSON configuration file that contains multiple PhantomJS options:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">addOption</span><span class="p">(</span><span class="s1">&#39;--config=/path/to/config.json&#39;</span><span class="p">);</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>See the <a href="http://phantomjs.org/api/command-line.html">PhantomJS Documentation</a> for a full list of command line options.</p>
- <h2 id="custom-phantomjs-scripts">Custom PhantomJS scripts</h2>
- <p>In most instances you shouldn’t need to worry about the javascript files that run the PHP PhantomJS library but there may be times when you want to execute your own custom PhantomJS scripts through the client. This can be easily achieved by using the built in script loader.</p>
- <p>Script files or ‘procedures’ as they are referred to in the application are closely mapped to requests. When you create a default request instance, you are essentially running the default javascript procedure that comes bundled with the application. When you create a capture request you are running the capture procedure.</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">();</span> <span class="c1">// ~/Resources/procedures/default.proc</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">();</span> <span class="c1">// ~/Resources/procedures/capture.proc</span></code></pre></div>
- <h3 id="writing-a-custom-script">Writing a custom script</h3>
- <p>The first step in creating your script is to create a procedure file somewhere. For the purpose of this guide we will refer to it as <code>my_procedure.proc</code> but in reality it can be called anything you like. The only requirement is that the file extension must be <code>.proc</code>.</p>
- <p>Create the file somewhere and make sure it can be read by your application. Make a note of the path to the directory where your file is created as you will need this when loading your script which is explained later in this guide.</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
-
- <span class="nv">$ </span>touch my_procedure.proc
- <span class="nv">$ </span>chmod <span class="m">755</span> my_procedure.proc</code></pre></div>
- <p>Next open your procedure file in your text editor and write your PhantomJS script. The <a href="http://phantomjs.org/quick-start.html">PhantomJS documentation</a> has more detailed information on writing custom scripts.</p>
- <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// my_procedure.proc</span>
- <span class="kd">var</span> <span class="nx">page</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;webpage&#39;</span><span class="p">).</span><span class="nx">create</span><span class="p">();</span>
-
- <span class="nx">page</span><span class="p">.</span><span class="nx">open</span> <span class="p">(</span><span class="s1">&#39;{{ request.getUrl() }}&#39;</span><span class="p">,</span> <span class="s1">&#39;{{ request.getMethod() }}&#39;</span><span class="p">,</span> <span class="s1">&#39;{{ request.getBody() }}&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">status</span><span class="p">)</span> <span class="p">{</span>
-
- <span class="c1">// It is important that you exit PhantomJS</span>
- <span class="c1">// when your script has run or when you</span>
- <span class="c1">// encounter an error</span>
- <span class="nx">phantom</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
- <span class="p">});</span>
-
- <span class="p">...</span></code></pre></div>
- <blockquote>
- <h4 id="important">Important</h4>
- <p>Make sure that <code>phantom.exit(1);</code> is always called after your script has run or if you encounter an error. This requires you to take care when handling PhantomJS errors to ensure that you exit the PhantomJS script, whether the script was successfully executed or not. If you do not call <code>phantom.exit(1);</code> then PhantomJS will continue to run until your PHP script times out. If you find that your custom script is hanging then this is most likely the cause.</p>
- </blockquote>
- <p>It is a good practice to create a global error handler in your script that exits PhantomJS:</p>
- <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// my_procedure.proc</span>
- <span class="nx">phantom</span><span class="p">.</span><span class="nx">onError</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">msg</span><span class="p">,</span> <span class="nx">trace</span><span class="p">)</span> <span class="p">{</span>
-
- <span class="nx">phantom</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
- <span class="p">};</span>
-
- <span class="p">...</span></code></pre></div>
- <h3 id="using-custom-request-parameters-in-your-script">Using custom request parameters in your script</h3>
- <p>Before a procedure is executed by the application it is parsed through a template parser. The PHP PhantomJS library uses the popular <a href="https://github.com/fabpot/Twig">Twig templating engine</a>. This gives you access to all the <a href="http://twig.sensiolabs.org/doc/templates.html">Twig niceness</a> which you can use in your custom scripts.</p>
- <p>You may have noticed in the example above that we have used some Twig template tags referencing a request object e.g. <code>{{ request.getUrl() }}</code>. This is in fact the PHP request instance that you created and passed to the client when sending your request, which is injected into the Twig template parser. As a result you gain full access to all the data contained within the request instance, via the data accessor methods.</p>
- <p>A default request instance contains the following accessors:</p>
- <table>
- <thead>
- <tr>
- <th style="text-align: center">Accessor</th>
- <th>Description</th>
- <th style="text-align: center">Twig example</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td style="text-align: center">getMethod()</td>
- <td>The request method e.g. GET.</td>
- <td style="text-align: center">{{ request.getMethod() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getTimeout()</td>
- <td>The request timeout period in milliseconds.</td>
- <td style="text-align: center">{{ request.getTimeout() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getDelay()</td>
- <td>The page render delay in seconds.</td>
- <td style="text-align: center">{{ request.getDelay() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getViewportWidth()</td>
- <td>The viewport width.</td>
- <td style="text-align: center">{{ request.getViewportWidth() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getViewportHeight()</td>
- <td>The viewport height.</td>
- <td style="text-align: center">{{ request.getViewportHeight() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getUrl()</td>
- <td>The request URL.</td>
- <td style="text-align: center">{{ request.getUrl() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getBody()</td>
- <td>The request body (POST, PUT).</td>
- <td style="text-align: center">{{ request.getBody() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getHeaders(<em>format</em>)</td>
- <td>The request headers.</td>
- <td style="text-align: center">{{ request.getHeaders(‘json’) }}</td>
- </tr>
- </tbody>
- </table>
- <p>A capture request contains a few additional ones:</p>
- <table>
- <thead>
- <tr>
- <th style="text-align: center">Accessor</th>
- <th>Description</th>
- <th style="text-align: center">Twig example</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td style="text-align: center">getRectTop()</td>
- <td>The x coordinate of the capture region.</td>
- <td style="text-align: center">{{ request.getRectTop() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getRectLeft()</td>
- <td>The y coordinate of the capture region.</td>
- <td style="text-align: center">{{ request.getRectLeft() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getRectWidth()</td>
- <td>The width of the capture region.</td>
- <td style="text-align: center">{{ request.getRectWidth() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getRectHeight()</td>
- <td>The height of the capture region.</td>
- <td style="text-align: center">{{ request.getRectHeight() }}</td>
- </tr>
- <tr>
- <td style="text-align: center">getCaptureFile()</td>
- <td>The file to save the capture to.</td>
- <td style="text-align: center">{{ request.getCaptureFile() }}</td>
- </tr>
- </tbody>
- </table>
- <p>If you would like to inject additional data into your script through custom accessors, simply extend the request class with your own:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Message\Request</span><span class="p">;</span>
-
- <span class="k">class</span> <span class="nc">CustomRequest</span> <span class="k">extends</span> <span class="nx">Request</span>
- <span class="p">{</span>
-
- <span class="k">public</span> <span class="k">function</span> <span class="nf">getSomething</span><span class="p">()</span>
- <span class="p">{</span>
- <span class="k">return</span> <span class="s1">&#39;Something!&#39;</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">}</span></code></pre></div>
- <p>Now you will be able to access the data in your custom script when using your custom request:</p>
- <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// my_procedure.proc</span>
- <span class="kd">var</span> <span class="nx">something</span> <span class="o">=</span> <span class="s1">&#39;{{ request.getSomething() }}&#39;</span><span class="p">;</span> <span class="c1">// Get something</span>
-
- <span class="p">...</span></code></pre></div>
- <p>And to use your custom request simply create a new instance of it and pass it to the client:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">CustomRequest</span><span class="p">();</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setMethod</span><span class="p">(</span><span class="s1">&#39;GET&#39;</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setUrl</span><span class="p">(</span><span class="s1">&#39;http://www.google.com&#39;</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h3 id="loading-your-script">Loading your script</h3>
- <p>Now that you have your custom script and you’ve added your custom request parameters, you may be wondering how to tell the client to actually load your script. This is done by creating a procedure loader and telling it where to find your script files.</p>
- <p>The service container has a factory that makes creating a new procedure loader easy:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\DependencyInjection\ServiceContainer</span><span class="p">;</span>
-
- <span class="nv">$location</span> <span class="o">=</span> <span class="s1">&#39;/path/to/your/procedure/directory&#39;</span><span class="p">;</span>
-
- <span class="nv">$serviceContainer</span> <span class="o">=</span> <span class="nx">ServiceContainer</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$procedureLoader</span> <span class="o">=</span> <span class="nv">$serviceContainer</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;procedure_loader_factory&#39;</span><span class="p">)</span>
- <span class="o">-&gt;</span><span class="na">createProcedureLoader</span><span class="p">(</span><span class="nv">$location</span><span class="p">);</span>
-
- <span class="o">...</span></code></pre></div>
- <p>The client contains a chain procedure loader which lets you set multiple loaders at the same time. Ultimately this means that you can load your custom scripts while still maintaining the ability to load the default scripts if you choose. </p>
- <p>Now add your procedure loader to the chain loader:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="o">...</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getProcedureLoader</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">addLoader</span><span class="p">(</span><span class="nv">$procedureLoader</span><span class="p">);</span>
-
- <span class="o">...</span></code></pre></div>
- <p>The last thing you need to do is to tell the request which script you want to load for that request. This is done by setting the request type to the name of your procedure file, minus the extension:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="o">...</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">();</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setType</span><span class="p">(</span><span class="s1">&#39;my_procedure&#39;</span><span class="p">);</span>
-
- <span class="o">...</span></code></pre></div>
- <p>Or if you are using a custom request as outlined in the <a href="#using-custom-request-parameters-in-your-script">custom request parameters</a> section, you can implement a <code>getType()</code> method which returns the name of your procedure, eliminating the need to set the request type for each request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Message\Request</span><span class="p">;</span>
-
- <span class="k">class</span> <span class="nc">CustomRequest</span> <span class="k">extends</span> <span class="nx">Request</span>
- <span class="p">{</span>
-
- <span class="k">public</span> <span class="k">function</span> <span class="nf">getType</span><span class="p">()</span>
- <span class="p">{</span>
- <span class="k">return</span> <span class="s1">&#39;my_procedure&#39;</span><span class="p">;</span>
- <span class="p">}</span>
- <span class="p">}</span></code></pre></div>
- <p>Below is a full example for clarity:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\DependencyInjection\ServiceContainer</span><span class="p">;</span>
-
- <span class="nv">$location</span> <span class="o">=</span> <span class="s1">&#39;/path/to/your/procedure/directory&#39;</span><span class="p">;</span>
-
- <span class="nv">$serviceContainer</span> <span class="o">=</span> <span class="nx">ServiceContainer</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$procedureLoader</span> <span class="o">=</span> <span class="nv">$serviceContainer</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;procedure_loader_factory&#39;</span><span class="p">)</span>
- <span class="o">-&gt;</span><span class="na">createProcedureLoader</span><span class="p">(</span><span class="nv">$location</span><span class="p">);</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getProcedureLoader</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">addLoader</span><span class="p">(</span><span class="nv">$procedureLoader</span><span class="p">);</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">();</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setType</span><span class="p">(</span><span class="s1">&#39;my_procedure&#39;</span><span class="p">);</span>
-
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <blockquote>
- <h4 id="troubleshooting">Troubleshooting</h4>
- <p>If you find that your script isn’t running or that you are receiving a status of ‘0’ back in the response, chances are you have a syntax error in you script. It pays to turn debugging on in the client <code>$client-&gt;debug(true)</code> which will then give you access to some log information through <code>$client-&gt;getLog()</code>.</p>
- </blockquote>
- <p>See more detailed information about <a href="http://jonnnnyw.github.io/php-phantomjs/troubleshooting.html">troubleshooting</a>.</p>
- </description>
- <pubDate>Fri, 25 Jul 2014 00:00:00 +0100</pubDate>
- <link>http://jonnnnyw.github.io/php-phantomjs/advanced.html</link>
- <guid isPermaLink="true">http://jonnnnyw.github.io/php-phantomjs/advanced.html</guid>
- </item>
-
- <item>
- <title>Troubleshooting</title>
- <description><ul>
- <li><a href="#its-not-installing-anything-to-my-bin-directory">It’s not installing anything to my bin directory</a></li>
- <li><a href="#i-am-getting-a-invalidexecutableexception-when-making-a-request">I am getting a <code>InvalidExecutableException</code> when making a request</a></li>
- <li><a href="#i-am-getting-a-notwritableexception-when-making-a-request">I am getting a <code>NotWritableException</code> when making a request</a></li>
- <li><a href="#why-do-i-need-the-phantomloader-file">Why do I need the <code>phantomloader</code> file?</a></li>
- <li><a href="#why-am-i-getting-a-status-code-of-0-in-the-response">Why am I getting a status code of 0 in the response?</a></li>
- <li><a href="#its-not-saving-my-screenshots">It’s not saving my screenshots</a></li>
- <li><a href="#can-i-set-the-screenshot-size">Can I set the screenshot size?</a></li>
- <li><a href="#can-i-set-the-viewport-size">Can I set the viewport size?</a></li>
- <li><a href="#how-to-i-debug-a-request">How to I debug a request?</a></li>
- <li><a href="#i-am-getting-syntaxerror-parse-error-in-the-debug-log">I am getting <code>SyntaxError: Parse error</code> in the debug log</a></li>
- </ul>
- <hr />
- <h4 id="its-not-installing-anything-to-my-bin-directory">It’s not installing anything to my bin directory</h4>
- <p>When installing via composer, as outlined in the <a href="http://jonnnnyw.github.io/php-phantomjs/installation.html">installation guide</a>, it is recommended that you define the location of the bin folder for your project. This can be done by adding the following to your <code>composer.json</code> file:</p>
- <div class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="c1">#composer.json</span>
- <span class="p-Indicator">{</span>
- <span class="s">&quot;config&quot;</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
- <span class="s">&quot;bin-dir&quot;</span><span class="p-Indicator">:</span> <span class="s">&quot;/path/to/your/projects/bin/dir&quot;</span>
- <span class="p-Indicator">}</span>
- <span class="p-Indicator">}</span></code></pre></div>
- <p>You need to make sure that this directory exists and is writable before you install your composer depedencies.</p>
- <p>Once you have defined your bin folder in your <code>composer.json</code> file, run composer install from the root of your project:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
-
- <span class="nv">$ </span>php composer.phar install</code></pre></div>
- <p>This should install 2 files to your bin folder: <code>phantomjs</code> and <code>phantomloader</code>. If you do not have these 2 files in your bin folder then check that the folder is writable and run composer install again.</p>
- <blockquote>
- <h4 id="note">Note</h4>
- <p>If you do not define a bin directory in your <code>composer.json</code> file then the default install location will be <code>vendor/bin/</code>. If you choose to not set a bin folder path then you will need to make sure that this path is set in the client by calling <code>$client-&gt;setBinDir('vendor/bin');</code> before making a request.</p>
- </blockquote>
- <h4 id="i-am-getting-a-invalidexecutableexception-when-making-a-request">I am getting a <code>InvalidExecutableException</code> when making a request</h4>
- <p>If you have installed via composer, as outlined in the <a href="http://jonnnnyw.github.io/php-phantomjs/installation.html">installation guide</a>, then you should have 2 files installed in either the <code>bin</code> or <code>vendor/bin/</code> directory, in the root of your project. These files are called <code>phantomjs</code> and <code>phantomloader</code>. </p>
- <p>Check that these files exist and are executable by your application. If they do not exist, see <a href="#its-not-installing-anything-to-my-bin-directory">It’s not installing anything to my bin directory</a>.</p>
- <p>If the PHP PhantomJS library cannot locate either of these files then it will throw a <code>InvalidExecutableException</code>. The message in the exception should tell you which one it can’t execute. If both of these files exist and they are executable by your application, you may need to set the path to the directory that these files live in before making a request:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
-
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">setBinDir</span><span class="p">(</span><span class="s1">&#39;/path/to/bin/dir&#39;</span><span class="p">);</span></code></pre></div>
- <h4 id="i-am-getting-a-notwritableexception-when-making-a-request">I am getting a <code>NotWritableException</code> when making a request</h4>
- <p>When making a request, the PHP PhantomJS library compiles a temporary script file to your system’s tmp folder. The location of this folder is determined through the use of the <code>sys_get_temp_dir()</code> function. If this directory is not writable by your application then you will receive this exception.</p>
- <h4 id="why-do-i-need-the-phantomloader-file">Why do I need the <code>phantomloader</code> file?</h4>
- <p>A proxy loader file is used get around a quirk that PhantomJS has when it encounters a syntax error in a script file. By default, if PhantomJS encounters a syntax error when loading a script file it will not exit execution. This means that PHP PhantomJS will continue to wait for a response from PhantomJS until PHP reaches its script execution timeout period. This also means you won’t get any debug information informing you that the PhantomJS script has a syntax error.</p>
- <p>To get around this, script files are loaded through a loader script. This handles the event of a syntax error and ensures that PhantomJS exits when an error is encountered.</p>
- <p>The <code>phantomloader</code> file is required in order for the PHP PhantomJS library to run so please make sure that it was installed to your bin folder and is readable by your application.</p>
- <p>Another reason for getting this exception is when you are trying to save screenshots. See <a href="#its-not-saving-my-screenshots">It’s not saving my screenshots</a>.</p>
- <h4 id="why-am-i-getting-a-status-code-of-0-in-the-response">Why am I getting a status code of 0 in the response?</h4>
- <p>A status code of 0 in the response object generally means the request did not complete successfully. This could mean that the URL you are requesting did not return a response or that something happened when making the request that did not raise an error in the PHP PhantomJS library.</p>
- <p>Becuase and exception was not thrown, chances are the issue is with PhantomJS itself or at the endpoint you are calling.</p>
- <p>One possible reason for this is that your request has timed out before a response was returned from the endpoint that you are requesting. Depending on what you are requesting, some websites seem to take a while to return a response. An example of this is <a href="https://myspace.com/">myspace.com</a> which, at the time of writing this, takes a considerable amount of time resolve through PhantomJS.</p>
- <p>To work around this you can try increasing the timeout period in the PHP PhantomJS client:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$timeout</span> <span class="o">=</span> <span class="mi">20000</span><span class="p">;</span> <span class="c1">// 20 seconds</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setTimeout</span><span class="p">(</span><span class="nv">$timeout</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>If you are still having a problem then you should enable debugging, before you make the request, and check the debug log. This contains a dump of information from PhantomJS which could help to track down why you are not getting a response.</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">debug</span><span class="p">(</span><span class="k">true</span><span class="p">);</span> <span class="c1">// Set debug flag</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span>
-
- <span class="k">echo</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getLog</span><span class="p">();</span> <span class="c1">// Output log</span></code></pre></div>
- <p>You can also try running a test script through your PhantomJS executable, from the command line, to see if you get a valid response back. Save the following script somewhere:</p>
- <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">//test-script.js</span>
- <span class="kd">var</span> <span class="nx">page</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;webpage&#39;</span><span class="p">).</span><span class="nx">create</span><span class="p">(),</span>
- <span class="nx">url</span> <span class="o">=</span> <span class="s1">&#39;YOUR REQUEST URL&#39;</span><span class="p">,</span> <span class="c1">// Change this to the URL you want to request</span>
- <span class="nx">response</span><span class="p">;</span>
- <span class="nx">page</span><span class="p">.</span><span class="nx">onResourceReceived</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">{</span>
- <span class="nx">response</span> <span class="o">=</span> <span class="nx">r</span><span class="p">;</span>
- <span class="p">};</span>
- <span class="nx">phantom</span><span class="p">.</span><span class="nx">onError</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">msg</span><span class="p">,</span> <span class="nx">trace</span><span class="p">)</span> <span class="p">{</span>
-
- <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">msg</span><span class="p">);</span>
- <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">trace</span><span class="p">);</span>
- <span class="nx">phantom</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
- <span class="p">};</span>
-
- <span class="nx">page</span><span class="p">.</span><span class="nx">open</span> <span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">status</span><span class="p">)</span> <span class="p">{</span>
-
- <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">status</span><span class="p">);</span>
- <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">response</span><span class="p">));</span>
- <span class="nx">phantom</span><span class="p">.</span><span class="nx">exit</span><span class="p">();</span>
- <span class="p">});</span></code></pre></div>
- <p>And then, assuming you have saved the script above to <code>test-script.js</code> in the root of your project and your PhantomJS executable is located at <code>bin/phantomjs</code>, run the following:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
- <span class="nv">$ </span>bin/phantomjs ./test-script.js</code></pre></div>
- <p>You should see an output of the response from PhantomJS:</p>
- <div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#bash</span>
- success
- <span class="o">{</span><span class="s2">&quot;contentType&quot;</span>:<span class="s2">&quot;text/javascript; charset=UTF-8&quot;</span>, <span class="s2">&quot;headers&quot;</span>: ...</code></pre></div>
- <p>If you don’t see <code>success</code> followed by a JSON encoded response object then there is something the with the URL you are requesting or your PhantomJS executable. Try reinstalling PhantomJS. If you see <code>fail</code> instead of <code>success</code>, chances are the URL you are requesting is invalid or not resolving.</p>
- <h4 id="its-not-saving-my-screenshots">It’s not saving my screenshots</h4>
- <p>When making a capture request you need to make sure that you are setting the file location that you want the screenshot saved to, including the filename:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$file</span> <span class="o">=</span> <span class="s1">&#39;/path/to/save/your/screen/capture/file.jpg&#39;</span><span class="p">;</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureFile</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span> <span class="c1">// Set the capture file</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <p>The file itself does not need to exist but the parent directory must exist and be writable by your application. Check that your application has permissions to write files to the directory you are setting for your screen captures.</p>
- <h4 id="can-i-set-the-screenshot-size">Can I set the screenshot size?</h4>
- <p>Yes, you can set the width and height of your capture along with the x and y coordinates of where the capture should start from:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createCaptureRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$file</span> <span class="o">=</span> <span class="s1">&#39;/path/to/save/your/screen/capture/file.jpg&#39;</span><span class="p">;</span>
-
- <span class="nv">$top</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
- <span class="nv">$left</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
- <span class="nv">$width</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span>
- <span class="nv">$height</span> <span class="o">=</span> <span class="mi">400</span><span class="p">;</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureFile</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setCaptureDimensions</span><span class="p">(</span><span class="nv">$width</span><span class="p">,</span> <span class="nv">$height</span><span class="p">,</span> <span class="nv">$top</span><span class="p">,</span> <span class="nv">$left</span><span class="p">);</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h4 id="can-i-set-the-viewport-size">Can I set the viewport size?</h4>
- <p>Yes, you can set the viewport dimensions on both regular and capture requests:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$width</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span>
- <span class="nv">$height</span> <span class="o">=</span> <span class="mi">400</span><span class="p">;</span>
-
- <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setViewportSize</span><span class="p">(</span><span class="nv">$width</span><span class="p">,</span> <span class="nv">$height</span><span class="p">);</span> <span class="c1">// Set viewport size</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span></code></pre></div>
- <h4 id="how-to-i-debug-a-request">How to I debug a request?</h4>
- <p>By setting the debug flag to <code>true</code> on the client, you can get a dump of information output from PhantomJS along with some info events added by the PHP PhantomJS library:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">debug</span><span class="p">(</span><span class="k">true</span><span class="p">);</span> <span class="c1">// Set debug flag</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span>
-
- <span class="k">echo</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getLog</span><span class="p">();</span> <span class="c1">// Output log</span></code></pre></div>
- <p>You can also get any javacript console errors along with a stack trace from the URL you are calling, in the response object:</p>
- <div class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
- <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
-
- <span class="nv">$client</span> <span class="o">=</span> <span class="nx">Client</span><span class="o">::</span><span class="na">getInstance</span><span class="p">();</span>
-
- <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createRequest</span><span class="p">(</span><span class="s1">&#39;http://google.com&#39;</span><span class="p">);</span>
- <span class="nv">$response</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">getMessageFactory</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">createResponse</span><span class="p">();</span>
-
- <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="nv">$response</span><span class="p">);</span>
-
- <span class="nb">var_dump</span><span class="p">(</span><span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getConsole</span><span class="p">());</span> <span class="c1">// Outputs array of console errors and stack trace</span></code></pre></div>
- <h4 id="i-am-getting-syntaxerror-parse-error-in-the-debug-log">I am getting <code>SyntaxError: Parse error</code> in the debug log</h4>
- <p>You will only get this error if the script file that is being run by PhantomJS has a syntax error. If you are writing your own <a href="http://jonnnnyw.github.io/php-phantomjs/advanced.html#custom-phantomjs-scripts">custom scripts</a> then try setting the <a href="#how-to-i-debug-a-request">debug flag</a> which <em>should</em> print some more detailed information in the debug log. Also check that you aren’t setting any parameters to <code>null</code> in your request object as this could be causing a javascript error due to javascript variables being set to nothing e.g. <code>var width = ,</code>.</p>
- </description>
- <pubDate>Wed, 23 Jul 2014 00:00:00 +0100</pubDate>
- <link>http://jonnnnyw.github.io/php-phantomjs/troubleshooting.html</link>
- <guid isPermaLink="true">http://jonnnnyw.github.io/php-phantomjs/troubleshooting.html</guid>
- </item>
-
- </channel>
- </rss>
|