PHP PhantomJs中文文檔(翻譯)

介紹

PHP PhantomJS 是一個靈活的 PHP 庫加載頁面經過 PhantomJS 無頭瀏覽器並將返回頁面響應。這是方便於須要JavaScript的支持,同時還支持截屏測試網站。
功能列表
經過 PhantomJS 無頭瀏覽器加載網頁
查看詳細的響應數據包括頁面內容、 標題、 狀態代碼等。
處理重定向
查看 javascript 控制檯錯誤
查看詳細的 PhantomJS 的調試信息
將屏幕截圖保存到本地磁盤
設置視區大小
定義屏幕截圖的 x、 y、 寬度和高度參數
指定的時間的呈現延遲頁
經過命令行選項執行 PhantomJS
輕鬆地構建並運行 自定義的PhantomJS 腳本

先決條件

PHP PhantomJS 須要 PHP 5.3.0 或更高版本運行。

安裝

建議你使用Composer安裝 PHP PhantomJS。首先,添加如下內容到你項目的composer.json文件:

#composer.json
 
    "scripts": {
        "post-install-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ],
        "post-update-cmd": [
            "PhantomInstaller\\Installer::installPhantomJS"
        ]
    }
這將確保最新的PhantomJS版本安裝在您的系統的 bin 文件夾。若是您尚未在你 composer.json 中定義你 bin 文件夾,添加路徑:
 
#composer.json
    
    "config": {
        "bin-dir": "bin"
    }

最後,在您的項目的根目錄安裝 PHP PhantomJS:

#bash
    
    $ composer require "jonnyw/php-phantomjs:3.*"
若是你想要使用另外一種安裝方法,或想要查看更詳細的安裝說明,請參閱安裝文檔。


基本用法
如下內容說明了如何建立一個基本的 GET 請求和輸出頁面內容:
<?php
 
    use JonnyW\PhantomJs\Client;
 
    $client = Client::getInstance();
 
    /**
     * @see JonnyW\PhantomJs\Message\Request
     **/
    $request = $client->getMessageFactory()->createRequest('http://google.com', 'GET');
 
    /**
     * @see JonnyW\PhantomJs\Message\Response
     **/
    $response = $client->getMessageFactory()->createResponse();
 
    // Send the request
    $client->send($request, $response);
 
    if($response->getStatus() === 200) {
 
        // Dump the requested page content
        echo $response->getContent();
    }

而且若是你想要將屏幕截圖保存到本地磁盤:
<?php
 
    use JonnyW\PhantomJs\Client;
 
    $client = Client::getInstance();
 
    /**
     * @see JonnyW\PhantomJs\Message\CaptureRequest
     **/
    $request = $client->getMessageFactory()->createCaptureRequest('http://google.com', 'GET');
    $request->setCaptureFile('/path/to/save/capture/file.jpg');
 
    /**
     * @see JonnyW\PhantomJs\Message\Response
     **/
    $response = $client->getMessageFactory()->createResponse();
 
    // Send the request
    $client->send($request, $response);
有關更詳細的示例,請參見使用章節,或者建立本身的自定義腳本檢驗高級的文檔。


安裝
•    前提條件
•    經過Composer安裝
•    自定義安裝
•    從壓縮文件安裝
前提組件

PHP PhantomJS 須要 PHP 5.3.0 或更高版本運行。
經過Composer安裝

在你的項目中安裝Composer:

#bash
 
$ curl-s http://getcomposer.org/installer |php
在您的項目的根目錄中建立一個 composer.json 文件:
 
#composer.json
 
{
"require": {
"jonnyw/php-phantomjs":"3"
},
"config": {
"bin-dir":"bin"
},
"scripts": {
"post-install-cmd": [
""PhantomInstaller\\Installer::installPhantomJS
],
"post-update-cmd": [
""PhantomInstaller\\Installer::installPhantomJS
]
}
}
在你的composer.json文件中有「script"部分是很是重要的,由於他將爲你的系統項目安裝最新版本的PhantomJS到你的bin文件夾中 。建議您建立一個 bin 文件夾在您的項目的根路徑,由於將在PHP   PhantomJS庫將在那裏尋找PhantomJS可執行文件。若是您想在一個自定義的路徑使用PhantomJS 可執行文件,請參閱自定義安裝部分。

最後,爲你的項目安裝composer依賴:

#bash
$php composer.phar install
自定義安裝

若是您但願爲PhantomJS自定義安裝路徑,你只須要告訴客戶端在哪裏能夠找到可執行文件:
<?php
 
use JonnyW\PhantomJs\Client;
 
$client = Client::getInstance();
 
$client->setPhantomJs('/path/to/phantomjs');
重要
PHP PhantomJS 庫還須要一個經過庫捆綁和被安裝在你的composer.json文件中定義的bin文件夾下的phantomloader 文件。若是您要設置自定義路徑到 PhantomJS 可執行文件,您須要確保能夠在它被安裝到 bin 文件夾中找到 phantomloader 文件。

若是您想要使用一個自定義 bin 文件夾,請參閱下文。

