• ベストアンサー

perl内でPHPを動かす?

perlでhtmlを書き出しています。 そのhtmlにPHPを埋め込みたく思い、書き出されたhtmlにPHPを記述して phpとして保存。動作を確認しました。 perlで書き出している全てのページにこのPHPを埋め込みたく思い、perlの print <<EOF; ~ EOF の間に <?php ~ ?> を埋め込みましたが動きません。 当然の結果なのでしょうか… 何か方法があればご教示願います。  下記のようなページも見つけましたが、コードをperlに貼り付けても 動作しません。直接貼り付けるのではないのでしょうか? http://phpspot.org/blog/archives/2006/03/perlphp_2.html どうぞ宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.10

> この場合、$member1 = "ddd"; の部分を $member1 = "$xxx"; としている箇所は > 当然$xxxのまま表示されていますが、これはもう手動か別のアプリで書き換えるしかないですよね? > 実はこの"aaa""bbb"…"ddd"の部分が全部変数なんです。 方法2で、PHPの変数を示す$は\$に、Perlの変数を示す$はそのまま、 という書き換えをすればいけます。 ---ここから--- print <<EOF; <?php \$nam = fopen("​http://www.aaa.co.jp/bbb/ccc.html","r"); while(!feof(\$nam)){ \$line = fgets(\$nam,1024); \$li_array[] = \$line; } \$li_nam = implode("", \$li_array); \$member1 = "$xxx"; \$member2 = "$yyy"; \$member3 = "$zzz"; ---以下略 といった感じにすれば、$xxxの所は、HTMLファイルに出力した段階で、Perlの変数$xxxの内容で置き換えられます。

qwert789
質問者

お礼

ありがとうございました。 手動かと思っていただけに非常に助かりました。 無事にPerlから書き出してPHPが動作します。 ただ拡張子はhtmlのままだと動作しませんでした。 拡張子をphpに変更すると指示通りの動作です。 AddType application/x-httpd-php .html が効いてないみたいですが 目的の9割は達成されました。 htmlのままで動作しないかもう少し挑戦してみます。

qwert789
質問者

補足

教えて頂いたことを参考に、希望通り動作するPHPを含んだHTMLを PERLで書き出す事が出来るようになりました。 100%満足の行くものと成ったのも、ralf124c様・mtaka2様が長々と 初心者にお付き合いして下さったからと感謝致しております。 周りの者もプログラムの出来に感心しております。 ポイントと言う形でしか御礼が出来ず、また10Pと20Pで差が付いて しまいますが、お二方同様に感謝致しております。 判定の仕様がなく、ご回答して頂いた回数で10P・20Pとさせて頂き ました。安易な判定をお許し願います。 この度は、本当にありがとうございました。

その他の回答 (10)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.11

> AddType application/x-httpd-php .html が効いてないみたいですが アップロードの際にバイナリモードになっていませんでしょうか? FTPの設定でアスキーモードに強制的にアップするように設定するか、使ってはいないと思いますがコマンドライン版のFTPなら転送前に「ascii」でアスキーモードにしてみて下さい。 また、自分のレンタルしているサーバのドキュメントにはだいたい出来ることは書かれていますので参考URLをみて「◎ 特殊なMIME-TYPESを設定したい 」の項目を参照しましょう。

参考URL:
http://support.sakura.ad.jp/support/manual/rs/tech_htaccess.shtml
qwert789
質問者

お礼

再アップしたり、htaccessを書き換えたり試しましたが動作せず… 色々調べるとSAKURAのサーバーの仕様のようでした。 下記のサイトにも記されていました。 http://m630.net/php-mysql/sakura-php-ssi.html 最初のほうに教えていただいたSSIで読み込む方法なら可能らしいです。 コチラで実行してみてまた結果報告させて頂きたいと思いますので 2~3日締め切らず明けさせて頂きますねm(__)m

qwert789
質問者

補足

教えて頂いたことを参考に、希望通り動作するPHPを含んだHTMLを PERLで書き出す事が出来るようになりました。 100%満足の行くものと成ったのも、ralf124c様・mtaka2様が長々と 初心者にお付き合いして下さったからと感謝致しております。 周りの者もプログラムの出来に感心しております。 ポイントと言う形でしか御礼が出来ず、また10Pと20Pで差が付いて しまいますが、お二方同様に感謝致しております。 判定の仕様がなく、ご回答して頂いた回数で10P・20Pとさせて頂き ました。安易な判定をお許し願います。 この度は、本当にありがとうございました。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.9

