主なレンタルサーバーのPerl、Ruby、Pythonのパス
Perl、Ruby、Python などで書かれたCGIプログラムを実行する場合、ファイルの先頭(1行目)にインタプリタを指定する。 例えば Perl の場合は以下のように書く。
#!/usr/bin/perl
この表記はシバンと呼ばれ、各インタプリタへのパスを指定する。
パスはレンタルサーバーによって異なる場合がある。 以下は、私が利用したことがあるレンタルサーバーにおけるパスの例。 本記事更新時点のもの。
| PHP | Perl | Ruby | Python | |
| さくらのレンタルサーバ | /usr/local/bin/php | /usr/bin/perl | /usr/local/bin/ruby | /usr/local/bin/python |
| ロリポップ! | /usr/local/bin/php8.3 | /usr/local/bin/perl | /usr/local/bin/ruby2.6 | /usr/local/bin/python3.7 |
| エックスサーバー | /usr/bin/php8.3 | /usr/bin/perl | /usr/bin/ruby | /usr/bin/python3.6 |
| コアサーバー | /usr/local/bin/php | /usr/bin/perl | /opt/alt/ruby32/bin/ruby | /usr/bin/python3 |
| ConoHa WING | /usr/bin/php | /usr/bin/perl | /opt/alt/ruby25/bin/ruby | /opt/alt/python36/bin/python3.6 |
各言語にて複数のバージョンが選択できる場合、バージョンによってパスが異なる。 また、各社プランや新旧サーバーなどの違いでパスが異なる場合がある。
通常PHPのプログラムはパスを書く必要はないが、cronでPHPプログラムを実行する際に(cronのコマンドで)必要となる。
詳しくは公式サイトのヘルプをご覧下さい。
CGIプログラムが動作しない
CGIプログラムが動作しない、Internal Server Error などのエラーが出る場合、以下の原因が考えられる。
- 上述のパスの記述が正しくない。
- 実行ファイルのパーミッションが正しくない。
- ソースコードの改行コードがLF(\n)になっていない。
上2つについてはわりと知られているが、改行コードは見落としている場合がある。 Perlで書かれた古いCGIプログラムは、改行コードがWindowsで使われているCRLF(\r\n)になっていることがある。 昔はそれでもプロバイダのサーバーで動作していた時代もあったが、現在はエラーになる場合がある。
改行コードはテキストエディタで変換できる。 例えば、サクラエディタでは名前を付けて保存する際、保存時のウィンドウの下の方に「改行コード」があり、CRLF、LF、CRが選択できる。
env 表記
パスは以下のような表記が出来る場合がある。
#!/usr/bin/env perl
このように書くことでサーバーによってパスが異なっていてもパスを書き換えなくて済む。 ただし、これで動作するかはサーバーによる。 さくらのレンタルサーバで試したところ、Perl、Ruby、Python についてCGIプログラムが動作するのを確認した。
Perl#!/usr/bin/env perlRuby
#!/usr/bin/env rubyPython
#!/usr/bin/env python
ただし、各言語にて複数のバージョンがインストールされている場合、どのバージョンが実行されるか分からないので注意する必要がある。 どのバージョンが実行されているのか確認した方が良い。