PHPのコマンドライン引数(argv、argc そして getopt)
- Thu
- 00:41
- PHP
一般的な引数取得である、argvは簡単でお手軽ですが、複数の引数が全てオプション(任意指定)の場合、指定したい引数の順番まで全て指定する必要があり大変不便です。
そこで、getopt。
マニュアルにもあるとおり、ショートタイプ(-dなど)、ロングタイプ(--dateなど)の両方が利用でき大変便利。
値でなく、キーが必須かどうかのチェックはしてくれないので自分で書く必要がありますが、ほとんどの場合、値のチェック(バリデーション)を行うので問題ない場合が多いかと。
さらにいい点としては、標準関数として定義されているのでクラスインスタンスの生成やinclude/require等別ファイルを読み込む必要がないところ。
そこで、getopt。
マニュアルにもあるとおり、ショートタイプ(-dなど)、ロングタイプ(--dateなど)の両方が利用でき大変便利。
値でなく、キーが必須かどうかのチェックはしてくれないので自分で書く必要がありますが、ほとんどの場合、値のチェック(バリデーション)を行うので問題ない場合が多いかと。
さらにいい点としては、標準関数として定義されているのでクラスインスタンスの生成やinclude/require等別ファイルを読み込む必要がないところ。
PHPによるcurl(POST)リクエストの送信
- Tue
- 02:01
- PHP
PHPのcurlライブラリをPOSTで使用。
Yahoo検索は通常はブラウザからGETで結果を取得できますが、POSTでも取得できるのでこれでお試し。
で、結果。全部出すと多いのでBODYの始まりまでを抜粋。
CURLOPT_SSL_VERIFYPEERは、sslのサーバ証明書チェックの有無。サーバのsslがオレオレ認証の場合は0を設定。但し今回は使わないのでコメント化。
CURLOPT_RETURNTRANSFERは、curl_exec() の戻り値を受け取る場合に設定($res = curl_exec())。
Yahoo検索は通常はブラウザからGETで結果を取得できますが、POSTでも取得できるのでこれでお試し。
#!/usr/bin/php <?phpp // $URL = "http://search.yahoo.co.jp/search"; $PRM = "p=test&ei=UTF-8"; echo "*** [$URL]\n"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $URL); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $PRM); //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_exec($ch); curl_close($ch); print "\n";
で、結果。全部出すと多いのでBODYの始まりまでを抜粋。
user01@host01[php]$ ./curl_post.php | head -22 *** [http://search.yahoo.co.jp/search] Content-type: text/html HTTP/1.1 200 OK Date: Mon, 06 Jun 2011 16:46:06 GMT P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" Vary: Accept-Encoding Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 Cache-Control: private <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Yahoo!検索 - test</title> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel="stylesheet" href="http://k.yimg.jp/images/serp/ws/css/110412/ws20.css" type="text/css" media="screen,tv"> </head> <body> user01@host01[php]$CURLOPT_HEADERは、HTML header出力の有無(Content-type: text/html~Cache-Control: privateまで)。
CURLOPT_SSL_VERIFYPEERは、sslのサーバ証明書チェックの有無。サーバのsslがオレオレ認証の場合は0を設定。但し今回は使わないのでコメント化。
CURLOPT_RETURNTRANSFERは、curl_exec() の戻り値を受け取る場合に設定($res = curl_exec())。
URLのファイルと異なるファイル名でダウンロード
- Fri
- 00:04
- PHP
例えば、http://foobar.com/test.php のようなURLから「ダウンロードファイル.csv」のようなファイル名でファイルをダウンロードする方法。
test.php
Windowsの場合は、SJISにしないとダイアログに表示されるファイル名が文字化けしてしまいます。
URL、ダウンロードするファイル名、ブラウザから保存されるファイル名、の全てを異なる名前で指定可能。
test.php
<?php error_log ("*** new req"); $filename = mb_convert_encoding ('ダウンロードファイル.csv', 'SJIS'); header('Content-type: application/stream;'); header("Content-Disposition: attachment; filename=\"$filename\""); readfile ("download.csv"); ?>download.csv
111,222 abc,defこのURLにアクセスすると、ブラウザのダウンロード用ダイアログがでます。
Windowsの場合は、SJISにしないとダイアログに表示されるファイル名が文字化けしてしまいます。
URL、ダウンロードするファイル名、ブラウザから保存されるファイル名、の全てを異なる名前で指定可能。
PHPによるメールの件名エンコード
- Fri
- 00:59
- PHP
メールの件名を日本語で送信する場合は、base64のエンコードを行う必要があるのでそのメモ。たまにやろうろすると忘れてしまう。。。
encode_subject.php
実行例
encode_subject.php
#!/usr/local/bin/php <?php $sbj_org = "件名のencodeテスト"; $sbj_enc = "=?iso-2022-jp?B?" . base64_encode (mb_convert_encoding ($sbj_org, "JIS", "UTF-8")) . "?=" ; print "$sbj_enc";
実行例
user01@host01[tool]$ ./encode_subject.php; echo "" =?iso-2022-jp?B?GyRCN29MPiROGyhCZW5jb2RlGyRCJUYlOSVIGyhC?=