- PR -

【PHP】Fatal error: Cannot redeclare

投稿者投稿内容
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 15:28
kumapooと申します。

お世話になります。

phpのプログラムを動かしたところ、で下記のエラーが出てしまい、回避できずすごく困っております。

webで調べたところ、二重定義した際にこういったエラーがでるらしいのですが、当方インフラ担当でして、プログラムの中身まではわからず。。。
ただ、プログラマに聞いたところ、「二重定義は絶対にない」とのこと。
また、プログラマの環境では動くそうです。

インフラでいくつか調べてみたのですが、「php.info」が動作していますし、PHPの設定が足りない部分があるかわかりません。

どなたか、こういった経験を回避した方がいらっしゃたら、その方法を教えていただけないでしょうか?

よろしくお願いいたします。
[エラー内容]
※下記のエラーがブラウザ上ででます。
-----
Fatal error: Cannot redeclare configuration_data() (previously declared in /export/home/u/hoge-test.co.jp/public_html/agency/lib/config.inc:18) in /export/home/u/hoge-test.co.jp/public_html/agency/lib/config.inc on line 16
-----

[サーバの環境]
・php.infoから抜粋
Apache Version Apache/2.0.58 (Unix) mod_ssl/2.0.58 OpenSSL/0.9.7a DAV/2 SVN/1.3.2 mod_python/3.2.8 Python/2.4.3 PHP/4.4.1

