PHP5上級試験/準上級試験の上級合格に挑戦(20) プログラミングPHP第3版 14章~15章

# 14章　さまざまなプラットフォームでのPHP

・黒本１３章「WindowsでのPHP」が対応
・Zend Server CE(Community Edition)でマルチプラットフォーム対応

## 14.1.1 実行環境の調べ方

PHP_OSの他に`php_uname()`がある
→OS情報がPHP_OSよりも多い

## 14.1.2 複数プラットフォームに対応するパス
PHP4.07以降、WinのUNCパスにもスラッシュを使用できる。

※UNCパスとは、Windowsネットワーク上で共有されている様々な資源（ファイルやフォルダ、プリンタなど）の位置を表記する標準的な記法で、「\\コンピュータ名\資源の共有名\資源内での位置」（英語環境では\はバックスラッシュ）という形式で表される。

## 14.1.4 メール送信
Unixシステムでは`mail()`で、sendmailかQmailのどちらを使うかを切り替えられる
Windows上でsendmailを使う場合、インストールしてphp.iniのsendmai_pathを設定する
メールソフトでメール送信用に使っているSMTPサーバーを指定するのが簡単

## 14.1.6　ファイル終端の扱い
Winのテキストファイルの最後にはControl-Z("\xlA")という制御コードが付加される
Unixはファイルのデータとは別にファイルサイズについての情報が格納される
→Windowsのテキストファイルでもfeof()が使える

## 14.2 COMインターフェースの使用
COMを使うと他のWindowsアプリを制御できる。たとえばファイルの内容をExcelに送ってグラフ変換、GIF画像としてエクスポートする、、、なんてことができる
また入力フォームから受け取った情報をWordで整形して請求書印刷。。。なんてこともできる

## 14.2.1 背景知識

+ COMとは、リモートプロシージャコール（RPC）の仕組みにいくつかのオブジェクト指向の機能を追加したもの
+ コール元のプログラム（コントローラ）から別のプログラム（COMサーバー、つまりオブジェクト）を呼び出せる
+ 同一マシンにあるプログラムを呼び出すときはCOM、リモートマシンのプログラムを呼び出す時は分散COM（DDOM）を使う
+ DLLとして提供されているコードが同じプロセス空間に読み込まれる場合、そのCOMサーバーはプロセス（inproc）サーバーになる。そのコード辞退が単体のアプリケーションとして独自のプロセス空間で動作する場合は、プロセス外サーバー（ローカルサーバーアプリケーション）と呼ばれる
+ OLE（Object Linking and Embedding)はMicorosoftが以前に使用していたあるオブジェクトを別のオブジェクトに埋め込む技術。（ExcelシートをWord文書に埋め込むとか）
+ 前はDDE（Dynamic Data Exchange）を使っていたため機能が限られていた
+ いまはCOMを使っている

PHPによるWord文書を作成してHello,Worldという文字を追加する例
これをコマンドラインから起動する

```index.php
$word = new COM("word.application") or die("Wordの起動に失敗しました");
echo "Word バージョン{$word->Version}を起動しました<br>";
//新規作成
$word->Documents->add();
//Hello，World記入
$word->Selection->typeText("Hello,World");
$word->Documents[1]->SaveAs("c:/php_com_test.doc");

//Word終了
$word->quit();

//Word変数解放
$word = null;
echo "end";
```

## 14.2.3 APIの調べ方
Wordなどのオブジェクト階層やパラメータを調べるにはMicrosoftの開発者向けサイトを利用する。
他のアプリも同じ。

# 15章　Webサービス
内容的には黒本の１６章のJSONが対応する

# 15.1 RESTクライアント

RESTfulウェブサービス・・・HTTPを使って、REST原則に従ったウェブAPIを実装したサービス全般
ちなみにAPIとはApplication Programming Interfaceで、簡単に言うと他のソフトの機能を連携して使えるようにする機能

@NagaokaKenichi　さんの記事がとってもわかりやすい。ありがとうございます！

https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2

https://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c

REST APIの多くはAPIからのレスポンスをJSON形式で返すことが多い
JsonSerializableインタフェースを使えば、オブジェクトをお好みのJSON形式に変換できる

# 15.1 リソースの取得・更新・作成・削除
cURL関数（HTTPリクエストをすることにより、外部サイトの情報を取得することができる関数）を使う

+ `curl_init()`　cURLのセッションを初期化し、cURLハンドルを返す
+ `curl_setopt()` cURLの転送用オプションを設定。boolean型の値を返す
+ `curl_exec()` cURLのセッションの実行時に使用。ただし、セッションの初期化、オプション設定が終わってから。
+ `curl_close()`　cURLのセッションを閉じる

GET/POST/PUT/DELETEは、curl_setopt()のほうで設定する

`http_build_query(data, prefix, seperator, encode)` はURL エンコードされたクエリ文字列を生成する
`curl_getInfo()`は指定したリソースの情報をゲットする

```index.php
// curl_closeの前にvar_dumpで$resを調べると良いと思う

//基本＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊

$url = "https://www.xxx.net/xxx/";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res =  curl_exec($ch);
curl_close($conn);

//GET ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$res =  curl_exec($ch);
curl_close($conn);

//POST ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊

$url = "http://www.google.co.jp/";

$ch = curl_init();
$data = array('qiita' => 1);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

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

//PUT ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
//ファイルアップロードを想定
$bookid = "PHPProgramming";
$url = "http://www.xxx.xx.jp/{$bookid}";
$data = json_encode(array('edition' => 3));
$requestData = http_build_query($data, '', '&');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

$fh = fopen("php://memoriy", 'rw');
fwrite($fh, $requestData);
rewind($fh);

curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, mb_strlen($requestData);
curl_setopt($ch, CUPLOPT_PUT, true);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$res =  curl_exec($ch);
$resInfo = curl_getinfo($ch);
fclose($fh);

//DELETE ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
$bookid = "PHPProgramming";
$url = "http://www.xxx.xx.jp/{$bookid}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMERREQUEST, 'DELETE');

$result = curl_exec($ch);
$resultInfo = curl_getinfo($ch);
curl_close();

```

## 15.2 XML_RPCとSOAP

ウェブサービスを作るときによく使われる標準的なプロトコル。
黒本だと、第９章XMLで紹介

PHPだと、xmlrpcモジュールを使うとSOAP・XML-RPCの両方を利用できる