若是您想composer安裝依賴全部可執行文件到自定義bin位置,在您的項目 composer.json 文件中設置的 bin 目錄位置:
#composer.json
    {"config": {"bin-dir": "/path/to/your/projects/bin/dir"}}
您將須要確保該目錄存在而且運行composer安裝以前是經過composer可寫。

一旦您已經更新了你的 bin路徑,運行composer安裝 PhantomJS:

#bash    $ php composer.phar install
這將爲您的系統和所需的phantomloade文件正確安裝PhantomJS可執行文件到你的composer.json 文件定義的bin路徑。

如今你須要告訴客戶端在哪裏能夠找到你的 bin 文件夾:
 
 
<?phpuse
 
JonnyW\PhantomJs\Client;
$client = Client::getInstance();
$client->setBinDir('/path/to/bin/dir');
從壓縮文件安裝

PHP PhantomJS 庫包含幾個依賴才能發揮做用,因此它建議你經過composer安裝它,這將會爲你處理你的依賴。若是您但願從 tar 文件的版本安裝,那麼您將須要手動安裝這些依賴項。

PHP PhantomJS庫目前須要如下依賴:
•    Symfony Config Component ~2.5
•    Symfony YAML Component ~2.5
•    Symfony Dependency Injection Component ~2.5
•    Symfony Filesystem Component ~2.5
•    Twig templating Component ~1.16
•    PhantomJS ~1.9
請確保組件的在你包括路徑和 PhantomJS 可執行文件安裝到您的項目的 bin 文件夾,如自定義安裝部分所述。

用法
此頁面包含如何使用 PHP PhantomJS 庫的一些常見的例子。
•    基本要求
•    POST 請求
•    其餘請求方法
•    響應數據
•    屏幕截圖
•    設置視區大小
•    自定義超時
•    延遲頁面渲染器
•    自定義運行選項
對於更高級的定製或加載本身的PhantomJS腳本,請參閱高級的文檔。
基本要求
一個基本的 GET 請求:
<?php
    
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest();
    $response = $client->getMessageFactory()->createResponse();
    
    $request->setMethod('GET');
    $request->setUrl('http://google.com');
    
    $client->send($request, $response);
    
    if($response->getStatus() === 200) {
        echo $response->getContent();
    }
您也能夠經過消息工廠建立一個新的請求實例時設定的URL,請求方法和超時時間:
<?php
     
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com', 'GET', 5000);
    $response = $client->getMessageFactory()->createResponse();
        
    $client->send($request, $response);
    
    if($response->getStatus() === 200) {
        echo $response->getContent();
    }
POST 請求
一個基本的 POST 請求:
<?php
    
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest();
    $response = $client->getMessageFactory()->createResponse();
    
    $data = array(
        'param1' => 'Param 1',
        'param2' => 'Param 2'
    );
    
    $request->setMethod('POST');
    $request->setUrl('http://google.com');
    $request->setRequestData($data); // Set post data
    
    $client->send($request, $response);
其餘請求方法

PHP PhantomJS 庫支持下列請求方法:
•    OPTIONS
•    GET
•    HEAD
•    POST
•    PUT
•    DELETE
•    PATCH
請求方法能夠經過消息工廠建立新請求實例時進行設置:
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com', 'PUT');
或在請求實例自己:
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest();
    $request->setMethod('PATCH');
響應數據
經過訪問下面的接口給予正確的響應:
訪問方法    描述     返回類型
getHeaders() 返回全部響應標頭的數組。Array
getHeader(header) 返回特定響應如內容類型標頭的值。Mixed
getstatus () 響應狀態代碼例如 200。Int
getContent() 請求的頁面的原始頁面內容。String
getContentType() 請求的頁面的內容類型。String
geturl () 所請求頁面的 URL。String
getRedirectUrl() 若是響應是一個重定向,這將返回重定向 URL。String
isRedirect() 若是響應是一個重定向返回true,不然false。Boolean
getConsole() 返回的請求頁面上的任何JavaScript錯誤的數組以及一個堆棧跟蹤。Array

若是響應包含0狀態碼,則請求失敗。檢查請求的調試日誌,以瞭解多是什麼出錯了更詳細的信息。
屏幕截圖
你能夠保存一個頁面的屏幕截圖到你的本地磁盤 ,經過建立屏幕截圖捕捉請求並設置想要保存的文件的路徑:

<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createCaptureRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
    
    $file = '/path/to/save/your/screen/capture/file.jpg';
    
    $request->setCaptureFile($file);
    
    $client->send($request, $response);
您將須要確保你要保存到的文件的目錄存在而且你的應用程序可寫。
您還能夠爲屏幕捕獲設置寬度、 高度、 x 和 y 軸:
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createCaptureRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
    
    $file = '/path/to/save/your/screen/capture/file.jpg';
    
    $top    = 10;
    $left   = 10;
    $width  = 200;
    $height = 400;
    
    $request->setCaptureFile($file);
    $request->setCaptureDimensions($width, $height, $top, $left);
    
    $client->send($request, $response);
設置視區大小

你能夠輕鬆地爲一個請求設置視口大小:

<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
        
    $width  = 200;
    $height = 400;
    
    $request->setViewportSize($width, $height);
    
    $client->send($request, $response);
