10万件のデータ挿入
PHPからSQLiteに10万件のデータを挿入してみた。CLI版で。pdo関数を使って。単に1件ずつINSERT文で挿入。データ自体は数値データ2つとテキストデータ(2文字)。サーバはVPS、OSはCentOS。
2時間弱かかった。結構かかるな。メモリはそんなに使わないみたい。
PHPからSQLiteに10万件のデータを挿入してみた。CLI版で。pdo関数を使って。単に1件ずつINSERT文で挿入。データ自体は数値データ2つとテキストデータ(2文字)。サーバはVPS、OSはCentOS。
2時間弱かかった。結構かかるな。メモリはそんなに使わないみたい。
以前PHPからコマンドをキックしてバックグラウンドさせる方法について記事を書いた。できたようなできなかったような・・・結果として上手くいかなかったのだが、やっと解決できた。Linux系OSに関する知識の少なさが改めて露呈する結果となってしまった。
いくつかパターンを試してみた。
前回1番目から3番目を試していて、4番目と5番目を忘れていた。「&」の位置は後が正しいようだ(バックグラウンド処理の&はとにかく1番後ろに付けるのが正解みたい)。ということで5番目でバックグラウンド処理ができた。めでたしめでたし。
VPSを何台か借りているが、VPSというのは、その内情(インストール方法)を知っておかないと、恐ろしく手間取る可能性があることを改めて知った。
格安でVPSを借りているのだが、そこにはpdo_mysqlがインストールされていなかった。そこでpdo_mysqlをインストールしようとして四苦八苦したので、メモを残しておく(現状報告として、現時点ではインストールできていない)。
まず最初にしたことはRPMパッケージ探し。OSはCentOSであることがわかっているが念のため、バージョンを確認。
more /etc/redhat-release
これでバージョンが確認できた(ちなみにOSはCentOS4.7だった)。次に当該バージョンでRPMが提供されているかどうかウェブで調べる。結構調べたつもりだけど、結果として見つけられなかった。「さて、どうしようか」と考えて、次にPECLでのインストールを試みる。これには事前にいろいろなパッケージを入れておく必要がある。yumコマンドでインストールした。
yum –enablerepo=centosplus -y install php-devel php-pear mysql-devel httpd-devel
yumのリポジトリでcentosplusというのを有効にしておく必要があるみたい。ちなみにyオプションは、何を聞かれても「y」と答えなさい、という意味。ここまででPECLコマンドが利用できるようになった(PECLは確かPEARに含まれていたと思った)。そこでコマンドラインで、コマンド一発。
pecl install pdo_mysql
とりあえず応答メッセージの下のほうにcompleteと書いてあるので、いちおうOKっぽい。で、最終作業。php.iniに必要な情報(extension_dirやextension)を記述してapacheを再起動。しかしphpinfoにはpdo_mysqlは現れない。それどころかエラー。
PHP Warning: PHP Startup: pdo_mysql: Unable to initialize module
Module compiled with module API=20050922, debug=0, thread-safety=0
PHP compiled with module API=20060613, debug=0, thread-safety=0
These options need to match
in Unknown on line 0
ん~。どうやらバージョンが違うようだ。どうしてこんな食い違いが起こるんだろう。
その後、いろいろやってみたけどやっぱり動かない。なぜこんなことがおきるんだ。と思ってウェブを調べていたら、英語サイトにヒントが見つかった。そのサイトには、以下のコマンドを試してみろと書いてあった。
php -v
/usr/bin/php -v
/usr/local/bin/php -v
ん~、どういうことだろうと思いつつ、コマンドを打ってみたら、あれまぁ、結果が違うじゃん。バージョンとか。もしやと思って、rpmコマンドでインストールされているPHPのバージョンを調べてみた。そしてphpinfoでもバージョンを確認。そして愕然。
バージョンが違う。少し考えてわかった。PHPはrpmでインストールじゃなくて、コンパイルしてインストールされているんだ。しかもいろいろ調べてみたら、どうもapacheも手作業でインストールされているっぽい(だって設定ファイルの位置がRedHat系の場所と違うんだもん)。てことは、簡単お手軽RPM(もしくはyum)でインストールしようが、何しようが反映されないし、ディスクの肥やしになるだけってことか(性格にはCLI版PHPには反映されるわけだが)。
VPSにしても専用サーバにしても、開発の重要な要素である、PHPやapache、データベース周りはどのようにインストールされているのか知っておく必要がありそうだ。そもそも今回自分が借りているサーバだからいろいろできたけど、そうじゃなかったらサーバ屋さんに有償対応をお願いしたところだけど・・・、自分でやってみて初めて状況がわかったよ。
ということで、問題のpdo_mysqlはいまだにインストールできていない。今度また時間があったら再度チャレンジする予定。自分の家にあるPCにインストールしてあるんだったらとりあえずやっちゃうんだけど、レンタルしているサーバだから再インストールになったらまた費用がかかるから無理はしないことにした。
PHPはウェブのためだけの言語ではなくて、コマンドラインからも実行することができるし、Windowsのexeファイルだって作ることができる(納品したことがある)。
PHPでコマンドラインから起動するプログラムを作るのに、インタラクティブに動作するプログラムを作らないといけない案件をもった。インタラクティブなプログラムとは、プログラム中で何らかの入力を促されるような、対話形式のプログラムを指す。そういえば昔N88ベーシックでそういうのがあったなぁ、と懐かしく思い出したけれど、PHPではどうやったらできるんだっけ。でも調べたら、やっぱりできることがわかった(コマンドライン版というくらいなんだから、それくらいできないと・・・)。
ob_end_clean();
echo(‘Input your name: ‘);
$name=fgets(STDIN);
echo(‘Your name is “‘.$name.'”‘);
ミソはSTDIN。通常はfopenする等したリソースをfgets関数の引数として与えるのだが、そこをSTDINと標準入力からの入力待ち状態にしてやるとよい。あと1行目。バッファリングをonにしていると、プログラム終了まで何も出力されない(表示=プログラム終了)ので、順次表示するようにしてやる。
すっきり。
PHPはその用途によって大きく3つに分類される。それらはDSO版(モジュール版)、CGI版、CLI版だ。
DSO版はおそらくPHPで一番一般的な使い方で、PHPプログラムがapacheのモジュールとして組み込まれたPHPエンジンで解釈され実行される。一般的なレンタルサーバはたいていコレだ。
CGI版はPHPをCGIとして動作させるタイプだ。たいていはプログラムの一行目にCGI版PHPプログラム本体のパスを指定して実行させる。
CLI版PHPはコンソールにログインして実行するプログラムで使用されるものだ。CGI版とCLI版は基本的に似たようなものだが、CGI版はHTTPヘッダを出力するが、CLI版は出力しない点が異なる。以前はCGI版とCLI版の区別があいまいだった感があるが(厳密に区別はされていたのだろうが、使用者側での区別があいまいだったと思う)、現在は情報も多くなってきている。
さてCLI版PHPはコマンドラインからPHPプログラムを実行するわけだから、ウェブで(DSO版で)引数指定をする際の?hoge=fugaみたいな方法は使わない。当然コマンドラインから実行するわけだから、以下のような記述になる。
/usr/local/bin/php-cli ./hoge.php fuga piyo
上記はhoge.phpに引数fuga、piyoを与えて実行させている。これらの引数をPHPプログラム内で取り扱うためには以下のように指定する。
$_SERVER[‘argv’]
戻り値は配列となり、最初の値はプログラム本体(hoge.php)、2番目以降は引数として与えられた値、となる。具体的には上記の戻り値は以下のようになる。
array(0=>’hoge.php’,1=>’fuga’,2=>’piyo’)
よく似た環境変数で$_SERVER[‘argc’]というのがある。こちらは引数の個数を返すので、上記の場合の戻り値は「3」となる。
PHPでバックグラウンド処理を実施する場合は、上記のような知識が必要になる。