2020/08/31(月) [n年前の日記]
#1 [prog] PerlとPHPを勉強中
PerlとPHPを勉強中。
やりたいことは、Raspberry Pi Zero W上で…。
最初は、Perl + HTML::Template + CGI.pm を使ってCGIスクリプトを書いてみた。メインPC (AMD Ryzen 7 1700)上で動かす分には一瞬でページが表示されたけど、Raspberry Pi Zero W上で動かしてみたらページが表示されるまで数秒かかって…。CPUが非力過ぎるのか、それともストレージとして使っている microSD が遅いのか、何が原因なのか分からんけれど、とにかくこの書き方はダメっぽいなと。
次に、HTML::Template と CGI.pm を使わない書き方を試してみた。若干応答が早くなった。しかし、それでもやはり一瞬待たされる感じで。
Perl を使っているのがダメなのだろうか、PHPならどうだろうと、PHPで書き直してみたところ、これなら一瞬でページが表示された。PHPって処理が速いんだな…。いや、PHPの力じゃなくて、もしかするとWebサーバの動作状態、設定次第で違ってくるのかもしれないけど。
とにかく、Raspberry Pi Zero W 上で Perl CGI を動かすのは厳しいっぽい。
やりたいことは、Raspberry Pi Zero W上で…。
- テキストファイルを読み込んで、内容をWebページとして表示。
- テキストファイルの内容をクリア。
最初は、Perl + HTML::Template + CGI.pm を使ってCGIスクリプトを書いてみた。メインPC (AMD Ryzen 7 1700)上で動かす分には一瞬でページが表示されたけど、Raspberry Pi Zero W上で動かしてみたらページが表示されるまで数秒かかって…。CPUが非力過ぎるのか、それともストレージとして使っている microSD が遅いのか、何が原因なのか分からんけれど、とにかくこの書き方はダメっぽいなと。
次に、HTML::Template と CGI.pm を使わない書き方を試してみた。若干応答が早くなった。しかし、それでもやはり一瞬待たされる感じで。
Perl を使っているのがダメなのだろうか、PHPならどうだろうと、PHPで書き直してみたところ、これなら一瞬でページが表示された。PHPって処理が速いんだな…。いや、PHPの力じゃなくて、もしかするとWebサーバの動作状態、設定次第で違ってくるのかもしれないけど。
とにかく、Raspberry Pi Zero W 上で Perl CGI を動かすのは厳しいっぽい。
◎ ソースはこうなった。 :
以下のようなPHPスクリプトになった。
timelog.php
clearlog.php
この程度なら、Webブラウザから直接 .txt にアクセスしてもよいのでは、という気もする…。でもまあ、色々勉強になったから、これはこれで…。
ちなみに、Perl + HTML::Template + CGI.pm なら、こんな感じで。
timelog.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Time Log</title> <link rel="stylesheet" href="def.css"> </head> <body> <h1>Time Log</h1> <pre> <?php $contents = file_get_contents("timelog.txt"); echo $contents; ?> </pre> <div> <a href="timelog.php">Reload</a> <a href="clearlog.php">Clear Log</a> <a href="./">Back</a> </div> </body> </html>
clearlog.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Clear Log</title> </head> <body> <?php file_put_contents("timelog.txt", ""); ?> <p>Log cleared successfully.</p> <p><a href="./timelog.php">Back</a></p> </body></html>
この程度なら、Webブラウザから直接 .txt にアクセスしてもよいのでは、という気もする…。でもまあ、色々勉強になったから、これはこれで…。
ちなみに、Perl + HTML::Template + CGI.pm なら、こんな感じで。
use strict; use warnings; use HTML::Template; use FindBin; use CGI; my $log_file = "timelog.txt"; my $tmpl_file = "timelog_tmpl.html"; my $dbg = 0; my $q = CGI::new(); my $script_dir = $FindBin::Bin; $log_file = $script_dir . '/' . $log_file; $tmpl_file = $script_dir . '/' . $tmpl_file; my $content = ""; my $params = ""; if ($dbg) { for my $name ( $q->param ) { $params .= $name . "=" . $q->param($name) . "\n"; } } if ( $q->param('action') eq 'clear' ) { # clear log file open my $fh, '>', $log_file or die "Can't open file $log_file : $!"; print $fh ""; close $fh; # $content = "Clear log\n"; $params .= "clear log file.\n"; } else { # read log file open my $fh, '<', $log_file or die "Can't open file $log_file : $!"; $content = do { local $/; <$fh> }; close $fh; $params .= "read log file.\n"; } my $template = HTML::Template->new( filename => $tmpl_file ); $template->param( TIMELOG => $content ); $template->param( PARAM => $params ); print "Content-Type: text/html\n\n", $template->output; exit;
◎ CGI.pmってどうなんだろう。 :
CGI.pm を使って HTML5 に対応させるにはどうしたらいいのか、と疑問に思ってググってみたら、そもそも今時は CGI.pm でHTMLを生成するなんてナンセンス、という空気のようで。「HTMLテンプレートを読み込んで一部を変更して出力、てな処理をすべきだよ」「CGI.pm で生成? ないわー」ということになってるっぽい。
たしかに、そのほうが楽だよな…。ただ、ファイルへのアクセス回数が増えるような気もするのだけど…。キャッシュ云々でそのあたり改善できたりもするのだろうか…。
たしかに、そのほうが楽だよな…。ただ、ファイルへのアクセス回数が増えるような気もするのだけど…。キャッシュ云々でそのあたり改善できたりもするのだろうか…。
◎ 2020/09/01追記。 :
以下の記事を眺めていて気づかされた。
_GETとPOSTの使い分け ついでにPUTとDELETE - Qiita
ああ、たしかに…。
つまり、本来であれば、前述の、呼ばれただけでログファイルの中身をクリアするスクリプト(clearlog.php)なんて論外だなと。クローラーが来るたびにログが消去されてしまう。まあ、今回はローカルで実験してるだけだからアレだけど…。
_GETとPOSTの使い分け ついでにPUTとDELETE - Qiita
GETは、検索エンジンのクローラーがページを見に来る可能性があるため、データベースにアクセスするような内容は書かないようにする。
クローラーが来るたびにデータの追加、変更、削除をされないように、意図的に見に来ないPOSTで処理する必要がある。
ああ、たしかに…。
つまり、本来であれば、前述の、呼ばれただけでログファイルの中身をクリアするスクリプト(clearlog.php)なんて論外だなと。クローラーが来るたびにログが消去されてしまう。まあ、今回はローカルで実験してるだけだからアレだけど…。
[ ツッコむ ]
以上です。