> 上記をアップロードし、ワクワクしながら実行したのですが > Internal Server Errorが出てしまいhtmlを書き出せません。 それは、おそらく > print <<EOF; という形のヒアドキュメントが原因です。 この場合、EOFまでの間のテキストは、通常の"(ダブルクオート)でくくられた文字列と同じように、$変数名での変数展開が行われます。 そのため、PHPのコードとして書かれた変数を示す$が、 Perl の文字列としての変数展開を行おうとして、 それでエラーになっているのだと思います。 方法1: ヒアドキュメントの指定を --- print <<'EOF'; --- にする。シングルクオートでくくっておくと、ヒアドキュメント中の変数展開が行われなくなります。 方法2: PHPコード中の$を全て\$でおきかえる --- \$nam = fopen(… --- といった感じ。こうすることで、$がエスケープされて、Perl側で変数展開されなくなります。 書き換えの手間が少ないのは方法1ですが、変数展開されなくなるので、 ヒアドキュメント中で変数したい場合は、方法2にするしかありません。

qwert789
質問者

お礼

何度もご丁寧な解説を頂戴しありがとうございます。 $を加えることでperlとしてのエラーは出ず、htmlを書き出してくれるようになりました。 この場合、$member1 = "ddd"; の部分を $member1 = "$xxx"; としている箇所は 当然$xxxのまま表示されていますが、これはもう手動か別のアプリで書き換えるしかないですよね? 実はこの"aaa""bbb"…"ddd"の部分が全部変数なんです。 万が一方法があるなら何度も恐縮ですがどうぞ宜しくお願い致します。 無茶なお願いで申し訳ございません。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.8

ごめんなさい、記述内容を間違えてコピペしてしまいました。 AddType application/x-httpd-php .html .htm 拡張子をどのようにしているのかわからないので 「.html」「.htm」の両方を書いときます。

qwert789
質問者

お礼

ralf124c様・mtaka2様 何度もレスを頂戴しありがとうございます。 「静的なHTMLをCGIで出力してその中にPHPを埋め込みたい」 このように言えば良かったんですね。 分かりにくい説明にお付き合い頂きありがとうございます。 また、簡単そうな方法をご教示頂きありがとうございます。 拡張子はhtmlで統一しているので 「AddType application/x-httpd-php .html」を .htaccessに記載して cgiからhtmlファイルを書き出しているフォルダに置きました。 Perlのhtml書き出し部分に以下を書き加えました。 #----------------------------------------------------------------- print <<EOF; <?php $nam = fopen("?http://www.aaa.co.jp/bbb/ccc.html","r");? while(!feof($nam)){ $line = fgets($nam,1024); $li_array[] = $line; } $li_nam = implode("", $li_array); $member1 = "ddd"; $member2 = "eee"; $member3 = "fff"; $member4 = "ggg"; $member5 = "hhh"; if( is_numeric( strpos($li_nam, $member1) ) ){ echo "ddd"; } if( is_numeric( strpos($li_nam, $member2) ) ){ echo "eee"; } if( is_numeric( strpos($li_nam, $member3) ) ){ echo "fff"; } if( is_numeric( strpos($li_nam, $member4) ) ){ echo "ggg"; } if( is_numeric( strpos($li_nam, $member5) ) ){ echo "hhh"; } ?> EOF #----------------------------------------------------------------- 上記をアップロードし、ワクワクしながら実行したのですが Internal Server Errorが出てしまいhtmlを書き出せません。 何度も申し訳ございませんが、問題点がございましたらご指摘お願い致します。 >サーバー次第 サーバーに問題はないと思うのですが、因みにSAKURAのレンタルサーバーです。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.7

回答2・3・5の者です。 回答6の > AddType application/x-httpd-php .php これは、たぶん AddType application/x-httpd-php .html の間違いですね。 すみません、その方法は気づいてませんでした。確かに、これが一番簡単そうです。この設定は、 ・拡張子 .html のファイルは「PHPプログラム」として実行し、その結果をブラウザに渡す ようにという意味です。 これで、Perlプログラム側は手を付ける必要はなく、拡張子は.htmlのファイルのままでも、 <?php ~ ?> という形でPHPプログラムの埋め込みができるようになります。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.6

