* PHP5.0.5でFatal error [#mb63d60d] - ページ: [[BugTrack2]] - 投稿者: [[kawa]] - 優先順位: 重要 - 状態: 完了 - カテゴリー: 本体バグ - 投稿日: 2005-09-08 (木) 17:22:43 - バージョン: 1.4.5_1 #contents ** 関連 [#e7989db0] - [[BugTrack/632]] PHP5で動作しない ** メッセージ [#lc1fa850] WindowsServer2003 & PHP 5.0.5 の環境で以下のエラーが出ます。5.0.4に戻すと正常動作します。 Fatal error: Only variables can be passed by reference in ~/rules.ini.php on line 26 ** 関連 [#bc545746] - [[official:質問箱3/183]] -------- ** 既存のプロジェクトなどで公開されているはずの、先人の仕事 [#ae84d832] - nx.eth.jp - PHP-Changes-5.0.5 -- http://www.eth.jp/hiki.cgi?PHP-Changes-5.0.5 - PHP: Bug #29423 reference count gets wrong when return-reference-calling a normal function -- http://bugs.php.net/bug.php?id=29423 - PHP: Bug #33257 array_splice() inconsistent when passed function instead of variable -- http://bugs.php.net/bug.php?id=33257 - PHP: Bug #33643 Fatal error: Only variables can be passed by reference -- http://bugs.php.net/bug.php?id=33643 - yohgaki's blog - 7月 2005, 13: 定数値への参照 -- http://blog.ohgaki.net/index.php/yohgaki/2005/07/13/ -- "array()で定義した配列定数をreturn文で返す場合、戻り値を変数に格納せず直接使用すると定数値にアクセスしたこととなり致命的エラー(E_ERROR)が発生します。" - [[official:質問箱3/183]] -- "どうやら PHP 5.0.5 で修正された以下の件 http://bugs.php.net/bug.php?id=33257 が影響して、「正しくエラーになっている」(?)様子で、rules.ini.php にしろ、recent.inc.php にしろ、array_pop や array_splice の引数に関数が入っているところを、一度変数に代入してやれば通るようになる様子です。他にも、array 関係の関数を、同じような使い方をしているところがあるかもしれませんが、とりあえずわかったのは以上2点でした。(というか、この2点を直さないとトップページすら表示されない)" -------- - こっちのが詳しく書いてくれてた[[org:質問箱3/183]] -- &new{2005-09-08 (木) 19:49:16}; - 質問箱の方には書き忘れましたが、OS は RHEL4 と RH9 で再現させました。 でも、PHP 5.0.5 のリリースノートにあるように、PHP の「正しい動作」の問題のようなので、OS によらないと思われます。 -- [[Kimi]] &new{2005-09-09 (金) 13:14:25}; - 4,5個のファイルを少し直すだけでした。array_pop(explode('/', $vars['page'])) みたいに、参照を引数に取る関数に関数の戻りを渡しているところで、関数の戻り値を一時変数に一度とっておき、それを引数として使うと正しく動作します。パッチを作ろうとしたらミスしました(x_x;) -- [[hiro@coop]] &new{2005-09-13 (火) 02:31:24}; - [[../82]]と同じですかね。 -- [[よっちい]] &new{2005-09-13 (火) 16:45:47}; - http://www.php.net/release_4_4_0.php によると "If references were used in a wrong way, PHP would often create memory corruptions which would not always surface or be visible." とあるのでエラーの発生に関らずリファレンス引数を取る部分に式を置くのはまずいようです((私かなりやってますが)) -- [[Cue]] &new{2005-09-13 (火) 22:44:05}; - 具体的にどうされたのか伺おうかと(オープンな場所で進めさせてもらおうと)思っていたのですが、どのへんをミスりましたか? -- [[henoheno]] &new{2005-09-13 (火) 23:38:38}; - PHP5.1.0RC1 で 1.4.6RC に対するパッチですが、こんな感じです: -- [[kawai]] &new{2005-09-28 (水) 18:47:46}; diff -ur pukiwiki-1.4.6_rc/lib/file.php pukiwiki-1.4.6_rc_mod/lib/file.php --- pukiwiki-1.4.6_rc/lib/file.php Wed Sep 28 18:42:04 2005 +++ pukiwiki-1.4.6_rc_mod/lib/file.php Wed Sep 28 18:42:15 2005 @@ -264,7 +264,8 @@ set_file_buffer($fp, 0); flock($fp, LOCK_EX); rewind($fp); - foreach (array_splice(array_keys($recent_pages), 0, $maxshow) as $page) { + $tmp=array_keys($recent_pages); + foreach (array_splice($tmp, 0, $maxshow) as $page) { $time = $recent_pages[$page]; $s_lastmod = htmlspecialchars(format_date($time)); $s_page = htmlspecialchars($page); diff -ur pukiwiki-1.4.6_rc/lib/html.php pukiwiki-1.4.6_rc_mod/lib/html.php --- pukiwiki-1.4.6_rc/lib/html.php Wed Sep 28 18:42:04 2005 +++ pukiwiki-1.4.6_rc_mod/lib/html.php Wed Sep 28 18:42:15 2005 @@ -119,9 +119,9 @@ if ($search_word_color && isset($vars['word'])) { $body = '<div class="small">' . $_msg_word . htmlspecialchars($vars['word']) . '</div>' . $hr . "\n" . $body; - $words = array_flip(array_splice( - preg_split('/\s+/', $vars['word'], -1, PREG_SPLIT_NO_EMPTY), - 0, 10)); + $tmp = preg_split('/\s+/', $vars['word'], -1, PREG_SPLIT_NO_EMPTY); + $tmp = array_splice($tmp, 0, 10); + $words = array_flip($tmp); $keys = array(); foreach ($words as $word=>$id) $keys[$word] = strlen($word); arsort($keys, SORT_NUMERIC); Only in pukiwiki-1.4.6_rc_mod: phpinfo.php diff -ur pukiwiki-1.4.6_rc/plugin/recent.inc.php pukiwiki-1.4.6_rc_mod/plugin/recent.inc.php --- pukiwiki-1.4.6_rc/plugin/recent.inc.php Wed Sep 28 18:42:05 2005 +++ pukiwiki-1.4.6_rc_mod/plugin/recent.inc.php Wed Sep 28 18:42:16 2005 @@ -39,7 +39,8 @@ // Get latest N changes if (file_exists(PLUGIN_RECENT_CACHE)) { - $lines = array_splice(file(PLUGIN_RECENT_CACHE), 0, $recent_lines); + $tmp=file(PLUGIN_RECENT_CACHE); + $lines = array_splice($tmp, 0, $recent_lines); } else { return '#recent(): Cache file of RecentChanges not found' . '<br />'; } diff -ur pukiwiki-1.4.6_rc/plugin/rss.inc.php pukiwiki-1.4.6_rc_mod/plugin/rss.inc.php --- pukiwiki-1.4.6_rc/plugin/rss.inc.php Wed Sep 28 18:42:05 2005 +++ pukiwiki-1.4.6_rc_mod/plugin/rss.inc.php Wed Sep 28 18:42:16 2005 @@ -35,7 +35,8 @@ // Creating <item> $items = $rdf_li = ''; - foreach (array_splice(file($recent), 0, $rss_max) as $line) { + $tmp=file($recent); + foreach (array_splice($tmp, 0, $rss_max) as $line) { list($time, $page) = explode("\t", rtrim($line)); $r_page = rawurlencode($page); $title = mb_convert_encoding($page, 'UTF-8', SOURCE_ENCODING); diff -ur pukiwiki-1.4.6_rc/rules.ini.php pukiwiki-1.4.6_rc_mod/rules.ini.php --- pukiwiki-1.4.6_rc/rules.ini.php Wed Sep 28 18:42:06 2005 +++ pukiwiki-1.4.6_rc_mod/rules.ini.php Wed Sep 28 18:42:18 2005 @@ -25,6 +25,7 @@ // 前後に必ず / を含めてください。行頭指定は ^ を頭に。 // 行末指定は $ を後ろに。 // +$page_tmp=explode('/',$vars['page']); $str_rules = array( 'now\?' => format_date(UTIME), 'date\?' => get_date($date_format), @@ -32,7 +33,7 @@ '&now;' => format_date(UTIME), '&date;' => get_date($date_format), '&time;' => get_date($time_format), - '&page;' => array_pop(explode('/', $vars['page'])), + '&page;' => array_pop($page_tmp), '&fpage;' => $vars['page'], '&t;' => "\t", ); - php5対応を謳っているのにphp-5.0.5では動作しないことがわかっているわけですから、修正されるまでの間この旨を周知した方がいいと思うのですがどうでしょうか? -- [[よっちい]] &new{2005-09-30 (金) 09:45:08}; - 私も賛成です。 -- [[うい]] &new{2005-09-30 (金) 11:25:00}; - こんにちは :) 皆さんのご協力もあって具体的な例も出てきたこと、また、やっとサイトが落ち着いて来た事もあり、今は&size(16){''1.4.6 リリースにこの件の対応をねじ込みたいのだがどうだろうか?''};などと考えています。これのせいでPHPを5.0.4に戻したりするのは悲しいですよね(やるべきじゃありません)。 -- ただコミット後数日後とか、一週間後にリリースするような事はタイミング的に強引だと思うので、本当に問題ないかどうかを開発日誌、およびusers-mlなどで周知を図りたいと思います。もう私は手元のVMwareでPHP5.0.5の環境を作り始めてています。5.0.5以降の方も4.1.2な方も少し力を貸してください :) -- [[henoheno]] &new{2005-09-30 (金) 22:00:12}; -- まずは、(内容的にはとても簡単な事のようには見えるのですが)対応方法の妥当性から確認させて下さい。また、網羅的に対応できるかは今は期待しないで下さい。別途修正漏れがあればここで共有しましょう。 -- [[henoheno]] &new{2005-09-30 (金) 22:07:55}; -- 妙なことがあるのであればその対応をするか、コミットをback out (元に戻す)します。 -- [[henoheno]] &new{2005-09-30 (金) 22:16:19}; -- 無理にねじ込むことを考えず、十分に検証/評価できてから対応した方がいいと思います。1.4.6のリリーススケジュールを変えることを視野に入れるのであれば、この限りではありませんけれども。とりえず検証用のパッチを配ってみるってどうでしょうか。 -- [[よっちい]] &new{2005-10-01 (土) 16:26:49}; --- こんにちは。1.4.6のリリーススケジュールは既に遅れています (^^; 無理にとは考えておりませんので、上に挙げていっているような情報を挙げつつ進めさせていただきたいと思います。ただ適切かどうかもわからないパッチをやりとりする時間はかけたくはないので、対応方法の検討をしっかり行って、直接CVSに手を加えてそれに対する検証をお願いするという形にさせていただきたく思っています。CVSはタグで内容をコントロールできますから、今回のそれを1.4.6に含める事も、含めないこともできます。 -- [[henoheno]] &new{2005-10-02 (日) 10:22:21}; - よっちぃさんがどちらを意図したかは分からないのですが、少なくとも私はまず1.4.5_1が5.0.5で動作しないことを周知すべきではないかと思ってます。そもそもこのBugTrackは1.4.5_1に対して出されたものですし。 -- [[うい]] &new{2005-10-01 (土) 10:58:51}; -- こんにちは :) [[official:PukiWiki/ダウンロード/1.4.5]] にコメントを追加しました。 -- [[henoheno]] &new{2005-10-01 (土) 14:48:00}; - とりあえずの目標は 1.4.5_1 が PHP5.0.5 で動くことを検証することでしょうか。1.4.6 についてはどうしましょうかね?私個人的な都合だと、1.4.6 の fix が優先だったりしますけれども、いずれにせよ微力ながら協力させていただきます。 :) -- [[kawai]] &new{2005-10-01 (土) 21:33:48}; -- 1.4.6cvsをPHP5.0.5で動くようにして、それを1.4.6としてリリースできるかどうかを検討して、できるならばそれをリリースするのが最優先です。それができるならば、1.4.5_1のユーザーの皆さんには1.4.6へのアップグレードを進めるか、同様の対応をしたいならこのページを参照するように言う事ができます。仮に1.4.5_1で動くように検証した場合、1.4.6など将来のリリースに取り込むための作業が二度手間になってしまいます。 -- [[henoheno]] &new{2005-10-02 (日) 10:26:37}; -- 了解です。それでは、1.4.6cvs/PHP5.0.5 を優先で。 -- [[kawai]] &new{2005-10-03 (月) 00:06:25}; - FreeBSD 4.5-REL + Apache2 + PHP 5.0.5 を用意し、状況を確かめつつ、上で挙げていただいた修正を一通りコミットしました。ただし lib/html.php 関する二度目の操作(array_flip()に関するもの)については、エラーが確認できませんでしたので現状そのままにしてあります。 -- [[henoheno]] &new{2005-10-03 (月) 01:17:17}; -- そうか5.1ではさらに異なるかもしれませんね (^^; ということで、array_flip() についてもコミットしておきました。 -- [[henoheno]] &new{2005-10-03 (月) 01:22:56}; - お疲れ様です。Windows2000,Apache2,PHP5.0.5で一通り試しましたが((もちろん、可能な範囲で (^^;))、エラーが出ることはありませんでした。本体とは関係ありませんが、自作プラグインとか結構やばそうですねぇ・・・ (^^; -- [[teanan]] &new{2005-10-03 (月) 03:40:40}; - まだあります。 -- &new{2005-10-03 (月) 11:14:06}; diff -u -r1.16 counter.inc.php --- plugin/counter.inc.php 9 Apr 2005 03:08:09 -0000 1.16 +++ plugin/counter.inc.php 3 Oct 2005 02:08:44 -0000 @@ -17,1 +17,2 @@ - $arg = strtolower(array_shift(func_get_args())); + $args = func_get_args(); + $arg = strtolower(array_shift($args)); diff -u -r1.42 pcomment.inc.php --- plugin/pcomment.inc.php 29 May 2005 10:49:59 -0000 1.42 +++ plugin/pcomment.inc.php 3 Oct 2005 02:08:44 -0000 @@ -80,2 +80,2 @@ - array_walk(func_get_args(), 'plugin_pcomment_check_arg', & $params); + $args = func_get_args(); + array_walk($args, 'plugin_pcomment_check_arg', & $params); diff -u -r1.14 popular.inc.php --- plugin/popular.inc.php 9 Apr 2005 03:18:06 -0000 1.14 +++ plugin/popular.inc.php 3 Oct 2005 02:08:44 -0000 @@ -68,1 +68,2 @@ - $counters = array_splice(array_reverse($counters, TRUE), 0, $max); + $counters = array_reverse($counters, TRUE); + $counters = array_splice($counters, 0, $max); diff -u -r1.29 tracker.inc.php --- plugin/tracker.inc.php 2 Mar 2005 13:31:05 -0000 1.29 +++ plugin/tracker.inc.php 3 Oct 2005 02:08:44 -0000 @@ -841,1 +841,2 @@ - $b_end = ($sort == array_shift(array_keys($order))); + $order_keys = array_keys($order); + $b_end = ($sort == array_shift($order_keys)); - 上のものについて調べてみました。確かに該当します。 :) -- [[kawai]] &new{2005-10-04 (火) 12:48:51}; -- これでおおよそ大丈夫そうです。完全にやろうとすると、Xdebug でも入れて、カバレッジを見つつ全ての評価式を踏むようにテストケースを作れば OK ですけれども、ごめんなさい、そこまではちょっと手が回りませんです…。機会があれば。 -- [[kawai]] &new{2005-10-04 (火) 12:55:21}; - あ、今コミットしたplugin/tracker.inc.php は明らかに間違えてます (^^; %%引き続き考えます・・・orz%% 直しました -- [[henoheno]] &new{2005-10-04 (火) 23:19:43}; -- ここまで全てコミットしました。お知らせいただきありがとうございました :) -- [[henoheno]] &new{2005-10-04 (火) 23:31:58}; -- そうですね、実行時にしか評価されない(エラーも実行時にしか発生しない)ものなので、厄介ですね。とりあえず以下のようにして標準プラグインの全ての convert & inline が存在すると仮定したテキストを生成して貼り付けてはみましたが、各プラグインのデフォルトの状態ではこれに関するエラーは出ないようでした(actionは試していません)。 -- [[henoheno]] &new{2005-10-04 (火) 23:38:44}; $ ls plugin/*.inc.php | sed -e 's#.*/##' -e 's/\.inc\...*//' | while read i; do echo "#$i"; echo "&$i;"; done #add &add; #amazon &amazon; #aname &aname; (略) -- tracker.inc.phpのarray_shift($order_keys, 0, 1)のところで"Warning: Wrong parameter count."と言われるんですけど… -- &new{2005-10-05 (水) 00:48:51}; -- パラメータ間違えてるようですね… -- [[ななし]] &new{2005-10-05 (水) 03:37:28}; -- ツッコミありがとうございます。r1.31で array_slice() の時の引数のまま、関数名だけをarray_shift() にしているのが元凶かと思います (^^; -- [[henoheno]] &new{2005-10-05 (水) 22:45:59}; --- 取り急ぎの修正を行いました。ご確認いただければ幸いです。 -- [[henoheno]] &new{2005-10-05 (水) 22:58:35}; - 状態を「完了」にしませんか? :-p -- [[kawai]] &new{2005-11-05 (土) 23:49:01}; - 最新版で無事動作致しました。対応ありがとうございました。 -- [[kawa]] &new{2005-11-07 (月) 10:25:22}; - PHPのソースを追っている方は御存じと思いますが 5.0.6では直ります。5.0.5用のパッチは http://wiki.ohgaki.net/index.php?cmd=read&page=PHP%2Fpatch%2FPHP-5.0.5%A4%CE%A5%A8%A5%E9%A1%BC%B2%F3%C8%F2 -- [[yohgaki]] &new{2005-11-10 (木) 11:35:51}; #comment