任意のURLにGETやPOSTのリクエストを投げつけるスクリプトが欲しくなったので自作しました。
やりたいことは以下の通り。
- 任意のURLにGETやPOSTリクエストを投げる
- cronで自動実行する
- シェルスクリプトはできれば避けたい
- URLとメソッドは引数で渡したい
有り体に言うと「cURLだけで良いのでは?」という感じではあるのですが、一応PHPで作ってみました。
やることはシンプルなのでGuzzleを使ってサクッと済ませます。
"require": {
"guzzlehttp/guzzle": "6.5.2"
}
composer.json
のrequire
にGuzzleを指定して……。
<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
$url = $argv[1];
$method = $argv[2];
try {
$guzzleClient = new Client();
$response = $guzzleClient->request(
$method,
$url,
[
'headers' => [
'Content-Type' => 'application/vnd.json+api',
],
'verify' => false //SSL error avoid
]
);
} catch( Exception $e ) {
echo $e->getMessage() . ': リクエストの送信に失敗しました。';
exit( 0 );
}
こんな感じのスクリプトを作成。実際は引数のバリデーション等も実施しているのでもう少し記述がありますが。
なお、今回の新規事項は引数を使用していること。
$url = $argv[1];
$method = $argv[2];
ここの部分がそうですね。$argv[0]
はコマンドラインで指定したphpのファイル名が入るとのことなので、実際の引数は$argv[1]
からになります。
また、引数の個数をチェックするには$argc
という変数を使用すればよいとのこと。
//引数を2つ受け付ける場合
if( $argc !== 3 ) {
echo 'error!';
exit( 0 );
}
例えばこんな感じの書き方でチェックできます。
それから、細かいところでは今回の事情によりGuzzleへ渡すパラメータでSSL証明書の検証をオフにする指定を行っています。
今回はcronからの実行なので外部からはアクセスできないようにします。方法はいくつかありますが、そもそも公開領域に置かなければ良いですね。
ケースによっては.htaccess
でdeny from all
を書いておく、というのもありですかね?できれば公開領域外に置いておきたいですが。
10 8,20 * * * root php /PATH/TO/SCRIPT/trigger.php https://example.com/resoure/path/sample GET
最後にcronでphpを実行するようにしておけば良いと思います。上記の例では毎日8:10と20:10にtrigger.php
(上述のスクリプトの仮名)を実行、リクエストを投げ付ける先はhttps://example.com/resoure/path/sample
、メソッドはGET、という具合です。