質問の意図を読み違えておりました。 動的にページをCGIで出力しているのではなく、静的なHTMLをCGIで出力してその中にPHPを埋め込みたいということだったのですね。 質問内容が機能面のみ書かれて運用面に関する記述が皆無なので、思いもよりませんでした。 可能かどうかサーバ次第ですが、CGIから吐き出しているHTML群のあるディレクトリに AddType application/x-httpd-php .php と記述した「.htaccess」ファイルを置けば解決かと思います。 すでにそのファイルが存在するなら上記の記述を追記すればOKです。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.5

> (2)今からしたい事は… > 上記で生成したhtmlファイルにPHPを埋め込んで、アクセスがある毎に > 指定したURLからタグを読み込んで表示する事です。 それだと、回答2で述べた「明示的に PHP CLIを呼び出してPHPとして実行処理」は使えません。 この方法だと、HTMLファイルには、「PHPで処理した結果」が書き出されますので、「アクセスがあるごとにPHPコードを実行」することはできません。 それを実現したかったら、以下のような方法があります。 (方法1が一番素直な対応になるかと思います。) 方法1. perlプログラムが出力するファイル拡張子を、.html ではなく、 .php にする。(回答3で述べた方法です) 方法2. PHP ではなく、JavaScriptで記述する。 JavaScriptは、ブラウザ側で実行することになりますが、HTML ファイルにコードを記述することは可能です。 方法3. SSI 経由でPHPコードを実行する HTMLファイル中には、<!--#exec cgi="XXX.php"> とだけ出力し、別途 XXX.php というファイルを作っておきます。 すると、そのHTMLに対しては、アクセスする度にXXX.php が実行され、その結果がその部分に埋め込まれます。 ただし、SSIのファイルは通常、拡張子は.shtmlになります。拡張子を.html のままにしたかったら、それが出来るようにWWWサーバの設定を行う必要があります。(Apache の場合、.htaccess などで XBitHack on にしておくと、HTMLファイルの実行ビットを立てれば、そのファイルは SSI を処理するようになります)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

> htmlにアクセスが有った時、常に新しい情報を読み込んで表示したかったのでPHPを埋め込んだんですが、 > そのようなページを自動で書き出しするにはどの様な方法があるのでしょうか? >  ページが多くてhtml1つ毎にPHPを埋め込む事は大変な労力となります。 とりあえず3案 1.動的に生成する部分を同じCGIで生成して表示時に同時に出せば良いと思いますがPHPでなければいけない事情があるのでしょうか? 2.でしたら、表示のCGI部分をPHPで書き直せばよいかと思います。 3.どちらもダメなら、PHPの部分を単独のスクリプトにして、Ajaxから呼び出してDHTMLで該当の部分に表示させるという手もあります。 どうでしょう?

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

回答2の者ですが、もしかしたら質問者の意図を読み間違えたかもしれません。 回答2は、Perlで記述した CGI プログラムが「HTMLデータを直接出力」する場合の話です。 もしかして、「HTMLファイルそのものをPerlで書き換える」ようなことをしているのでしょうか? そうだとしたら、拡張子の問題だと思います。前述のように、WWWサーバは ・拡張子 .cgi のファイルは「CGIプログラム」として実行し、その結果をブラウザに渡す ・拡張子 .php のファイルは「PHPプログラム」として実行し、その結果をブラウザに渡す ・それ以外のファイルは、そのままブラウザに渡す といった処理を行いますから、拡張子が .html のままだと、中にPHP のコードを埋め込んでも、PHP としては実行されず、そのままブラウザに渡されてしまいます。 その場合は、出力ファイルを拡張子 .html ではなく、 .php にしてください。 ただし、ファイル名が変わってしまいますから、html中のリンクとかはすべて書き換える必要があることになります。 あるいは、代案としては SSI を使うという方法があります。 SSI を使えば、拡張子は .html のままでも、その中にプログラムの実行結果を埋め込むことができます。

qwert789
質問者

お礼

