- ベストアンサー
HTML表示での実行でファイルが書き込みモードで開けない
perlの勉強をしていて困っています。 perlをHTML表示で実行した時にファイルが書き込みモードで開けません。コマンドラインで実行すると開いて書き込まれます。よってファイルの書き込み禁止などでは無いようです。以下がソースです。 #!/Perl/bin/perl $|=1; print "content-type: text/html; charset=Shift_JIS\n\n"; open(OUT, ">other.html") or die "not open"; print OUT "test"; close(OUT); 読み込みモードでは成功します。フリーのCGIなども見ましたが通常は出来るはずだと思うのですが・・・。 ちなみにperlはApache2.0で動作させています。こちらの設定の問題でしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
そのソースのままで(perlのパスだけうちのに書き換えて) WinXP+Apache2.0.55 でちゃんと書き込めてますよ デフォルト状態のwindowsのフォルダなら書き込み可なので 仮にパスが違っていても、新たにfileが生成されますし、、、 一応判りやすくするために #!/usr/local/bin/perl $|=1; print "content-type: text/html; charset=Shift_JIS\n\n"; open(STDERR, ">&STDOUT");#エラーを画面に表示 open(OUT, ">>other.html") or die "not open"; print OUT "test<BR>\n"; close(OUT); __END__ と変えて ブラウザで http://***/****/a.cgi にアクセスすると何も表示されませんがエキスプローラで確認するとother.htmlが生成されています。 http://***/****/a.cgi をリロードしてから ブラウザの別タブで file:///C:/home/hoge/public_html/other.html とfileとして開いて CGIの方をリロードするたびに fileの方もリロードすると ちゃんと2行、3行と増えていきます エキスプローラでother.htmlを右クリックしてプロパティ >読み取り専用にチェックを入れ(unixで言うパーミッション -wxですな) 再度CGIにアクセスすると not open at C:/home/hoge/public_html/a.cgi line 5. とエラーメッセージが、、、 答えになっていませんが、参考になりませんか?
その他の回答 (5)
OSがWindowsということなので、アクセス権限ではないと思いますが、 「書き込みができない」という確認はどのようにされましたか? それぞれ対処法は違いますので、以下の点でどの状態になっているのか、教えていただけますか? (解決されているのであればいいのですが) 1) ファイルをオープンできない("not open"が表示される)のか、 2) ファイルがない状態でCGIを動かすと、ファイルが作成されるが、ファイルの内容は何も書かれていないのか、 3) あらかじめ何かを書いて保存しておき、そのCGIを動かすとファイルの内容が消されるのかどうか たぶん関係ないと思いますが、 $|=1; をコメントアウトして、出力バッファを使うようにしてみるとどうなりますか? また、正常に保存できたとして、HTMLは出力されていますでしょうか? (HTMLを出力しなくても保存はできますが、ブラウザにはInternal serever errorが表示されますので、誤解されてるだけのこともありますので、一応確認を、、、)
お礼
返答ありがとうございます。Apacheを入れなおしたら解決しました。初めて質問したので問題解決の手続きをしていませんでした。お手間をとらせて申し訳ありませんでした。 とりあえず質問にお答えします。 1)not openと表示されます。 2)ファイルも作成されませんでした。 3)消されません。 $|=1;をコメントアウトしますと、エラーは出ませんがopenコマンドは実行されませんでした。コマンドラインで正常に動作した場合はHTMLで出力されます。以上です。
- ren10
- ベストアンサー率52% (9/17)
Windows XP + Perl + Apache という事で… 当方も同じ環境があるので試してみました。 test.cgi として other.html は置かずに試してみると… test.cgi と同ディレクトリに other.html が作成されて ちゃんと書き込みも出来ました。 一度 other.html を削除して試してみては… また Apache の error.log には何かエラーを吐いてないでしょうか?
お礼
返答ありがとうございます。Apacheを入れなおしたら解決しました。初めて質問したので問題解決の手続きをしていませんでした。お手間をとらせて申し訳ありませんでした。
- ___noboru___
- ベストアンサー率28% (33/117)
これはOSによって違うことですが、たとえば UNIX 系 OS の場合、ウェブサーバのプロセスの uid とディレクトリのオーナーが違っていて、尚且つパーミッションが 770 などの、他の人が書き込めない状態になっているとファイルは作れません。 また、Linux で SELinux の機能により読めないとか書けないとかCGIが実行できないとかの症状が出ることがあります。 ただこのような原因だった場合、 OS や環境固有の問題であり Perl の問題ではありません。OS やそのバージョン (またはディストリビューションとそのバージョン) やファイルシステム、使用しているウェブブラウザとそのバージョンなどを明らかにして他のカテゴリで聞いた方がいいかも知れません。
お礼
返答ありがとうございます。 どうやらperlの構文の問題ではなさそうなので、とりあえずもやもやは取れました。
- ren10
- ベストアンサー率52% (9/17)
コマンドラインではどのように確認を? > perl ファイル名.cgi ↑こんな感じでしょうか? とすると…perl のパスが間違っているとか・・・ あるいは unix 系 OS 上での事でしたら ファイルのパーミッションに問題ありとか・・・ サーバエラーとは表示されませんか? 単純に書き込み出来ないだけでしょうか?
補足
確認はren10さんの通りです。 書き込みだけで、ほかのプログラムは動きますのでパスではないと思います。コマンドラインでは書き込めるのでパーミッションではないと思います。OSはWindowsXPでpwel5を使用しています。 単純に書き込みだけが出来ないんです。訳がわからないです。
- ___noboru___
- ベストアンサー率28% (33/117)
その other.html のファイル名をフルパスで書いてみたらどうでしょうか。
お礼
返答ありがとうございます。フルパスも試してみましたがダメでした。 通常は問題なく出来るはずなのかどうかだけでも知りたい所です。
お礼
詳しいご説明ありがとうございます。 上記を試してみましたが、やはりダメです。 とりあえずperlのプログラムに問題がある訳ではないみたいですので、他のPCで試してみる事や、apacheの再インストール、あるいはapache以外のwebサーバーで試してみます。