從 Curl 到 Guzzle, PHP HTTP client

[前言]

當我們使用 PHP 要爬網頁或做網路機器人的時候,第一個會想到的是:使用 CURL ,他是一個在 Linux 的套件,安裝之後可以使用的指令,因為有繼續發展函式庫的關係,所以陸續針對不同的程式語言開發了 LibCurl,不過 curl 其實在 PHP 不好用,其原因不外乎是使用 curl_init….. 等程序式函式庫而成的。對於一些寫習慣了 OOP 物件導向程式的人來說不習慣。因此在某些原因下,Guzzle, 這個 PHP HTTP client 就產生了。

[安裝]

PHP 最主要的 dependencies package manager 是 Composer 是一個套件管理器,能夠安裝各式套件且不需要匯入。

首先要先安裝好這個。

Guzzle 5.3.0 前置條件:

Requirements
需要 PHP 5.4.0
To use the PHP stream handler, allow_url_fopen must be enabled in your system’s php.ini. allow_url_fopen 設定需要被打開(設定:On)
To use the cURL handler, you must have a recent version of cURL >= 7.16.2 compiled with OpenSSL and zlib. cURL 版本需要 7.16.2 以上且 有把 OpenSSL and zlib 編譯進去

Step1:

下載 composer.phar,利用下面指令就會自動安裝最新版的 composer.phar

curl -sS https://getcomposer.org/installer | php

Step2:

當然也可以選擇手動安裝,進入下載頁面,拉到最下面有 Manual Download 字眼,為手動安裝。

Step3:編寫 composer.json 並執行:php composer.phar install 如果之前已經有使用 composer.json 則輸入:php composer.phar update

或直接在專案目錄下值接輸入:php composer.phar require guzzlehttp/guzzle

{
    "require": {
       "guzzlehttp/guzzle":"5.*.*"
    }
} 

我們安裝第五版,第五版與第六版是目前官方所支援的,寫法有異,這篇先以第五版做為範例。

Step3:接下來的範例,我用幾個常用的服務做為範例,分別是下再一個網頁, Google reCaptcha API驗證,和寄信服務MailGun (cURL),以及上傳圖床服務 imgur (用 cURL)等這四個範例。

[範例 1:Mailgun]

Mailgun 是一個發送信件的服務,相較自己架的Mail server 發信,信件不會被丟到垃圾信件中。也省去一些繁複的設定。

下面是一個使用 libcURL 的 PHP 程式碼:


function send_simple_message() {
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
     curl_setopt($ch, CURLOPT_USERPWD, 'api:key-your-key');
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
     curl_setopt($ch, CURLOPT_URL,
              'https://api.mailgun.net/v3/your-domain.mailgun.org/messages');
     curl_setopt($ch, CURLOPT_POSTFIELDS,
            array('from' => 'peter <peter279k@gmail.com>',
                  'to' => 'peter <peter279k@gmail.com>',
                  'subject' => 'Hello',
                  'text' => 'Hello World'));
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

如果用 Guzzle 寫的:其實不會差很多,主要是 Guzzle 是以 libcURL 為基礎的,用 OOP 物件導向的程設重新設計過,所以使用起來會比較直覺。

需注意的是,HTTP-BASIC 用法不太一樣,冒號隔開分別是,使用者名稱與密碼。


require "vendor/autoload.php";

$client = new GuzzleHttp\Client([
'defaults' => [
      'auth' => ['api', 'key-your-api-key'],
    ]
]);

$client -> setDefaultOption('verify', false);
$res = $client->post('https://api.mailgun.net/v3/your-domain.mailgun.org/messages', [
'body'=>[
    'from' => 'peter <peter279k@gmail.com>',
    'to' => 'peter <peter279k@gmail.com>',
    'subject' => 'Hello',
    'text' => 'Hello World'
  ]
]);
var_dump($res->json());

[範例 2:Imgur]

Imgur 是一個好用的圖床服務,通常會拿來上傳圖片,當然也有提供各式的 API 可供授權 authLoginURL 與上傳圖片。

下面是一個使用 libcURL 的 PHP 程式碼:


$client_id = "your-imgur-client-id";
$image = file_get_contents("/path/to/image.png");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode($image)));

$reply = curl_exec($ch);
curl_close($ch);

$reply = json_decode($reply, true);

var_dump($reply);

用 Guzzle HTTP Client 寫的:


$imageFile = file_get_contents("../imgur_result.png");

$client = new GuzzleHttp\Client([
     'defaults' => [
         'headers' => ['Authorization' => 'Client-ID 3aa5c24753e1656'],
     ]
]);

$res = $client->post('https://api.imgur.com/3/image.json', [
      'body'=>[
         'image' => base64_encode($imageFile)
      ]
]);

var_dump($res->json());

[範例 3: Google reCaptcha API]

[未完,待續……]

[Ref. 參考資料]

Mailgun心得筆記

Guzzle 5.3 docs

Mailgun 介紹

[後記]

下兩篇將會單獨介紹寄信服務與 Imgur 的圖床服務

Azure 雲端服務起步走—-架設 Linux 虛擬機及 LAMP 服務

