目次
PHP/CGIについて
≫公式マニュアル ─ CGI・SSIについて
警告 PHP-CGIモード(自分でインストール 〜 version 5.4.2、5.3.12)
ご自分でbuildしている場合は、必ず確認してください。
CGIモードで
PHP 5.4.3 、 PHP 5.3.13より前のバージョンを使っている場合は
早急に最新版へアップデートしてください。
単純なクエリでソースコードが表示されてしまいます
詳しくは、php公式リリースアナウンス
[08-May-2012] PHP 5.4.3 and PHP 5.3.13 Released!
[06-May-2012] PHP 5.3.12 and 5.4.2 and the CGI flaw (CVE-2012-1823)
をみてください。
URLにアクセスすることで問題が発生するか簡単に自分で調べることができます。
関連ページ
- ファイルマネージャー(ファイルマネージャーでCGIを設置する方法や、削除できなくなったファイルの対策)
各言語について
- Perl(このページ内で扱ってます)
- PHP(このページ内で扱ってます)
- Ruby
- Python(話題に上がっていません)
CGIについて
さくらで用意されたCGIにはどんなのがある?
CGIがうまく動かない!
- さくらではCGIはsuExecでCGIを起動して所有者権限で動作するから、フォルダやスクリプトのパーミッションは755や705にする。777や707では動かない。
- ファイル名やフォルダ名は大文字/小文字で区別されます。意図してる通りのファイル名であるかチェック。適切でないと404エラーになったり、スクリプト内でファイルが呼び出せず500エラーになる場合があります。(FTPクライアントによっては大文字・小文字を自動で修正してしまう場合があるようなので注意)
- CGIの説明書に書かれているパーミッションで動かなかったら、フォルダとスクリプトは755、それ以外は644にして試すのがいいかと。
- それで動いたら、705と604に下げて試すのもいいかと。
- ブラウザで直接参照しないデータファイルは600でOK(データファイル名が配布スクリプト既定のままでも覗き見出来ないから、それが安全)
- フォルダ名にチルダが含まれていると動かない。
- WinやMacなら、必ずアスキーモードでFTP転送すること。バイナリモードだと改行コードの違いで動かない。
- さくらのレンタルサーバにインストールされているperlは64bit intなので、使用しているCGIが32bit intモードPerlのみでしか対応してないと動かない場合がある。
- telnetでCGIの不良動作を確認してみるのもアリ。(たとえその気がなくても)恐ろしい量のメモリを占有していると503になるため、サクっと消すとサクっと動くようになる(下の項を参照)。
- やっぱりInternal Server Error(500)が出ます.
- スクリプトに何らかのエラーが発生しています.以下について確認してみてください.検証はローカル環境で行うこと.
- コメント外のスクリプト中に全角文字(全角スペース等)が含まれている.
- 文字コードが規定されているものではない.(Shift_JIS→EUC-JP等)
- 改行コードが規定されているものではない.(↑×3)
- 行末にセミコロンがない.文字列リテラルが適切に閉じられていない.
- Perlについてはターミナルから「perl -c ファイル名」で構文チェックが行えます.
- それでもどうしても動かなければ、スレ10-792の言葉を思い返そう。
一回、鯖上のCGIもローカル上のCGIも全部消してごらん。
そして、コーヒーなりお茶なりで一服してごらん。
落ち着いたら、もう一回CGIを落としてきて、
説明書きに書いてある通りに、何も考えずにやってごらん。
大混乱してるときには何やっても上手くいかないよ。
落ち着いてマターリと。
チャットCGIが頻繁に503 Service Temporarily Unavailableになるけど?
- アカウント当たりの負荷限界以上にCGIを実行すると503がでる。
- 不良プロセスが溜まっていなか確認しよう(コントロールパネル→リソース情報→1分以上動作しているプロセス)
- 503が出ることにより、他人の負荷影響を受けて重くなることがないようになっているから、同時に動作させるCGIの数を減らす、負荷の低いCGIに変更するなどで対策するしかない。
- 重いCGIを使っていないのに、頻繁に503が出るようなら変ならサポートに相談を。
- どうしてもダメなら、アカウント当たりの負荷限界が高い上位プランへ移行すべし。試用期間を使って、よーく考えよー♪
外部WEBサーバへのソケット通信できますか?
ポートにもよります。80番ポートは使えるようになりました。
$ENV{'REMOTE_HOST'}でリモートホスト読み取れない
7/27頃から取得できるようになりました(以前は一部のサーバでしか取得できなかった)。
$remotehost = &nslook($ENV{'REMOTE_ADDR'});
sub nslook {
local($x)=@_;
local($ip,$addr);
if ($x =~ /(?d+)?.(?d+)?.(?d+)?.(?d+)/ ){
#↑は↓に比べてなんか変じゃないか?
# if ($x =~ /(?d+)?.(?d+)?.(?d+)?.(?d+)/ ){
$ip="$1.$2.$3.$4";
$addr = (gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0];
if ($addr ne "") { return $addr; } else { return $ip; }
}
return "$x";
}
キャッシュされるとはいえあんまDNS鯖に負担かけんようになー
上記のようにあるが$ENV{'REMOTE_HOST'}も取れるし、生ログにも記録されてる。プランか、.htaccessのアクセス制限にホストでの制限を入れてるせいか?(うちのは7/16からいけたよ)
ファイルマネージャーでCGIスクリプトを転送して設置したい
ファイルマネージャーのページの記載内容でどうぞ。
重いCGIをなるべく迷惑をかけずに実行したいのですが
- niceやreniceを使って優先順位を下げましょう。
- 参考
さくらサーバでPerlスクリプトを実行する場合
実行するPerlスクリプトを格納するフォルダ [1,5,7][0,1,4,5][1,5]
実行するPerlスクリプト [5,7][0,1,4,5][0,1,4,5]
- 最小、フォルダ101&スクリプト500で動く。
- 新たにPerlスクリプトを設置して「Internal Server Error」が消えない場合、フォルダ705&スクリプト705/755のパーミッションを試してみてはどうだろうか。
PHPについて
PHPがうまく動かない!
- PHPのモジュールがCGIタイプなので対応ファイルのパーミッションを実行可能に変えよう(705など)
- PHPはregister_globalsがoffなので$DATAで引数を取得できない為$DATA=$_GET['DATA']や$DATA=$_POST['DATA']を使用する必要がある。
- extract($_GET); extract($_POST);で一応対処は可能。
- MySQLで一部の命令を使用出来ないため、phpMyAdminでテキストデータの読み込みによるインポートができない。
- AddHandler php-script .hogeも手
- kankichi@blog:SAKURA edition: MT/カテゴリーのページ分割〜PHP化〜
xoopsのインストール画面が表示されずInternal Server Errorになる。
- フォルダとphpファイルのパーミッションを755か705にする。
数が多いからftpソフトにアップ時にパーミッションを変更する設定があるなら活用すべし。
(公式のXOOPSインストールオンラインマニュアル )
- 特に5.ファイルのアップロードは他のPHPアプリにも応用が効くのでマスターすること。
- FFFTP以外でアップ時にファイルのパーミッションを変更できるソフトってあるのか?教えて偉い人!!
- アップロード後に、telnet/ssh でログインして、以下のコマンドで一気に変更できる。(xoops/ は、/home/foo/www/xoops)
find xoops/ -name "*.php" -exec chmod 755 {} \;
- DBアカウントも取っておく。
ユーザー名とデータベース名は、ともにユーザー名で。DBホスト名はmysql*.db.sakura.ne.jpになる。
p2をインストールしましたがcurlが使えません。
- curlのソースをサーバ上でコンパイルしてください。
- 2004/8/21頃に自分でコンパイルしなくてもcurlが使えるようになったとの話もあり。www218で <?php phpinfo() ?> したらしっかり CURL support:enabled とあった。
- www212も<?php phpinfo() ?>→CURL support:enabled と出た。
- www208も CURL support:enabled と出た。
NucleusでFancyURLを使う方法
■ .htaccess の変更
ForceType application/x-httpd-php は
ForceType application/x-httpd-cgi に変更
■ extra/fancyurls/* の変更
・先頭に "#! /usr/local/bin/php" の追加
・serverVar('PATH_INFO') を serverVar('ORIG_PATH_INFO') に変更
でrootにコピー(実行属性付けてね)
(※ fancyurls.config.phpは先頭にパスを追加しない)
・include('./ を include(' に変更 ( ./ を消す)
■ php.ini の編集
cgi.force_redirect=0
cgi.fix_pathinfo=1
■ libs/globalfunctions.php の変更
・262行目あたりの、
serverVar('PATH_INFO') を serverVar('ORIG_PATH_INFO') に変更
サイトのrootじゃなくてNucleus配下に専用の.htaccessやphp.iniを置くのが良い
※NP_CustomURLの導入も検討されたし。上記のような面倒なことをしなくても一発でスラッシュ区切りのURLにできる。
さくらサーバでPHPスクリプトを実行する場合
(参考情報 2004/12/01)
実行するPHPスクリプトを格納するフォルダ
○ パーミッション705
× パーミッション707
× パーミッション777
× パーミッション704(当然Forbidden)
○ パーミッション701
実行するPHPスクリプトのパーミッション
○ パーミッション700
○ パーミッション705
○ パーミッション755
× パーミッション775
× パーミッション777
○ パーミッション500
× パーミッション600
PHPスクリプトの1行目に
#! /usr/local/bin/php
を記述する必要は無し
記述があってもコメントアウト処理される
データフォルダ等、内部処理に関連したファイルとフォルダは
上記の設定に因らない。
さくらサーバで新規にPHPスクリプトを設置して
「Internal Server Error」が消えない諸兄は
フォルダ705、スクリプト705/755のパーミッションを
試してみてはどうだろうか。
(追記)
ベテランユーザは独自にPHP.iniを設定している模様であり
上記の方法が最適とは限らない。
さくらサーバで PEAR を自由に使いたい場合
PEAR はインストールされてはいるものの、バージョンが古いので基本的に使い物にならない。したがってローカルコピーを使用する。ローカルコピーの作り方は以下を参照。
SSHを使った方法、ftpを使った方法、どちらも可能。
http://pear.php.net/manual/ja/installation.shared.php
注意点としては、上ページで例としてあがっているコマンドは、そのまま実行すると 〜(チルダ)付きのフォルダが出来る。多分デフォルトシェルが (FreeBSDなので)tcsh のせい?あともしそのまま tcsh を使っているなら、パスの追加も .bashrc ではなく .cshrc に追加( $HOME/pear/bin )。
うまく言っていれば、ホームディレクトリに .pearrc というファイルが出来ていて、pear list とした時に、自分のローカルにインストールされた PEAR ライブラリが表示される。
PEAR パッケージを使うコードにおいていちいち include_path を書くのは面倒なので、php.ini をいじる。
include_path=".:/home/HOME/pear/lib"
さくらサーバで PHP エラーログを取りたい場合
php.ini に以下を追加。
display_errors="0"
error_reporting="2047"
log_errors="1"
error_log="/home/HOME/php-error.log"
ssh でログインして、php-error.log ファイルを先に作っておき、アクセス権を適切に設定する事も忘れない。
GD使えますか?
/usr/local/bin
です。
NetPBM使えますか?
zipinfo使えますか?
- 一応、存在はしてますが使えるかどうかは未確認です。
パスは
/usr/local/bin/zipinfo
です。
unzip使えますか?
/usr/local/bin/unzip
です。
SQLite使えますか?
- PHPモジュールにv2.8系が入っているので使えます。
- サーバコントロールパネルの「PHP設定ファイルの編集」から、php.iniに次の2行を追加して下さい。
extension_dir = "/usr/local/lib/php/20020429/"
extension = "sqlite.so"
- インストール済みやpear?のversion2.8.14は、ダブルクオートで列名をくくると正常に動作しないバグがあるので注意。
- select sqlite_version()で確認するといい
- "keyword"が必要なら、自分でmakeして2.8.17を使うことをおすすめする
- PHP5以降ではSQLiteは基本的に標準で使用できるようになっている。
- PHP5.1以降ではPDOとPDO_SQLITEも標準になった。「sqlite2:」で呼び出せば2系も使える。
- PHP5.3以降はSQLite3(拡張版SQLite)も標準に。
- SQLiteのバージョンは、PHP5.2.xが3.3.7、PHP5.3.xが3.7.3。
.php以外の拡張子でPHPを動かしたい
※"somewhere"の部分は自分の環境に合わせて適当に読み替えること
- /usr/local/bin/phpを~/www/somewhereにphp.cgiという名前でコピーして、実行権を付けておく。
(サーバーによっては上記ディレクトリでなく、/usr/local/php-4.4.7/bin/phpにあることも。例:サーバー1264)
- .htaccessを設定する(下記例は.jsで使う場合)
AddHandler myphp-script .js
Action myphp-script /somewhere/php.cgi
- 次の、自分でインストールしたPHP5を使う方法とほぼ同じ。自分でインストールするかわりに/usr/local/bin/phpをコピーするだけ。(OSがバージョンアップした時は取得しなおすこと。そのままだと500エラーになる。)
- ver6対策 PHP自動置き換え
シェルでしか確認していないので, cronできちんと動くかは不明
#! /usr/local/bin/bash
V=$(uname -r | /usr/bin/grep 4.10)
if test $V = ''; then
cp -f /usr/local/bin/php ./php.cgi
# ↑ ここを置きたい場所に書き換える
# auto delete self
rm $0
fi
PHP5.x/5.3使えますか?
- 2007年12月頃から一部の鯖で試用版として「PHPのバージョン変更」が提供されており、PHP5も選択できるようになった。
- 2011年1月頃から試験的にPHP5.3も提供を開始。
- PHP5.3ではMySQL4.0は使用できないので、MySQL5.1にする必要がある。
- 選択できるのは「標準のPHP(PHP5.2)」「PHP5.3.x」「PHP5.2.x」「PHP4.4.9」の4つ。
- 標準のPHPは2008年6月ころにPHP4.4からPHP5.2になったもよう。
- PHPのマイナーバージョンアップが行われるときは、大体1ヶ月くらい掛けられる。そのさいは一時的に選択バージョンが増えることになる。マイナーバージョンアップ期間が終了すると古いマイナーバージョンは削除され、古いマイナーバージョンを選択していた場合は強制的にマイナーバージョンアップさせられる。
- 2008年1月29日から正式にPHP5が提供される予定
- どのバージョンのPHPを使用するかは、$HOME/.php.versionという設定ファイルに記録される。なので、自分でインストールしたPHPに対してパスを設定すればそれだけで動作する?(未検証)
PHP5を自分でインストールする場合
- 自分でインストールしたphp-cgi5を~/www/somewhereにphp.cgiという名前でコピーして、実行権を付けておく。
- critical changed 5.23 : php5 -> php-cgi5
- OSがアップデートされた場合は、再インストールする必要がある。
- FreeBSD 4.10→6.1にアップデートした際に下記のエラーが出て動かなくなった。とりあえず再インストールで解決。
/usr/libexec/ld-elf.so.1: Shared object "libcurl.so.3" not found, required by "php5"
- .htaccessを設定する(下記例は.php5で使う場合)
AddHandler myphp-script .php5
Action myphp-script /somewhere/php.cgi
- 前の、php以外の拡張子でphpを使う方法とほぼ同じ。元からあるものをコピーするかわりに、自分でインストールしたものをコピーするだけ。
./configure --prefix=$HOME/local --with-config-file-path=$HOME/local/etc --program-suffix=5 --with-pear=$HOME/local/share/pear5 --enable-force-cgi-redirect --enable-mbstring=all --enable-mbregex --enable-mbstr-enc-trans --enable-versioning --enable-trans-sid --with-mysql --with-openssl=/usr --with-soap=yes --with-zlib=/usr --with-gd=/usr/local --with-jpeg-dir=/usr --with-freetype-dir=/usr --with-ttf --with-png-dir=/usr --with-curl --with-iconv=/usr/local |
- configure設定例2(PHP5.2.6で上記設定がエラーとなったため)
./configure --prefix=$HOME/local --with-config-file-path=$HOME/local/etc --program-suffix=5 --with-pear=$HOME/local/share/pear5 --enable-force-cgi-redirect --enable-mbstring=all --enable-mbregex --with-mysql --with-openssl=/usr --enable-soap --with-zlib=/usr --with-gd=/usr/local --with-jpeg-dir=/usr --with-freetype-dir=/usr --with-ttf --with-png-dir=/usr --with-curl --with-iconv=/usr/local |
- インストール先は「/home/(ユーザ名)/local」の下(binとかetcとかいろいろ作る)
- 実行時に読み込まれるphp.iniの場所は「/home/(ユーザ名)/local/etc/php.ini」
- 参考サイト→nazonoDiary
補足
configureは
http://d.hatena.ne.jp/nazoking/20041213/1102925275
変更点は--prefix=$HOME/localに--with-iconv=/usr/localを追加
CGIの実行ファイルは5.23からphp-cgiに変更になったぽいので
cp ~/bin/php-cgi5 ~/www/cgi-bin/php5.cgi
PHP5.3を自分でインストールする場合
基本は、PHP5を自分でインストールする場合と同じ
- さくらのgccが古いせいで落ちた(スタンダード 406サーバー)
php_src/php-5.3.3/ext/sqlite3/libsqlite/sqlite3.c: In function 'unixDlError':
php_src/php-5.3.3/ext/sqlite3/libsqlite/sqlite3.c:26419: warning: assignment discards qualifiers from pointer target type
gcc: Internal error: Killed: 9 (program cc1)
Please submit a full bug report.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
gmake: *** [ext/sqlite3/libsqlite/sqlite3.lo] Error 1
gcc -v : gcc version 4.2.1 20070719 [FreeBSD]
cronでPHPを使いたい
- PHPのコマンドラインオプションとしてphpファイルを指定する。
- コントロールパネルの「サーバ情報の表示」などからPHPのインストール場所を確認しておく。
- /usr/local/bin/phpにインストールされているなら、
cd /home/アカウント名/ ; /usr/local/bin/php hoge.php > /dev/null
例では実行結果がメールで飛んでくるのを防ぐために > /dev/nullを付けている。
/usr/local/bin/php /home/アカウント名/hoge.php > /dev/null
ライトだけどPHPを使いたい
- 2012年8月8日(水)からライトプランでもPHPが使えるようになりました。
- 基本的にライトではPHPを使えませんが、自分で正しくインストールすれば裏技的に使えます。
- .htaccessを設定する(下記例は~/www/somewhereに設置して.phpで使う場合)
AddHandler myphp-script .php
Action myphp-script /somewhere/php.cgi
- 前の、php以外の拡張子でphpを使う方法・自分でインストールしたPHP5を使う方法とほぼ同じ。PHP4でもPHP5でも自分でインストールしたものをコピーするだけ。
- ただし、さくらにPHP利用が発覚した場合のリスクを考えて行うように。
- 念のためサポートに連絡したところ、PHPを自分でインストールして使用する事は規約、禁止事項に触れる事柄ではなく、特に問題は無いとの事。ライトプランではtelnetやSSHが使えないので面倒ですが…
XML宣言を記述するとエラーを出力する
- Parse error: syntax error, unexpected T_STRING
このようなエラーが出力されたら次のように記述して工夫をしよう:
<?php echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>' ?>
またはPHP設定ファイル(php.ini):
short_open_tag = Off
使いたい関数が「Fatal error: Call to undefined function」となる
- まず、単純に関数の名前が間違っていないか見直せ。
- さくらのPHPはcgi版なので,モジュール版で用意されている関数は定義されていない。
- Apache用関数
- apache_lookup_uri()
- apache_note()
- apache_request_headers(), getallheaders()
- virtual()
- ascii2ebcdic()
- ebcdic2ascii()
SSIについて
execで上位ディレクトリのコマンドを呼び出せない
セキュリティ上そうなってます(どうも最近のApache自体がそういう仕組みらしい)。
上位ディレクトリのコマンドを呼び出す必要があれば、そのコマンドを呼び出すよう記述したシェルスクリプト等をSSIで呼び出して使いましょう。
ちなみに、SSIのexecで呼び出した場合、rootは見ているウェブサイトのrootになるようです。
例えば、http://hogehoge.sakura.ne.jp/(以下略)中だと/home/hogehoge/www/が/になります。
基本的なコマンド(echo等、/binにあるような)がexecで呼び出せない
それらの基本的なコマンドも、/bin等の上位ディレクトリなので、直接execで呼び出しはできません。
そのコマンドを呼び出すよう記述したシェルスクリプトをSSIのexecで呼び出して使いましょう。
現状動作報告のあるモノ
- Nucleus japan.nucleuscms
- MT(MovableTypeインストールマニュアル ) (ライトならBerkeley DBで動かせ)
- MT4は公式サイトのマニュアルにさくら用インストールガイドあり。ただしBerkeley DB非対応のため、ライトではSQLiteを利用)
- Xoops (Xoops インストールマニュアル )(スタンダードプラン以降)
- WordpressME (XOOPSのインストールマニュアルを参考のこと。 )(スタンダードプラン以降)
- p2(ホスト規制に引っかかって書込みは不可。 ●(2ちゃんねるビューア )を持っていればcurlをインストールすることによって投稿可能らしいが、
- 2004/10/08現在2ch側のDeny規制により一部のサーバで●を使った読み込み/書き込みも不可)
- deny from 202.181.96.0/20された模様……
- PukiWiki (.htaccess を消しちまえ)→1.4.5_1だと消す必要はない。パーミションの設定をいじる。1.4.6は付属のINSTALL.txtのパーミッション通りで全て動きました。問題ありません。
- PukiWiki Plus! (.htaccess を消しちまえ)→1.4.5_1だと消す必要はない。パーミションの設定をいじる。
- osCommerce (php.ini にてregister_globals を On にする。但しさくらのサーバはSSLが使えない)
- SquirrelMail(さくらのWebメールに不満なら、これを導入)。HTTPS内で動かすヒント→https
- mobileimap 携帯電話用IMAPwebメーラ。(スタンダードプラン以上)http://www.namazu.org/~satoru/mobileimap/
- Gallery2 何の問題もなくインストール&利用できました
- phpBB
- joomla!じゃぱん joomla.jp
- MODx 何の問題もなくインストールできる。運用も問題なし
- SimpleMachinesForum? simplemachines URLに?を用いないようにするには、php.iniにcgi.fix_pathinfo=1を加える
- NOTA スタンダードプランで設置できました。デフォルトではOptions指定があるので.htaccessを消去。
- EC CUBE 設置、運用ともに可能。しかしPHPに手を加える必要あり。さくらの問題よりもEC CUBEとMySQLの相性が悪すぎる。従ってさくらでの運用は不向き。
namazu のインストール
アカウント名を hiroyuki とする。
まず、kakasi をインストールする。
$ wget http://kakasi.namazu.org/stable/kakasi-2.3.4.tar.gz
$ zcat kakasi-2.3.4.tar.gz | tar xvf -
$ cd kakasi-2.3.4
$ ./configure --prefix=/home/hiroyuki/local
$ make
$ make install
/home/hiroyuki/local/bin に PATH を通すこと。そうでないと、namazu の実行が失敗する。
次に、namazu のインストール
$ wget http://www.namazu.org/stable/namazu-2.0.14.tar.gz
$ zcat namazu-2.0.14.tar.gz | tar xvf -
$ cd namazu-2.0.14
$ cd File-MMagic
$ perl Makefile.PL LIB=/home/hiroyuki/local/lib INSTALLMAN3DIR=/home/hiroyuki/local/man
$ make
$ make install
$ cd ..
$ ./configure --disable-shared --prefix=$HOME/local/namazu --with-pmdir=$HOME/local/lib --with-libintl-prefix=/usr/local
$ make
$ make install
mknmz は /home/hiroyuki/local/namazu/bin/mknmz にインストールされます。
namazu.cgi は /home/hiroyuki/local/namazu/libexec/ にあります。
使えたモジュールとインストール済みライブラリ/モジュール
- GD.pm
- http://homepage3.nifty.com/hippo2000/perltips/GD.html
- Perl/ライブラリ一覧(PL)
- perl/ライブラリ一覧
- Perl/モジュール一覧(PM)
- perl/モジュール一覧
- Ruby/ライブラリ一覧
- Ruby/ライブラリ一覧
- Python/ライブラリ一覧
- Python/ライブラリ一覧