[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-12-11 15:48 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 15:41
上記スレを立てた者です。

PHPの問題なのですが、インフラ担当としまして、apacheやphpの設定は私がLinux上で行っているものですから、こちらで立てさせて頂きました。

スレ違いでしたら申し訳ありません。
SHR
ベテラン
会議室デビュー日: 2006/06/15
投稿数: 99
投稿日時: 2006-12-11 15:51
(少なくとも私は)スレ違いな気がします。

どんなプログラムか解らないとデバッグのしようがないのですが…。
関数内に関数を定義していて、外部からコールした事で2重定義になってしまっていませんでしょうか?

※ちょっと的外れな気がしたので修正(汗
 あんまり変わってないか…。

[ メッセージ編集済み 編集者: SHR 編集日時 2006-12-11 16:01 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-12-11 16:01
#agency/lib/config.incの先頭から18行目までを読めばわかりそうな気はしますが・・。

SHRさんが書かれたとおりでしょうね。おそらくは関数内関数だと思います。ソースでは二重定義していなくても引っかかるのが関数内関数のある意味怖いところです。そのあたりの認識があればいいのですが・・

(追記)
エラーの行が両方とも同じソース内の直近なので普通に二重定義(苦笑)というのも考えにくいですからね。関数内関数で引っかかる例としてはこんなとこでしょうか・・
http://ml.php.gr.jp/pipermail/php-users/2005-June/026279.html



[ メッセージ編集済み 編集者: shimix 編集日時 2006-12-11 16:13 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 16:12
回答くださった方、ありがとうございます。

プログラマサイドからは、インフラの問題ではないか?と詰め寄られおり、私としましては、そのインフラの問題ではない根拠を示せずにおり、困っています。(私がソース読めればいいのですが・・・)

確かに、プログラマの環境で動作したというのは、PHPのバージョン4.4.2なので、ここが怪しいのかな?とも思うのですが。

一応関係のありそうなソースを載せます。

せめて問題の切り分け(ソース、バージョン、apache等)がつけばよいのですが。。。
もうどうにもんらず、こちらに載せさせて頂きました。

※DirectoryIndexでindex.phpを指定しており、アクセスするURLは
「http://hoge-test.co.jp/sample2/」になります。
$ cat index.php
<?php include_once "../agency/lib/fork.php"; ?>


$ cat ../agency/lib/config.inc
<?php
/* *** Define *** */
define(PAR_DIR, ROT_DIR."/agency");
define(TMP_DIR, PAR_DIR."/template");
define(INC_DIR, PAR_DIR."/include");
define(AGC_NAM, preg_replace("/^.*\\/([^\\/]+)\\/[^\\/]*$/","$1",$_SERVER["REQUEST_URI"]));
define(AGC_DIR, ROT_DIR."/".AGC_NAM);
define(CMN_CSV, PAR_DIR."/csv/default.csv");
define(AGC_CSV, AGC_DIR."/csv/config.csv");
define(IMG_DIR, "../agency/img");
define(BNR_DIR, "../agency/banner");
/* *** /Define *** */
?>
<?php
/* *** Configuration *** */
function configuration_data() {
$template_list = array(
"header" => "header_01.tmpl",
"main" => "main_{{PAGE}}_01.tmpl",
"sub" => "sub_01.tmpl",
"footer" => "footer_01.tmpl",
"fork" => "fork_01.tmpl",
"redirect" => "redirect_01.tmpl",
);
return $template_list;
}
/* *** /Configuration *** */
?>
<?php
/* *** Include *** */
require_once PAR_DIR."/lib/class.inc";
/* *** /Include *** */
?>

$ cat ../agency/lib/fork.php
<?php
header("Content-Type: text/html; charset=shift_jis;");
header("Pragma: no-cache");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=-1, pre-check=-1", false);
?>
<?php
/* *** Define *** */
define(ROT_DIR, $_SERVER["DOCUMENT_ROOT"]);
/* *** /Define *** */
require_once ROT_DIR."/agency/lib/config.inc";
?>
<?php
function output_content() {
$page = (isset($_GET["id"])) ? $_GET["id"] : "list";
$agency = new AGENCY(configuration_data(),$page,"FORK");
e($agency->output());
}
function e($str) { echo $str; }
output_content();
?>

[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-12-11 16:13 ]

[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-12-11 16:16 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 16:31
>shimixさん

回答ありがとうございます。

引用:

#agency/lib/config.incの先頭から18行目までを読めばわかりそうな気はしますが・・。


config.incの
>function configuration_data() {
この部分でエラー出ていますね。これって、再定義の問題になるんでしょうか。

引用:

SHRさんが書かれたとおりでしょうね。おそらくは関数内関数だと思います。ソースでは二重定義していなくても引っかかるのが関数内関数のある意味怖いところです。そのあたりの認識があればいいのですが・・


ただ、プログラマの環境では動作(PHP4.4.2)しているということですので、やはりPHPモジュールの相違に依存している可能性を感じました。

引用:

エラーの行が両方とも同じソース内の直近なので普通に二重定義(苦笑)というのも考えにくいですからね。関数内関数で引っかかる例としてはこんなとこでしょうか・・
http://ml.php.gr.jp/pipermail/php-users/2005-June/026279.html


mlの内容を一応目を通しました。つまり今回の事象に当てはめてみると、動作している環境(PHP4.4.2)と、動作していない環境(PHP4.4.1)があるので、ここをまず合わせてみることが切り分けの一歩かとも思いました。

バージョンアップした場合、他のソースに影響がないかがちょっと心配です。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-12-11 17:15
こんにちは

config.incを何度もinclude もしく requireしているんじゃないでしょうか?

たとえば A.phpに
コード:

<?php
require('config.inc');
require('B.inc');
〜略〜
?>


B.incに
コード:

<?php
require('config.inc');
〜略〜
?>



なかんじで...
requireなら require_onceを使えば回避できるかも




#今ソースを見返してみたら require_onceになってたんですねぇ orz
他のファイルからconfig.incが読み込まれていないか、
他のファイルでconfiguration_data と同名の関数が定義されていないか調べてみましたか?

$grep configuration_data *.php *.inc

[ メッセージ編集済み 編集者: 末記人 編集日時 2006-12-11 17:26 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 17:39
末記人さん

回答ありがとうございます。grepをかけたところで、使われている部分がありました。なんかインスタンスを生成しているようですが。

$ cat test/agency/lib/lib.php
<?php
header("Content-Type: text/html; charset=shift_jis;");
header("Pragma: no-cache");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=-1, pre-check=-1", false);
?>
<?php
/* *** Define *** */
define(ROT_DIR, $_SERVER["DOCUMENT_ROOT"]);
/* *** /Define *** */
require_once ROT_DIR."/agency/lib/config.inc";
?>
<?php
function output_content() {
if(isset($_GET["page"])) {
$mode = (isset($_GET["mode"])) ? $_GET["mode"] : "DEFAULT";
$agency = new AGENCY(configuration_data(),$_GET["page"],$mode);
e($agency->output());
}
}
function e($str) { echo $str; }
output_content();
?>

スキルアップ/キャリアアップ(JOB@IT)