PHPでファイル送信を行う

ソフトウェアやその他のファイルをダウンロードするようなページを作ることを考える。サーバ上にファイルを置いてそのファイルへのリンクを作成すれば目的は達成できるだろう。が、例えばダウンロードしに来た人に名前やメールアドレスなどを入力してもらい、ある一定の条件をクリアした人だけにダウンロードをさせるようなサイトを考えたときには、入力とダウンロードを行うスクリプトなりCGIなりを考えなければならないだろう。

ということで、そこだけ取り出したコードを示してみよう。

一括送信方式

引数で指定したファイルを(URLではない)を一括送信する。PHPのマニュアルなどによく出ているものだ。


ほとんどの場合これで問題はない。が、私の場合300MBを超える巨大なファイルを送信したら、半分くらいでサーバが送信を停止してしまう現象に悩まされた。ブラウザから見るとファイルのダウンロードが中断したようになる。あるいは、正常にファイルがダウンロードできたように見える。いずれにしても正しい動きではない。

原因は、PHPのスクリプトが動作できる時間設定がデフォルトでは30秒に制限されているからだ。ダウンロードのスクリプトは巨大なファイルになると30秒では終了しない。そこで、set_time_limit()関数を使ってタイムアウトを適当な時間に設定する。2分くらいでよいだろうか。

さて、これで動作するようにはなった。ところが、ユーザがダウンロードのボタンを押してからブラウザになんらかの表示が現れるまでに時間がかかる。なんとかこれを改善する方法はないか。

ファイルを少しずつ送信する方式

ブラウザにファイル保存のダイアログや通知バーが表示されるのが遅くなるのは、PHPスクリプトが動作してreadfile)が呼ばれ、実際にブラウザに最初のデータが届くのに時間がかかっているからのようだ。readfile()関数は、指定された全データを一度読み込んで動作する。なので巨大なファイルではその読み込みに時間がかかる。そこで、ファイルの内容を少しずつ読み込みながら少しずつブラウザに送信してやれば問題は解決するのではないか?

結果はビンゴ。どうやらこれで問題は起こらないようだ。


1メガ単位で送信している。状況によってもっと小さくしても良いかもしれない。これで実用的な速度で使えるのではないだろうか。

インターネットラジオ配信に思う?

そんな大それた事ではない。私が小さかった頃、レコードプレーヤーとテレコ(って死語だよなあ)を使ってラジオ番組制作ごっこをして遊んだことがある。我が家にはカラオケのセットがあった。テープとマイクだけだが簡易ミキサーとして使えるわけだ。で、エコー(正しくはディレイだが)まで付いている。これで誰も聞いてはくれないけれどラジオ番組制作ごっこができるわけだ。

時は流れて今はインターネットの時代。コンピュータと量販店で売っている安いマイクだけで当時やっていたようなことはできる。そして作った番組をインターネット上に公開すれば世界中の人が聞いてくれる可能性があるのだ。もうちょっとがんばれば、世界中に生放送できるようになった。

そしてスマートフォンの登場で、生放送をすることはものすごく簡単になった。無料のアプリをインストールして「放送開始」ボタンを押すだけ。音声だけでなく映像も一緒に放送できる時代である。

私の周りで、インターネットラジオを放送するのが密かな(というわけでもないか)ブームのようだ。主にバラエティーが中心の人もいるし、アクセシビリティ関連を扱っている人もいる。いずれにしてもなにかを発信しようとしていることには違いはない。5年前なら考えられなかったことだ。

ARGVでも3年くらい前にインターネットラジオを使ってイベントを行った。3年前としては画期的な試みだったと思う。Twitterを使ってのリアルタイムコメントの受付やイベント内容の要約をTwitterで発信するようなことを行った。最大70人くらいの人に聞いていただけた。

ARGVでその後このようなイベントを行っていないのは、出演者(発表者)が多忙であることと取り上げる内容がまとまらないことにあるのだが、私としてはそろそろなにかやってみたいなと思っている。密かにインフラの準備だけは進めている。誰か私の手元にある機材とUSBインターフェースの付いたミキサーを交換してくれるという人はいないだろうか(笑)。

Hello world!

WordPressに浮気をしている。無事に乗り換えはできそうな雰囲気になってきた。

私が自分のページを持ってから、そろそろ15年になる。まだWindows98は存在していなかった。当時はHTMLを完全に手書きしていた。文法もかなり間違っていた。誰かのページを適当に真似して作っていただけだったからだ。

その後半自動でHTMLを書くようになった。文法もそれなりに勉強して、今では珍しくない言葉になった「アクセシビリティ」なんていう単語も覚えた。この半自動状態は長く続いた。

その後CMSと呼ばれるシステムを導入する。これが2008年くらいか。そもそもブログを書きたかったからだ。そんなに書き残す内容があるわけでもないが、みんな書いているみたいだし特に技術的文書は書き残してもよいだろう、と思っていた。それまでにも主にUN*X関連の文章、プログラミング関連のことを書いていたので、そのような文章をブログにしようと思ったのだ。

CMSは、サイト全体を管理してくれる。メニューやナビゲーションや共通している部分は毎回書く必要はない。ひな形が全部やってくれる。私は中身だけを考えればよい。そして、HTMLを基本的に知らなくてもある程度のことができる。ワープロで文章を書くような感覚でページを作成していくことができる。

ところが、そういう状況になっても私は中身のHTMLは半自動で書く。いろいろ理由はあるが、私が思っているHTMLに、このワープロ機能ではならないからだ。どちらが良いというのでもないが、どうやら私はHTMLそのものを書いている方が安心するらしい。

ブログを始めては見たけれど、技術文書はほとんど書かなかった。書かなかったのにはいろいろな理由があるが、なにをどのように書いてもどこかの製品やサービスを推奨して(あるいは好んで使って)いるように受け止められる可能性があり、それが当時の私の立場では好ましくなかったからだ。極力コンピュータ関連のことは避けていた。主に音楽関連・趣味のこと・お茶のことを書いていた。

ところが、昨年のサーバー引っ越しのときに、それまで書きためていたブログのデータベースをおそらく失った。良いリセットの口実になったというわけだ。3年くらい前から長い文章を書くのは正直面倒になっていたので、実際の所は記事はほとんど書いてはいなかったのだが。データを失ってからもブログを再開しようかとはあまり思わなかった。日々の書きたいことはTwitterに投稿しているし、わざわざ自分で書き残すべき事があるようにも思えなかったからだ。

私は昨年から今年にかけて公私ともにものすごく変化していた。その中で、明らかに渡しが書き残さなければならないだろうことが出てきた。徐々にこの「書き残さなければならないこと」は書いていくことにするとして、ブログを再開する良いきっかけになった。

ほぼ同じ時期に、渡しの立場も大きく変わった。発信してもかまわない情報の幅が広がったということでとどめておくが、ブログに書いたりまとまったページを作って公開することがしやすくなった。アクセシビリティに関すること、現状渡しが思っていることもぼちぼち表明できるのではないか。

ということで、基本的に私のためにではあるが、サイトを構築していこうかと思う。WordPressは順調に動いているようだから。