$ php -a
Interactive shell
php > eject_toggle_tray("cdrom");
php > eject_close_tray("cdrom");
Ejectコマンドユーザー会を見つけて徹夜明けのどうしようもないテンションで作りました。
Ejectコマンドユーザー会の GitHub リポジトリ を眺めていると eject は以下のように行われていました。
Eject-Command-Users-Group/minimum-sample.php
exec('/usr/sbin/eject -T /dev/sr0');
実装方法としてはとってリ早い exec のコール。しかし、 PHP の exec の実装は popen(3) を用いています。
php-src/TSRM/tsrm_virtual_cwd.h
このため、内部的に eject を実装するのに比べ、いくらかオーバーヘッドが生じます。
man popen(3) によると、
FILE *popen(const char *command, const char *type);
(中略)
popen() 関数は、プロセスをオープンする。具体的には、パイプを生成し、フォークを行い、 シェルを起動する。
とあります。つまり、「パイプを生成し、フォークを行い、 シェルを起動」というあたりがオーバーヘッドになり、 大規模な eject サービス ではこれがボトルネックになりうると考えられます。 そこで eject を PHP に組み込もうと考えるに至りました。 php-eject の実装はシンプルで、ほとんどが eject(1) の実装をパクリ、元い、コピペしたものです。
$ phpize
$ ./configure [--enable-eject]
$ make
$ make test
$ [sudo] make install
インストールの後、以下の行を php.ini に追加してください。
extension=Eject.so
php_Eject.dll を、お使いの PHP の extension_dir にインストールし、以下の行を php.ini に追加してください。
extension=php_Eject.dll
コマンドラインから次のように Eject できます。この例では E ドライブを用いています。
php -r 'eject_toggle_tray("\\\\.\\E:");'