自定義超時
默認狀況下,每一個請求將在 5 秒後超時。您能夠 爲每一個請求設置自定義的超時時間 (以毫秒爲單位):
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
    
    $timeout = 10000; // 10 seconds
    
    $request->setTimeout($timeout);
    
    $client->send($request, $response);
延遲頁面渲染器
有時屏幕捕獲時,要等到頁面徹底加載才能保存捕獲。在這種狀況下,在這種狀況下你能夠設置一個頁面呈現請求延遲 (以秒爲單位):
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    
    $request  = $client->getMessageFactory()->createCaptureRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
    
    $delay = 5; // 5 seconds
    
    $request->setDelay($delay);
    
    $client->send($request, $response);
您還能夠爲標準請求設置一個頁面渲染延遲。
自定義運行選項
PhantomJS API包含了一系列的命令行選項,能夠執行PhantomJS可執行文件時傳遞。這些也能夠在一個請求以前經過客戶端被傳遞。
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    $client->addOption('--load-images=true');
    $client->addOption('--ignore-ssl-errors=true');
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
 
    $client->send($request, $response);
你也能夠設置一個包含多個 PhantomJS 選項的 JSON 配置文件路徑:
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    $client->addOption('--config=/path/to/config.json');
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
 
    $client->send($request, $response);
見PhantomJS文檔(http://phantomjs.org/api/command-line.html) 的命令行選項的完整列表。
高級用法
•    PhantomJS 命令行選項
•    自定義PhantomJS 腳本
o    編寫自定義腳本
o    在您的腳本中使用自定義請求參數
o    加載您的腳本
PhantomJS 命令行選項
PhantomJS API 包含一系列執行可執行 PhantomJS 時能夠傳遞的命令行選項。這些也能夠在請求以前在客戶端被傳遞 :

<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    $client->addOption('--load-images=true');
    $client->addOption('--ignore-ssl-errors=true');
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
 
    $client->send($request, $response);
你也能夠設置一個包含多個 PhantomJS 選項的 JSON 配置文件路徑:

php
 
    use JonnyW\PhantomJs\Client;
    
    $client = Client::getInstance();
    $client->addOption('--config=/path/to/config.json');
    
    $request  = $client->getMessageFactory()->createRequest('http://google.com');
    $response = $client->getMessageFactory()->createResponse();
 
    $client->send($request, $response);
命令行選項的完整列表,請參見 PhantomJS 文檔 http://phantomjs.org/api/command-line.html  。
自定義PhantomJS 腳本

在大多數狀況下你不須要擔憂運行 PHP PhantomJS 庫的 javascript 文件,但有時當你想要經過客戶端執行您本身自定義的 PhantomJS 腳本。這能夠經過使用內置的腳本裝載器輕鬆實現。

腳本文件或 '程序' 提述他們在應用程序中緊密映射到請求。當您建立一個默認請求實例時,您基本上運行捆綁在與應用程序的默認 javascript 程序。當您建立一個捕獲請求時,您正在運行的捕獲過程。
<?php
 
    use JonnyW\PhantomJs\Client;
    
    $client->getMessageFactory()->createRequest(); // ~/Resources/procedures/default.proc
    $client->getMessageFactory()->createCaptureRequest(); // ~/Resources/procedures/capture.proc

編寫自定義腳本

建立腳本的第一步是在某處建立一個過程文件。本指南爲咱們將它稱爲 my_procedure.proc,但實際上它能夠被叫作任何你喜歡的。惟一的要求是文件擴展名必須是.proc.。
在某處建立文件,並確保它能夠經過你的應用程序讀取。記下您建立的文件的目錄路徑,當加載在本指南稍後解釋的你的腳本你將須要。
#bash
    
    $ touch my_procedure.proc
    $ chmod 755 my_procedure.proc
下一步在您的文本編輯器中打開您的程序文件和寫您的 PhantomJS 腳本。PhantomJS 文檔在編寫自定義腳本有更詳細資料。
// my_procedure.proc
 
    var page  = require('webpage').create();
    
    page.open ('{{ request.getUrl() }}', '{{ request.getMethod() }}', '{{ request.getBody() }}', function (status) {
         
        // It is important that you exit PhantomJS
        // when your script has run or when you
        // encounter an error
        phantom.exit(1);
    });
    
    ...
重要
請確保該 phantom.exit(1);老是被稱爲運行您的腳本後,或若是您遇到一個錯誤。這須要你處理PhantomJS錯誤時,以確保你退出的 PhantomJS 腳本,腳本成功執行與否。若是你不叫 phantom.exit(1);而後 PhantomJS 將繼續運行,直到您的 PHP 腳本超時。若是你發現你自定義的腳本掛,最有有多是這個緣由。
它是一個好的習慣,在您退出 PhantomJS 的腳本中建立全局錯誤處理程序:
// my_procedure.proc
 
    phantom.onError = function(msg, trace) {
 
        phantom.exit(1);
    };
    
    ...
未完待續。。
翻譯很爛,請見諒,原文見http://jonnnnyw.github.io/php-phantomjs/

javascript

相關文章
相關標籤/搜索