SQLの窓 イラストAC フリー素材

2015年05月18日

コマンドプロンプトから Windows PHP を使って POST 投稿する

PHP のインターネットアクセスは、FTP や API や、もろもろ細かい全ての設定の可能な cURL 関数を使用するのが通常です。

この処理は、一般の WEB フォームで使用する事はできません。一般の WEB フォームでは入力者を特定する為のいろいろな内部処理があるのでこのような単純な処理では扱えませんが、自分の管理するシステム内で http を経由してデータを受け渡しするのであれば、これで十分運用できます。あとは、ログとして結果をメールでどこかに送っておけばいいと思います。

localhostに 以下のアプリを登録して確認しました。

PHP による『超簡易掲示板』 / アプリケーションからの POST 検証用

PHP は、http://jp.php.net/downloads.php から Windows バイナリの最新バージョンをダウンロードしてコマンドプロンプトのカレントディレクトリに解凍し、そのフォルダ名を php としています( c:\php )。

php.ini は、php.ini-development の -development を省いてリネームして使用します。
( development は『開発』という意味です )

php.ini の 
extension_dir = "ext"
extension=php_curl.dll
extension=php_mbstring.dll

は手作業で設定して、以下のバッチファイルを起動します。
@echo off
setlocal
set path=c:\php;%PATH%

php test.php "アップロードする\n文 字 列\nの指定"

endlocal


Windows のコマンドプロンプトは SHIFT_JIS なので、インターネット側のキャラクタセットに合わせて変換する必要があります。PHP の内部コードは UTF-8 で設定するのが無難ですが、EUC-JP でも構いません( SHIFT_JIS は内部コードとして使用できない )

このサンプルでは、http でアクセスしていますが、https にアクセスする場合は、以下の二行を13行目に追加して下さい

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
※ FALSE を設定すると、cURL はサーバー証明書の検証を行いません。
※ cURL 7.10 以降、デフォルト値は TRUE なので、false に明示的に設定する必要があります。

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
※ CURLOPT_SSL_VERIFYHOST は、デフォルトで 2 です。
※ 1 は、cURL 7.28.1 以降では使えなくなりました。

test.php の内容
<?php

$url = "http://localhost/basic/log/log.php";

mb_language( "ja" );
mb_internal_encoding("UTF-8");

$data["text"] = str_replace( "\\n", "\n", $argv[1] );
$data["text"] = mb_convert_encoding( $data["text"], "UTF-8", "CP932" );
$data["send"] = "送信";
// ▼ 連想配列を URL エンコードされたクエリ文字列に変換します
$post_data = http_build_query( $data );

$curl = curl_init();

// ▼ 接続の試行を待ち続ける秒数。0 だと永遠に待ちます。
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
// ▼ TRUE を設定すると、ヘッダの内容も出力します(通常は必要無いので)。
curl_setopt($curl, CURLOPT_HEADER, false);
// ▼ 結果を直接出力しないで、引数として戻します
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// ▼ PHP 5.1.3 以降では、CURLOPT_BINARYTRANSFER は効果ありません。
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);

curl_setopt($curl, CURLOPT_URL, $url );
// ▼ TRUE を設定すると、HTTP POST を行います。
// POST は、 application/x-www-form-urlencoded 形式で 行われます。
// これは一般的な HTML のフォームと同じ形式です。
// CURLOPT_POSTFIELDS で文字列をセットする場合は、自動的に
// application/x-www-form-urlencoded になります
curl_setopt($curl, CURLOPT_POST, true);
// 連想配列を渡すと、データを multipart/form-data でエンコードするので注意
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data );

$result = curl_exec($curl);
curl_close($curl);

?>

test.php には引数が渡せるので、ごく自然にスクリプトとして利用する事ができます

関連する記事

Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る
役に立つコマンドプロンプト



【役に立つWindowsの最新記事】
posted by at 2015-05-18 13:24 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする