No.3ベストアンサー
- 回答日時:
なるほど、片方がPHPでしたか。
それではやむを得ないかもしれませんね。一応お書きになったような内容で、当方の環境だと成功するのですが…。
write.cgiを呼び出すopenが失敗しているのかもしれません。失敗するとdieで
そのエラーメッセージを出力してますが、これはサーバのerror_logに出力
されるので、ブラウザからでは確認できませんね。失礼しました。
ではstart.cgiを以下のように修正してみてはどうでしょう。
#!/usr/local/bin/perl
$param = 'a=123&b=xyz';
$ENV{CONTENT_LENGTH} = length($param);
$ENV{REQUEST_METHOD} = 'POST';
print "Content-type: text/html\n\n";
open(OTHER_CGI, "|./write.cgi") or print "error: $!";
print OTHER_CGI $param;
close(OTHER_CGI);
print "success!";
要するに成功したらsuccess、失敗したらerror:でエラーメッセージを
出すようにしたわけです。Content-typeヘッダの後じゃないとちゃんと
出力されないのでその行も上に移動させてください。
ひょっとすると、CGIが実行されるときのカレントディレクトリが
違うのかもしれませんね。./write.cgiをフルパス、すなわち
例えば/my/home/directory/にあるのでしたら
「/my/home/directory/write.cgi」として指定してみてはどうでしょう?
(URLではこの場合ダメです)
この回答への補足
出来ました!! どうやらwindows上で行っていたのが原因のようで、
linux で行ったところ、success表示とともに、ファイルが生成されました。
そして、変数の受け渡しも出来ました!!
詳しい説明、どうもありがとうございました。
No.2
- 回答日時:
私の推測は当たっていたようですね。
(せめて当たっていたかどうかをお教えくださると嬉しいのですが)
$ENV{CONTENT_LENGTH} = length($param);
$ENV{REQUEST_METHOD} = 'POST';
も必ず実行してください。また、abc.cgiはただの例ですから、
適宜二つ目のCGIの名前を指すよう変更してくださいね。
> CGIのなかから、他のCGIを実行させる、というのはやったことがないもので、、、
やったことがある人はかなり少ないと思います。というのは普通
その必要はないからです。
No.1にも書きましたが、私なら
> まあ普通ここまでする前に、どちらのプログラムも自分で編集できるなら
> 共通部分をライブラリ(モジュール)として別ファイルにくくり出して、
なんとかします。例えば、ファイルを生成する部分を共有するのだったら
1. ファイルを生成するサブルーチン(仮にfileputとします)だけを
まとめて util.pl(別に名前はなんでもいいんですが)とする。
2.1つ目のCGI の最初のほうに
require "util.pl";
と書いてutil.plを読みこみ、ファイル生成のときには &fileputを
呼び出して生成させる。
3. 2つ目のCGIも同じように
require "util.pl";
と書いて、やはりfileputを呼び出す。
それとも2つ目のCGIはもらいものかなにかでご自分で直すのが
たいへんなものなのでしょうか?具体的に言うとどんなことを
おやりになりたいんですか?
この回答への補足
>私の推測は当たっていたようですね。(せめて当たっていたかどうか
>をお教えくださると嬉しいのですが)
大当たりです。
>$ENV{CONTENT_LENGTH} = length($param);
>$ENV{REQUEST_METHOD} = 'POST';
>も必ず実行してください。また、abc.cgiはただの例ですから、
これも、やっているのですが、うまくいきません。
> 共通部分をライブラリ(モジュール)として別ファイルにくくり出して、
実は、二つのファイルは、perl で書いたものと、 PHP で書いたものなので、 共通部分をライブラリ、というわけにもいかなくて、、
とりあえず、CGIから他のCGIが実行できるかのテスト用にと、
#-----------#
# start.cgi # そのまま
#-----------#
#!/usr/local/bin/perl
$param = 'a=123&b=xyz';
$ENV{CONTENT_LENGTH} = length($param);
$ENV{REQUEST_METHOD} = 'POST';
open(OTHER_CGI, "|./write.cgi") or die "$!";
print OTHER_CGI $param;
close(OTHER_CGI);
print "Content-type: text/html\n\n";
#-----------#
# write.cgi # 送られてる$paramはとりあえず無視
#-----------#
#!/usr/local/bin/perl
open(DATA, ">./test.dat");
print DATA "aiueo";
close(DATA);
で、start.cgi にアクセスしてみるのですが、write.cgi は全然動いてません。(write.cgiに直接アクセスしたら、test.datを書き出してくれるのに)
何か、根本的に間違ってるんでしょうか、、。
ちなみに、以上はwindows上で操作してます。
No.1
- 回答日時:
おっしゃりたいことはなんとなくわかりますが、もう少し具体的だといいと思
いますよ。
No.70723でご質問されていることから推測すると、「処理終了後」というのは、
CGIプログラムmyprog.cgiの処理が終わる直前に
print "Location: http://my.provider.com/~myname/abc.cgi?a=123&b=x …
などと書いておき、パラメータa,bを渡してabc.cgiを呼び出すようにしようと
しているのでしょうか。「GET方式」とはこのパラメータ指定方法のことですか?
だとすると、abc.cgiがGETではなくPOSTを解釈するように記述してあるとか、
なんらかの理由でこのパラメータ指定方法ではうまくいかないという状況なの
でしょうね。
それならば、print "Location: ..."の代わりに、myprog.cgiの中でabc.cgiを
直接実行してしまえば良いと思います(abc.cgiもmyprog.cgiと同じサーバにあ
ると仮定した話です。別のサーバにあるCGIプログラムを実行したいなら、socket
で接続するとか、LWPモジュールを使うとか、ちょっと面倒なことになりますね)。
例えばパラメータがa=123&b=xyzとすると…
$param = 'a=123&b=xyz';
$ENV{CONTENT_LENGTH} = length($param);
$ENV{REQUEST_METHOD} = 'POST';
open(OTHER_CGI, "|./abc.cgi") or die "$!";
print OTHER_CGI $param;
close(OTHER_CGI);
POSTメソッドは標準入力でパラメータを受け取るのですから、パイプを使って
標準入力からパラメータを流し込んでやればいいわけです。myprog.cgiが
httpサーバの振りをして、環境変数をうまくセットしてやって、まるで普通に
サーバから呼び出されたかのようにしてやれば良いでしょう。
ただしこの場合、abc.cgiが "Content-type: text/html" などを出力して
いる、いわゆるよくあるCGIプログラムの場合は、そのヘッダもそのまま出て
しまいますね。これをフィルタリングしたい、となると、他のプログラムの
入力と出力を同時に処理するわけですから、IPC::Open2モジュールなどを使う
ことになります。(自前でforkしてもいいですがいろいろと面倒です)。
まあ普通ここまでする前に、どちらのプログラムも自分で編集できるなら
共通部分をライブラリ(モジュール)として別ファイルにくくり出して、
abc.cgiもmyrog.cgiもそのライブラリを呼び出して自分の作業を行うように
改造するのが普通だと思います。
…推測だけでここまで書いてしまいましたが、ぜんぜん見当はずれだったら
申し訳ありません。いずれにせよ詳しい状況をお教えください。
この回答への補足
どうも、うまくいきません。
一つ目のCGIから、二つ目のCGIを実行するには、
open(OTHER_CGI, "|./abc.cgi") or die "$!";
print OTHER_CGI $param;
close(OTHER_CGI);
これだけでよいのでしょうか。
二つ目のCGIはファイルを生成するものなのですが、動きませんでした。
CGIのなかから、他のCGIを実行させる、というのはやったことがないもので、、、
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 車検・修理・メンテナンス パワーウィンドウのモーター故障、交換必須? 正規品は生産終了+在庫切れ 私が所有している以下の車両に 7 2023/05/26 19:59
- 投資・株式の税金 確定申告に付いて 4 2022/05/12 01:54
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Excel(エクセル) A、B、C・・・AA、ABと連番でふりたい、調べても式の意味がわからずパニックになってしまう 1 2023/01/23 19:17
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- その他(スマートフォン・携帯電話・VR) スマホの任意整理について。 auかんたん決済、スマホ料金が重なり、(機種の分割料金も含めて)支払い出 1 2023/01/10 18:54
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- JavaScript HTMLでJavaScriptを使用してプログラムを作ります。 入力されたパスワードを取得して、パス 2 2022/10/18 01:05
- 物理学 面積速度一定の法則を(1/2)r v sinθを使って証明する方法 2 2023/06/25 12:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cgiとplとpm
-
htmlからテキストを返すperlを...
-
Perlソースを2つのファイルに分...
-
require文が実行できない
-
処理終了後、他のプログラムへP...
-
月の第一週とは
-
リストコントロールの列幅を固...
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
週2回のペースって だいたい何...
-
エクセルで相対パスの書き方を...
-
アンケートなどの1日1回の投...
-
[Excel] ある日の曜日が当月の"...
-
VBA。複数のChangeイベントをま...
-
上位階層のディレクトリパスを...
-
[C#]ListView一覧表示時の幅設...
-
曜日を求めるプログラムはどう...
-
一年の第何週目であるかを判断...
-
apacheでPerl CGIが作動せず、5...
-
VBAでExcelのヘッダーに文字列+...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgiとplとpm
-
jcode.plが読み込めない
-
セッションファイルが作成でき...
-
webからroot権限のコマンドを実...
-
バイナリファイルのアップロード
-
画像のアップロード機能
-
htmlからテキストを返すperlを...
-
プログラムを書き足すことについて
-
IMGタグにaaa.cgiを指定して、...
-
クッキーについて
-
Quantifier follows nothing in...
-
ブラウザでタグがはみ出る
-
ファイル書込時にPermission de...
-
アンケートフォームの作成
-
PDFJが動作しない
-
リンクをクリックした時に別ペ...
-
自CGIのURLのパス部分を取得す...
-
ログイン成功の後は?
-
Perlでuse strictと %inの共存
-
use と require の違いが分か...
おすすめ情報