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)なんて論外だなと。クローラーが来るたびにログが消去されてしまう。まあ、今回はローカルで実験してるだけだからアレだけど…。
[ ツッコむ ]
以上、1 日分です。