Perl、Ruby、Python などで書かれたCGIプログラムを実行する場合、ファイルの先頭(1行目)にインタプリタを指定する。 例えば Perl の場合は以下のように書く。
#!/usr/bin/perl
この表記はシバンと呼ばれ、各インタプリタへのパスを指定する。 詳しくは シバン(Wikipedia) を参照。
パスはレンタルサーバーによって異なる場合がある。 以下は、私が利用したことがあるレンタルサーバーにおけるパスの例。 本記事更新時点のもの。
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プログラムが動作しない、Internal Server Error などのエラーが出る場合、以下の原因が考えられる。
上2つについてはわりと知られているが、改行コードは見落としている場合がある。 Perlで書かれた古いCGIプログラムは、改行コードがWindowsで使われているCRLF(\r\n)になっていることがある。 昔はそれでもプロバイダのサーバーで動作していた時代もあったが、現在はエラーになる場合がある。
改行コードはテキストエディタで変換できる。 例えば、サクラエディタでは名前を付けて保存する際、保存時のウィンドウの下の方に「改行コード」があり、CRLF、LF、CRが選択できる。
パスは以下のような表記が出来る場合がある。
#!/usr/bin/env perl
このように書くことでサーバーによってパスが異なっていてもパスを書き換えなくて済む。 ただし、これで動作するかはサーバーによる。 さくらのレンタルサーバで試したところ、Perl、Ruby、Python についてCGIプログラムが動作するのを確認した。
Perl#!/usr/bin/env perlRuby
#!/usr/bin/env rubyPython
#!/usr/bin/env python
ただし、各言語にて複数のバージョンがインストールされている場合、どのバージョンが実行されるか分からないので注意する必要がある。 どのバージョンが実行されているのか確認した方が良い。