mieki256's diary



2020/08/31(月) [n年前の日記]

#1 [prog] PerlとPHPを勉強中

PerlとPHPを勉強中。

やりたいことは、Raspberry Pi Zero W上で…。 これを Webサーバ lighttpd で処理するという、ただそれだけ。

最初は、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
<!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
GETは、検索エンジンのクローラーがページを見に来る可能性があるため、データベースにアクセスするような内容は書かないようにする。
クローラーが来るたびにデータの追加、変更、削除をされないように、意図的に見に来ないPOSTで処理する必要がある。

GETとPOSTの使い分け ついでにPUTとDELETE - Qiita より


ああ、たしかに…。

つまり、本来であれば、前述の、呼ばれただけでログファイルの中身をクリアするスクリプト(clearlog.php)なんて論外だなと。クローラーが来るたびにログが消去されてしまう。まあ、今回はローカルで実験してるだけだからアレだけど…。

以上、1 日分です。

過去ログ表示

Prev - 2020/08 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project