eject API for PHP
C Shell PHP
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
manual
nbproject
tests
.cvsignore
.gitignore
CREDITS
EXPERIMENTAL
LICENSE
README.md
config.m4
config.w32
eject.c
eject.dsp
eject.xml
package.xml
package2.xml
php_eject.h

README.md

php-eject

使い方

$ 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) の実装をパクリ、元い、コピペしたものです。

Unix-likeなOSでのビルド・インストール

$ phpize
$ ./configure [--enable-eject] 
$ make
$ make test
$ [sudo] make install

インストールの後、以下の行を php.ini に追加してください。

extension=Eject.so

Windows

php_Eject.dll を、お使いの PHP の extension_dir にインストールし、以下の行を php.ini に追加してください。

extension=php_Eject.dll

コマンドラインから次のように Eject できます。この例では E ドライブを用いています。

php -r 'eject_toggle_tray("\\\\.\\E:");'