index.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset='utf-8'>
  5. <meta http-equiv="X-UA-Compatible" content="chrome=1">
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  7. <link href='https://fonts.googleapis.com/css?family=Architects+Daughter' rel='stylesheet' type='text/css'>
  8. <link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen" />
  9. <link rel="stylesheet" type="text/css" href="stylesheets/pygment_trac.css" media="screen" />
  10. <link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print" />
  11. <!--[if lt IE 9]>
  12. <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  13. <![endif]-->
  14. <title>php-phantomjs by jonnnnyw</title>
  15. </head>
  16. <body>
  17. <header>
  18. <div class="inner">
  19. <h1>php-phantomjs</h1>
  20. <h2>Execute PhantomJS commands through PHP</h2>
  21. <a href="https://github.com/jonnnnyw/php-phantomjs" class="button"><small>View project on</small>GitHub</a>
  22. </div>
  23. </header>
  24. <div id="content-wrapper">
  25. <div class="inner clearfix">
  26. <section id="main-content">
  27. <h1>
  28. <a name="php-phantomjs" class="anchor" href="#php-phantomjs"><span class="octicon octicon-link"></span></a>PHP PhantomJS</h1>
  29. <p>PHP PhantomJS is a simple PHP library to load pages through the PhantomJS
  30. headless browser and return the page response. It is handy for testing
  31. websites that demand javascript support and also supports screen captures.</p>
  32. <p><a href="https://packagist.org/packages/jonnyw/php-phantomjs"><img src="https://poser.pugx.org/jonnyw/php-phantomjs/downloads.png" alt="Total Downloads"></a> <a href="https://packagist.org/packages/jonnyw/php-phantomjs"><img src="https://poser.pugx.org/jonnyw/php-phantomjs/v/stable.png" alt="Latest Stable Version"></a> <a href="https://travis-ci.org/jonnnnyw/php-phantomjs"><img src="https://travis-ci.org/jonnnnyw/php-phantomjs.png?branch=master" alt="Build Status"></a> <a href="https://scrutinizer-ci.com/g/jonnnnyw/php-phantomjs/"><img src="https://scrutinizer-ci.com/g/jonnnnyw/php-phantomjs/badges/quality-score.png?s=631d32fa1fbb9300eb84b9b52702c7ffeac046a1" alt="Scrutinizer Quality Score"></a> <a href="https://scrutinizer-ci.com/g/jonnnnyw/php-phantomjs/"><img src="https://scrutinizer-ci.com/g/jonnnnyw/php-phantomjs/badges/coverage.png?s=893b5997da45448e32983b8568a39630b0b2d91b" alt="Code Coverage"></a></p>
  33. <h2>
  34. <a name="00-table-of-contents" class="anchor" href="#00-table-of-contents"><span class="octicon octicon-link"></span></a>0.0 Table of Contents</h2>
  35. <ul>
  36. <li>Introduction</li>
  37. <li>Examples</li>
  38. <li>Changelog</li>
  39. <li>Troubleshooting</li>
  40. </ul><h2>
  41. <a name="10-introduction" class="anchor" href="#10-introduction"><span class="octicon octicon-link"></span></a>1.0 Introduction</h2>
  42. <p>This library provides the ability to load pages through the PhantomJS
  43. headless browser and return the page response. It also lets you screen
  44. capture pages and save the captures to disk. It is designed to meet a
  45. simple objective and does not offer a PHP API to the full suite of
  46. PhantomJS functionality.</p>
  47. <p>The PhantomJS executable comes bundled with the library. If installed
  48. via composer, the file will be symlinked in your bin folder.</p>
  49. <p>If you are looking for a PHP library to run external javascript files
  50. through PhantomJS then this is not for you. Check out <a href="https://github.com/Dachande663/PHP-PhantomJS">PhantomJS runner</a>.</p>
  51. <h2>
  52. <a name="20-examples" class="anchor" href="#20-examples"><span class="octicon octicon-link"></span></a>2.0 Examples</h2>
  53. <p>Request a URL and output the reponse:</p>
  54. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  55. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  56. <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>
  57. <span class="sd">/** </span>
  58. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  59. <span class="sd"> **/</span>
  60. <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">'GET'</span><span class="p">,</span> <span class="s1">'http://google.com'</span><span class="p">);</span>
  61. <span class="sd">/** </span>
  62. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  63. <span class="sd"> **/</span>
  64. <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>
  65. <span class="c1">// Send the request</span>
  66. <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>
  67. <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>
  68. <span class="c1">// Dump the requested page content</span>
  69. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
  70. <span class="p">}</span>
  71. </pre></div>
  72. <p>Request a URL with delay and output the reponse:</p>
  73. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  74. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  75. <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>
  76. <span class="sd">/** </span>
  77. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  78. <span class="sd"> **/</span>
  79. <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">'GET'</span><span class="p">,</span> <span class="s1">'http://google.com'</span><span class="p">);</span>
  80. <span class="sd">/** </span>
  81. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  82. <span class="sd"> **/</span>
  83. <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>
  84. <span class="c1">// Send the request with delay in miliseconds</span>
  85. <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">open</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="nv">$delay</span> <span class="o">=</span> <span class="mi">5000</span><span class="p">);</span>
  86. <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>
  87. <span class="c1">// Dump the requested page content</span>
  88. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
  89. <span class="p">}</span>
  90. </pre></div>
  91. <p>Request a URL, save a screen capture to provided location and return the response:</p>
  92. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  93. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  94. <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>
  95. <span class="sd">/** </span>
  96. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  97. <span class="sd"> **/</span>
  98. <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">'GET'</span><span class="p">,</span> <span class="s1">'http://google.com'</span><span class="p">);</span>
  99. <span class="sd">/** </span>
  100. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  101. <span class="sd"> **/</span>
  102. <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>
  103. <span class="c1">// Send the request</span>
  104. <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="s1">'/path/to/save/screen/capture.png'</span><span class="p">);</span>
  105. </pre></div>
  106. <p>Send post request with data:</p>
  107. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  108. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  109. <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>
  110. <span class="sd">/** </span>
  111. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  112. <span class="sd"> **/</span>
  113. <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>
  114. <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setMethod</span><span class="p">(</span><span class="s1">'POST'</span><span class="p">);</span>
  115. <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setUrl</span><span class="p">(</span><span class="s1">'http://google.com'</span><span class="p">);</span>
  116. <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">setRequestData</span><span class="p">(</span><span class="k">array</span><span class="p">(</span>
  117. <span class="s1">'name'</span> <span class="o">=&gt;</span> <span class="s1">'Test'</span><span class="p">,</span>
  118. <span class="s1">'email'</span> <span class="o">=&gt;</span> <span class="s1">'test@jonnyw.me'</span>
  119. <span class="p">));</span>
  120. <span class="sd">/** </span>
  121. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  122. <span class="sd"> **/</span>
  123. <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>
  124. <span class="c1">// Send the request</span>
  125. <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>
  126. </pre></div>
  127. <p>Set a request header:</p>
  128. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  129. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  130. <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>
  131. <span class="sd">/** </span>
  132. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  133. <span class="sd"> **/</span>
  134. <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>
  135. <span class="nv">$request</span><span class="o">-&gt;</span><span class="na">addHeader</span><span class="p">(</span><span class="s1">'User-Agent'</span><span class="p">,</span> <span class="s1">'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.2 Safari/534.34'</span><span class="p">);</span>
  136. </pre></div>
  137. <p>Get a response header:</p>
  138. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  139. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  140. <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>
  141. <span class="sd">/** </span>
  142. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  143. <span class="sd"> **/</span>
  144. <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">'GET'</span><span class="p">,</span> <span class="s1">'http://google.com'</span><span class="p">);</span>
  145. <span class="sd">/** </span>
  146. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  147. <span class="sd"> **/</span>
  148. <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>
  149. <span class="c1">// Send the request</span>
  150. <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="s1">'/path/to/save/screen/capture.png'</span><span class="p">);</span>
  151. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getHeader</span><span class="p">(</span><span class="s1">'Cache-Control'</span><span class="p">);</span>
  152. </pre></div>
  153. <p>Handle response redirect:</p>
  154. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  155. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  156. <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>
  157. <span class="sd">/** </span>
  158. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  159. <span class="sd"> **/</span>
  160. <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">'GET'</span><span class="p">,</span> <span class="s1">'http://google.com'</span><span class="p">);</span>
  161. <span class="sd">/** </span>
  162. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  163. <span class="sd"> **/</span>
  164. <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>
  165. <span class="c1">// Send the request</span>
  166. <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>
  167. <span class="k">if</span><span class="p">(</span><span class="nv">$response</span><span class="o">-&gt;</span><span class="na">isRedirect</span><span class="p">())</span> <span class="p">{</span>
  168. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getRedirectUrl</span><span class="p">();</span>
  169. <span class="p">}</span>
  170. </pre></div>
  171. <p>Define a new path to the PhantomJS executable:</p>
  172. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  173. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  174. <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>
  175. <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">setPhantomJs</span><span class="p">(</span><span class="s1">'/path/to/phantomjs'</span><span class="p">);</span>
  176. </pre></div>
  177. <p>Set timeout for the request (defaults to 5 seconds):</p>
  178. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  179. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  180. <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>
  181. <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">setTimeout</span><span class="p">(</span><span class="mi">10000</span><span class="p">);</span> <span class="c1">// In milleseconds</span>
  182. </pre></div>
  183. <h2>
  184. <a name="30-changelog" class="anchor" href="#30-changelog"><span class="octicon octicon-link"></span></a>3.0 Changelog</h2>
  185. <h3>
  186. <a name="v200" class="anchor" href="#v200"><span class="octicon octicon-link"></span></a>V2.0.0</h3>
  187. <p>Version 2.0.0 changes the way requests are made. Requests now require you
  188. to inject a request and response instance into the send method. The examples
  189. above illustrate how to make requests in version 2.0.0 and will not work
  190. for older versions.</p>
  191. <ul>
  192. <li>Requests now require you to inject a request and response instance when sending.</li>
  193. <li>Added message factory that can also be injected into client when instantiated.</li>
  194. <li>Custom headers can be set in requests.</li>
  195. <li>Request method can be set. Supports: OPTIONS, GET, HEAD, POST, PUT, DELETE, PATCH.</li>
  196. <li>Request data can be set. Useful when making post requests.</li>
  197. </ul><h2>
  198. <a name="40-troubleshooting" class="anchor" href="#40-troubleshooting"><span class="octicon octicon-link"></span></a>4.0 Troubleshooting</h2>
  199. <p>If you are using V1.0.0 then the examples above won't work for you. It is reccommend that you upgrade to the latest version.</p>
  200. <p>Look at the response class (JonnyW\PhantomJs\Response) to see what data you have access to.</p>
  201. <p>An explanation of the errors that are thrown by the client:</p>
  202. <h3>
  203. <a name="commandfailedexception" class="anchor" href="#commandfailedexception"><span class="octicon octicon-link"></span></a>CommandFailedException</h3>
  204. <p>The command sent to the PhantomJS executable failed. This should be very rare and is probably my fault if this happens (sorry).</p>
  205. <h3>
  206. <a name="invalidurlexception" class="anchor" href="#invalidurlexception"><span class="octicon octicon-link"></span></a>InvalidUrlException</h3>
  207. <p>The URL you are providing is an invalid format. It is very loose verification.</p>
  208. <h3>
  209. <a name="invalidmethodexception" class="anchor" href="#invalidmethodexception"><span class="octicon octicon-link"></span></a>InvalidMethodException</h3>
  210. <p>The request method you are providing is invalid.</p>
  211. <h3>
  212. <a name="nophantomjsexception" class="anchor" href="#nophantomjsexception"><span class="octicon octicon-link"></span></a>NoPhantomJsException</h3>
  213. <p>The PhantomJS executable cannot be found or it is not executable. Check the path and permissions.</p>
  214. <h3>
  215. <a name="notwriteableexception" class="anchor" href="#notwriteableexception"><span class="octicon octicon-link"></span></a>NotWriteableException</h3>
  216. <p>The screen capture location you provided or your /tmp folder are not writeable. The /tmp folder is used to temporarily write the scripts that PhantomJS executes. They are deleted after execution or on failure.</p>
  217. </section>
  218. <aside id="sidebar">
  219. <a href="https://github.com/jonnnnyw/php-phantomjs/zipball/master" class="button">
  220. <small>Download</small>
  221. .zip file
  222. </a>
  223. <a href="https://github.com/jonnnnyw/php-phantomjs/tarball/master" class="button">
  224. <small>Download</small>
  225. .tar.gz file
  226. </a>
  227. <p class="repo-owner"><a href="https://github.com/jonnnnyw/php-phantomjs"></a> is maintained by <a href="https://github.com/jonnnnyw">jonnnnyw</a>.</p>
  228. <p>This page was generated by <a href="https://pages.github.com">GitHub Pages</a> using the Architect theme by <a href="https://twitter.com/jasonlong">Jason Long</a>.</p>
  229. </aside>
  230. </div>
  231. </div>
  232. </body>
  233. </html>