在因緣之下,接觸了 Azure 雲端服務,我想說建立一個自己熟悉的 server ,應該不會很難吧,覺得跟我在使用 VPS(Virtual Private Server) 一樣簡易,實際上發現還是有差別的,有些步驟還有元件分開的,我猜是因為雲端運算架構的關係吧,下面就開始介紹怎麼建置一個 Linux 虛擬機器。

第一步:當然要先取得試用帳號,這步當然很重要,不然連一個資源建立,M$ 都不會讓你建立的….

第二步:登入 Azure 來到下圖的一開始資源首頁。

azure

第三步:左邊的選單欄,黑色部份選擇虛擬機器傳統,我選擇傳統,其實我頁不知道跟非傳統差別在哪裡,因為我看起來設定都是差不多的,我猜可能差在後面在部署上的架構會不太一樣吧。

第四步:接著會彈出一個框,列出目前在運行虛擬主機(傳統)的清單,因為我已經事先建立好一個,所以在圖上會顯示有一個名字叫做 open-data 的虛擬機器。

第五步:按下新增,接著會跳出很多個圖示,這邊可以自由選擇建置作業系統虛擬主機,或是一個 Databse server 我們在這邊選擇的是 Ubuntu Server,因為我們要建置的是一個 Linux 環境,我看過整個作業系統,目前只提供 Ubuntu 和 Windows server 其他的 Linux 發行套件沒有提供,像是 Fedora,FreeBSD 等。

azure

第六步:我們選擇好之後,Ubuntu Server 會有兩種長期支援發行版本供我們選擇,一個是 12.04 另一個是 14.04 ,兩者都是 LTS (Long Term Support) 這個版本指的是內部套件與核心會維護五年,因此叫做長期支援,如果沒有特殊偏好或需求就選14.04 LTS 吧。

第七步:選擇好之後,下面會要我們選擇部署的資源類型,我選擇傳統,接著按下建立。

第八步:到了這裡就會出現要填寫 VM 相關的資訊,前面打星號的就是重要,必填的部分。

第九步:位置的部分,可以使用離台灣比較近的地方,這樣連線會比較快一點(? 不過錢的部分當然還是會差一點。至於訂價層的部分,就是可以選擇需你機器的大小,像是可以選擇比較大的 CPU 運算核心或是記憶體 RAM 可以選擇大一點,還有硬碟的大小,最低就是 30GB,這裡我想使用最低 DS1 標準就夠了,我自己租的 VPS 都比最低方案還要再低的規格了,如果沒有特別需求,架設 sever 跑服務的話,DS1 標準我覺得很夠用了。

SSH 部分,因為一開始 Linux 部署好之後是沒有安裝桌面環境的,所以會先預設使用 SSH來連線,這裡可以選擇公鑰金鑰交換方式連線與使用密碼,密碼是比較簡單的方式,因此這裡我選擇使用密碼。

第十步:選擇好與填答完之後,一個 server 相關資訊就完成了,接著就可以按下建立了。在建立過程狀態,可以畫面看到右上方有一個鈴鐺,會顯示目前建立虛擬機的狀況。

azure

第十一步:接著建立完成後,會顯示建立虛擬機器成功等字樣,這樣虛擬機就部署完成了。接著按下左邊虛擬機器(傳統)回到虛擬機器列表,按下剛建好的虛擬主機,這個時候會跳出機器的相關資訊,像是 CPU 的使用率,還有目前的狀態,右邊會有一個設定,包含重設密碼,監控資源,開機診斷等。

azure

第十二步:我們可以試著連線到主機,按照上一步,選擇剛剛建好的主機,按下管理下面的屬性,會出現 IP 位址相關,與 SSH 相關連線,把連線的資訊複製下來,接著使用 PUTTY 連線,就 OK 了。

第十三步:接著就會看到下面這個樣子。

azure

第十四步:接著輸入下面的指令,更新機器上的套件。


sudo apt-get update

第十五步:更新完之後,就可以按照這篇教學安裝 LAMP server 了。

第十六步:這邊補充一下,可以考慮不用安裝桌面環境,原因是因為桌面環境要耗掉一些記憶體 RAM,雖然最低方案記憶體有 3.5G,不過安裝了桌面環境運行還是要耗掉一些的。所以不用安裝就不用安裝。

第十七步:再來就是架設好 LAMP server 之後,需要設定讓外部能夠連網近來,因為預設連線都是關閉的。所以要開起來,因此點擊左邊列表,選擇雲端服務(傳統),上面這個網站URL 就是這個虛擬機所配發的網址。

azure

第十八步:因為要設定對外的 port,所以再回到虛擬機器(傳統),接著按照截圖方式選擇到端點,按下新增端點,設定對外的 port ,截圖中我已經設定了 port 80,不然裡面列表就只有 port 22 而已。設定後,等跑完就完成了。

azure

[後記]

如果有做重設密碼的話,就需要重新設定 SSH 組態,位置在下方的截圖。還有做一些相關設定的動作,建議是先離開連線之後再做,以確保設定可以正常執行,雖然設定相關的動作,機器會預先把連線關閉。

azure

[參考文章]

在 Azure 上架設 Linux VM 及 LAMP 服務