レスありがとうございます。 (1)現在している事は… hoge.cgiからdata.cgiを呼び出し、そのデータを元にhtmlファイルを生成 しています。(定期的に更新してhtmlを上書きして書き換えています。) (2)今からしたい事は… 上記で生成したhtmlファイルにPHPを埋め込んで、アクセスがある毎に 指定したURLからタグを読み込んで表示する事です。 但し、htmlファイルの数が多いので、(1)でhtmlファイルを生成する時に PHPを埋め込もうとしたわけです。お恥ずかしい… で、ご回答頂いた明示的に PHP CLIを呼び出してPHPとして実行処理する 方法ですが、具体的に以下のスクリプトをどの様にPerlに記述すれば良い のでしょうか? <?php $nam = fopen("http://www.aaa.co.jp/bbb/ccc.html","r"); while(!feof($nam)){ $line = fgets($nam,1024); $li_array[] = $line; } $li_nam = implode("", $li_array); $member1 = "ddd"; $member2 = "eee"; $member3 = "fff"; $member4 = "ggg"; $member5 = "hhh"; if( is_numeric( strpos($li_nam, $member1) ) ){ echo "ddd"; } if( is_numeric( strpos($li_nam, $member2) ) ){ echo "eee"; } if( is_numeric( strpos($li_nam, $member3) ) ){ echo "fff"; } if( is_numeric( strpos($li_nam, $member4) ) ){ echo "ggg"; } if( is_numeric( strpos($li_nam, $member5) ) ){ echo "hhh"; } ?> 上記のPHPをHTMLに埋め込みたく思っています。 どうぞ宜しくお願い致します。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

WWWサーバの動作としては、基本的には ・拡張子 .cgi のファイルは「CGIプログラム」として実行し、その結果をブラウザに渡す ・拡張子 .php のファイルは「PHPプログラム」として実行し、その結果をブラウザに渡す ・それ以外のファイルは、そのままブラウザに渡す ような動作をします。 あるファイルを、「CGIプログラムとして実行」し、その結果を再び「PHPプログラムとして実行する」ようなことは基本的にできません。 (WWWサーバの設定でそのように処理するように設定することも不可能ではありませんが、WWWサーバの設定変更が必要ですし、その知識も要ります) 簡単に実現したかったら、CGI(Perl プログラム)側から、明示的に PHP CLIを呼び出してPHPとして実行処理させるのが簡単だと思います。 ---ここから--- #! /usr/local/bin/perl print "Content-Type: text/html\n\n"; open(my $php, "|-", "/usr/local/bin/php") or die "cannot invoke PHP"; print $php <<EOF; <html><body> PHP version = <?php print phpversion(); ?> </body></html> EOF ---ここまで--- こんな感じです。php インタプリタのパスは稼働するサーバ環境に合わせて適宜書き換えて下さい。 > 下記のようなページも見つけました そこで紹介しているモジュールは「Perlのコード中にPHPのコードを混在させる」ことができるものです。 「HTMLデータ出力中の <?php ~ ?> 部をPHPとして実行」したかったら、そういう処理をPerlプログラム中に記述しなければなりません。 サンプルのコードを貼り付けただけでは何も起きません。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

perlというわけではなく、CGIで呼び出されたサーバサイドのプログラムの結果から、さらにサーバサイドのプログラムを実行しようとしているのですね。 別の例えをするとCGIで呼び出された結果の中でSSIを実行することは出来ません。 これは、少し考えてみると「ああ」と思うのですが、もしもCGIの内部で自分を呼び出すような仕組みがあった場合、自分が自分を呼び出して、さらにそこからまた自分が呼び出される。 一発の実行トリガーでサーバリソースいっぱいまでの処理が無数に立ち上がってあっという間にサーバはパンクしてしまいます。 サーバサイドプログラムの多重起動はWebサーバによって出来ないようになっているようです(Webサーバをソースレベルで改造すれば可能)。 また、上記ブログの場合はPerlの一般的処理に関する記述でCGIに関する記述では有りません。 CGIはWebサーバプログラムが持っているインターフェースでシステム内プログラムを起動して実行結果を受け取る仕組みに過ぎませんが、Perlは立派なプログラム言語です。

qwert789
質問者

お礼

レスありがとうございます。 やはり無理な事をしてたんですね。お恥ずかしい限りです。 ご説明からでは、全体をPHPで書き直しても結果は同じって事でしょうし… htmlにアクセスが有った時、常に新しい情報を読み込んで表示したかったのでPHPを埋め込んだんですが、そのようなページを自動で書き出しするにはどの様な方法があるのでしょうか? ページが多くてhtml1つ毎にPHPを埋め込む事は大変な労力となります。 何か方法があればご教示お願いしたく、どうぞ宜しくお願い致します。

関連するQ&A