index.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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="description" content="php-phantomjs : Execute PhantomJS commands through PHP" />
  7. <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
  8. <title>php-phantomjs</title>
  9. </head>
  10. <body>
  11. <!-- HEADER -->
  12. <div id="header_wrap" class="outer">
  13. <header class="inner">
  14. <a id="forkme_banner" href="https://github.com/jonnnnyw/php-phantomjs">View on GitHub</a>
  15. <h1 id="project_title">php-phantomjs</h1>
  16. <h2 id="project_tagline">Execute PhantomJS commands through PHP</h2>
  17. <section id="downloads">
  18. <a class="zip_download_link" href="https://github.com/jonnnnyw/php-phantomjs/zipball/master">Download this project as a .zip file</a>
  19. <a class="tar_download_link" href="https://github.com/jonnnnyw/php-phantomjs/tarball/master">Download this project as a tar.gz file</a>
  20. </section>
  21. </header>
  22. </div>
  23. <!-- MAIN CONTENT -->
  24. <div id="main_content_wrap" class="outer">
  25. <section id="main_content" class="inner">
  26. <h1>
  27. <a name="php-phantomjs" class="anchor" href="#php-phantomjs"><span class="octicon octicon-link"></span></a>PHP PhantomJS</h1>
  28. <p>PHP PhantomJS is a simple PHP library to load pages through the PhantomJS
  29. headless browser and return the page response. It is handy for testing
  30. websites that demand javascript support and also supports screen captures.</p>
  31. <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>
  32. <h2>
  33. <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>
  34. <ul>
  35. <li>Introduction</li>
  36. <li>Examples</li>
  37. <li>Changelog</li>
  38. <li>Troubleshooting</li>
  39. </ul><h2>
  40. <a name="10-introduction" class="anchor" href="#10-introduction"><span class="octicon octicon-link"></span></a>1.0 Introduction</h2>
  41. <p>This library provides the ability to load pages through the PhantomJS
  42. headless browser and return the page response. It also lets you screen
  43. capture pages and save the captures to disk. It is designed to meet a
  44. simple objective and does not offer a PHP API to the full suite of
  45. PhantomJS functionality.</p>
  46. <p>The PhantomJS executable comes bundled with the library. If installed
  47. via composer, the file will be symlinked in your bin folder.</p>
  48. <p>If you are looking for a PHP library to run external javascript files
  49. through PhantomJS then this is not for you. Check out <a href="https://github.com/Dachande663/PHP-PhantomJS">PhantomJS runner</a>.</p>
  50. <h2>
  51. <a name="20-examples" class="anchor" href="#20-examples"><span class="octicon octicon-link"></span></a>2.0 Examples</h2>
  52. <p>Request a URL and output the reponse:</p>
  53. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  54. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  55. <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>
  56. <span class="sd">/** </span>
  57. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  58. <span class="sd"> **/</span>
  59. <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>
  60. <span class="sd">/** </span>
  61. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  62. <span class="sd"> **/</span>
  63. <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>
  64. <span class="c1">// Send the request</span>
  65. <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>
  66. <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>
  67. <span class="c1">// Dump the requested page content</span>
  68. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
  69. <span class="p">}</span>
  70. </pre></div>
  71. <p>Request a URL with delay and output the reponse:</p>
  72. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  73. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  74. <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>
  75. <span class="sd">/** </span>
  76. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  77. <span class="sd"> **/</span>
  78. <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>
  79. <span class="sd">/** </span>
  80. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  81. <span class="sd"> **/</span>
  82. <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>
  83. <span class="c1">// Send the request with delay in miliseconds</span>
  84. <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>
  85. <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>
  86. <span class="c1">// Dump the requested page content</span>
  87. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getContent</span><span class="p">();</span>
  88. <span class="p">}</span>
  89. </pre></div>
  90. <p>Request a URL, save a screen capture to provided location and return the response:</p>
  91. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  92. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  93. <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>
  94. <span class="sd">/** </span>
  95. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  96. <span class="sd"> **/</span>
  97. <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>
  98. <span class="sd">/** </span>
  99. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  100. <span class="sd"> **/</span>
  101. <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>
  102. <span class="c1">// Send the request</span>
  103. <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>
  104. </pre></div>
  105. <p>Send post request with data:</p>
  106. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  107. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  108. <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>
  109. <span class="sd">/** </span>
  110. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  111. <span class="sd"> **/</span>
  112. <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>
  113. <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>
  114. <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>
  115. <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>
  116. <span class="s1">'name'</span> <span class="o">=&gt;</span> <span class="s1">'Test'</span><span class="p">,</span>
  117. <span class="s1">'email'</span> <span class="o">=&gt;</span> <span class="s1">'test@jonnyw.me'</span>
  118. <span class="p">));</span>
  119. <span class="sd">/** </span>
  120. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  121. <span class="sd"> **/</span>
  122. <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>
  123. <span class="c1">// Send the request</span>
  124. <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>
  125. </pre></div>
  126. <p>Set a request header:</p>
  127. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  128. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  129. <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>
  130. <span class="sd">/** </span>
  131. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  132. <span class="sd"> **/</span>
  133. <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>
  134. <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>
  135. </pre></div>
  136. <p>Get a response header:</p>
  137. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  138. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  139. <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>
  140. <span class="sd">/** </span>
  141. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  142. <span class="sd"> **/</span>
  143. <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>
  144. <span class="sd">/** </span>
  145. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  146. <span class="sd"> **/</span>
  147. <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>
  148. <span class="c1">// Send the request</span>
  149. <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>
  150. <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>
  151. </pre></div>
  152. <p>Handle response redirect:</p>
  153. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  154. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  155. <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>
  156. <span class="sd">/** </span>
  157. <span class="sd"> * @see JonnyW\PhantomJs\Message\Request </span>
  158. <span class="sd"> **/</span>
  159. <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>
  160. <span class="sd">/** </span>
  161. <span class="sd"> * @see JonnyW\PhantomJs\Message\Response </span>
  162. <span class="sd"> **/</span>
  163. <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>
  164. <span class="c1">// Send the request</span>
  165. <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>
  166. <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>
  167. <span class="k">echo</span> <span class="nv">$response</span><span class="o">-&gt;</span><span class="na">getRedirectUrl</span><span class="p">();</span>
  168. <span class="p">}</span>
  169. </pre></div>
  170. <p>Define a new path to the PhantomJS executable:</p>
  171. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  172. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  173. <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>
  174. <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>
  175. </pre></div>
  176. <p>Set timeout for the request (defaults to 5 seconds):</p>
  177. <div class="highlight highlight-php"><pre><span class="o">&lt;?</span><span class="nx">php</span>
  178. <span class="k">use</span> <span class="nx">JonnyW\PhantomJs\Client</span><span class="p">;</span>
  179. <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>
  180. <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>
  181. </pre></div>
  182. <h2>
  183. <a name="30-changelog" class="anchor" href="#30-changelog"><span class="octicon octicon-link"></span></a>3.0 Changelog</h2>
  184. <h3>
  185. <a name="v200" class="anchor" href="#v200"><span class="octicon octicon-link"></span></a>V2.0.0</h3>
  186. <p>Version 2.0.0 changes the way requests are made. Requests now require you
  187. to inject a request and response instance into the send method. The examples
  188. above illustrate how to make requests in version 2.0.0 and will not work
  189. for older versions.</p>
  190. <ul>
  191. <li>Requests now require you to inject a request and response instance when sending.</li>
  192. <li>Added message factory that can also be injected into client when instantiated.</li>
  193. <li>Custom headers can be set in requests.</li>
  194. <li>Request method can be set. Supports: OPTIONS, GET, HEAD, POST, PUT, DELETE, PATCH.</li>
  195. <li>Request data can be set. Useful when making post requests.</li>
  196. </ul><h2>
  197. <a name="40-troubleshooting" class="anchor" href="#40-troubleshooting"><span class="octicon octicon-link"></span></a>4.0 Troubleshooting</h2>
  198. <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>
  199. <p>Look at the response class (JonnyW\PhantomJs\Response) to see what data you have access to.</p>
  200. <p>An explanation of the errors that are thrown by the client:</p>
  201. <h3>
  202. <a name="commandfailedexception" class="anchor" href="#commandfailedexception"><span class="octicon octicon-link"></span></a>CommandFailedException</h3>
  203. <p>The command sent to the PhantomJS executable failed. This should be very rare and is probably my fault if this happens (sorry).</p>
  204. <h3>
  205. <a name="invalidurlexception" class="anchor" href="#invalidurlexception"><span class="octicon octicon-link"></span></a>InvalidUrlException</h3>
  206. <p>The URL you are providing is an invalid format. It is very loose verification.</p>
  207. <h3>
  208. <a name="invalidmethodexception" class="anchor" href="#invalidmethodexception"><span class="octicon octicon-link"></span></a>InvalidMethodException</h3>
  209. <p>The request method you are providing is invalid.</p>
  210. <h3>
  211. <a name="nophantomjsexception" class="anchor" href="#nophantomjsexception"><span class="octicon octicon-link"></span></a>NoPhantomJsException</h3>
  212. <p>The PhantomJS executable cannot be found or it is not executable. Check the path and permissions.</p>
  213. <h3>
  214. <a name="notwriteableexception" class="anchor" href="#notwriteableexception"><span class="octicon octicon-link"></span></a>NotWriteableException</h3>
  215. <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>
  216. </section>
  217. </div>
  218. <!-- FOOTER -->
  219. <div id="footer_wrap" class="outer">
  220. <footer class="inner">
  221. <p class="copyright">php-phantomjs maintained by <a href="https://github.com/jonnnnyw">jonnnnyw</a></p>
  222. <p>Published with <a href="http://pages.github.com">GitHub Pages</a></p>
  223. </footer>
  224. </div>
  225. </body>
  226. </html>