php HTTP 拡張モジュールのインストールをインストール(有効)にしているとダウンする

  • ページ: BugTrack2
  • 投稿者: 名無しさん
  • 優先順位: 普通
  • 状態: 完了
  • カテゴリー: 本体バグ
  • 投稿日: 2007-11-15 (木) 02:14:29
  • バージョン: 1.4.7
  • リリース予定バージョン: 1.5.1

メッセージ

php HTTP 拡張モジュールをインストール(有効に)しているとpukiwikiがダウンする(空ページ)

index.phpにて、error_reporting(E_ALL)を有効にする(コメントを外す)と下記表示

Fatal error: Cannot redeclare http_request() in C:\Apache\htdocs\wiki\lib\proxy.php on line 126

PHP関数:http-request
cvs:lib/proxy.php

原因

関数名が重複しているため
http_request

回避方法

lib/pukiwiki.php
// require(LIB_DIR . 'proxy.php');
のようにコメントにする
もしくは、
php.iniをインストールフォルダに設置する。
もしくは
php HTTP 拡張モジュールをあんいんすとーるする

実装


コメント

  • if(! function_exists('http_request')) {
            require(LIB_DIR . 'proxy.php');
    }
    ではダメですか? -- よっちい? 2007-11-15 (木) 20:08:07
    • それだけでは、ダメだと思います。
      PukiWiki のhttp_request 関数のパラメータは、(string)$url, (string)$method という順番で始まりますが、
      PHP のhttp_request 関数は、(int)$method , (string)$url という順番で始まるので、
      http_request 関数を使っているamazon.inc.php やshowrss.inc.php に影響が出ます。
      PukiWiki のをPHP にあわせる修正が必要になるかも。 -- 2007-11-15 (木) 21:04:40
      • では、上記回避方法の「~をコメントにする」でもダメなわけですね。PECLにあわせるに1票入れときます。 -- よっちい? 2007-11-15 (木) 23:16:51
    • でなければ、PukiWiki 専用のhttp_request ということで、pukiwiki_http_request に改名するとか。 -- 2007-11-15 (木) 21:19:53
  • 仮に引数の順番を除いた 外部仕様が全く同じである というのであれば、PECLに合わせた方が無難でしょうね。辛いのは現時点までのPukiWikiだけですから。しかし実際には第三引数以降がかなり違いますから、pkwk_http_request() とでも名称変更しておくのが無難なのでしょう。仮に PECL_HTTP http_request() の仕様が PukiWiki http_request() のニーズを完全にカバーできるならば pkwk_http_request() を PECL_HTTP http_request() のラッパーとして構築する*1とさらに美しいのだろうと思うのですが、よく比較しないと何とも言えないと思います -- henoheno 2007-11-15 (木) 23:40:02
    • いずれにせよ次の一手は名称変更かなと。 -- henoheno 2007-11-15 (木) 23:44:56
    • 第三引数以降を使っていたのは、TrackBack 関連だけみたいです。上に挙げた2つのプラグインは、第一引数しか使っては無いんですけど・・・。(上に引数の型を追記しておきました) -- 2007-11-15 (木) 23:52:31
  • 戻り値の型も違うようです(PECL版はstringに対して、PukiWiki版はarray)。ラッパーを作るにしても、ちょっと面倒かもしれません。名称変更で様子見ですね。 -- よっちい? 2007-11-20 (火) 20:36:11
  • ちょっとリストアップ
    • lib/proxy.php

      実装本体だが、内部でリダイレクトしている。

                             // Redirect
                             return http_request($url, $method, $headers, $post, $redirect_max);
    • lib/trackback.php
                     :
                     $result = http_request($tb_id, 'POST', '', $putdata, 2, CONTENT_CHARSET);
                     :
             $data = http_request($url);
             if ($data['rc'] !== 200) return '';
    • plugin/amazon.inc.php
             $data = http_request($url);
             return ($data['rc'] == 200) ? $data['data'] : '';
    • plugin/showrss.inc.php
                     // Newly get RSS
                     $data = http_request($target);
                     if ($data['rc'] !== 200)
                             return array(FALSE, 0);
    • pulgin/tb.inc.php
             // URL validation (maybe worse of processing time limit)
             $result = http_request($url, 'HEAD');
             if ($result['rc'] !== 200) return array(PLUGIN_TB_ERROR, 'URL is fictitious.');
      してみる。 -- よっちい? 2007-12-15 (土) 10:24:15
  • 確認ありがとうございます。方針としては、そのバッティングしている機構が過去のtrackback実装でしか使われていない(そのために作られた)というのなら、その部分を捨てた上で、PECLにも互換の関数として作り直すのがスマートなのであろうと思っています。 -- henoheno 2007-12-18 (火) 01:01:42
  • 私は、以下の対処法にしました。 1、lib/pukiwiki.php
    // require(LIB_DIR . 'proxy.php');
    のようにコメントにする
    (2、index.phpにて、error_reporting(E_ALL)を無効にする(コメントアウトする)) -- 2009-06-11 (木) 22:44:56


インストールしたが何も表示されない

エラー表示を有効にした際の表示 Fatal error: Cannot redeclare http_request() in pukiwiki\lib\proxy.php on line 126

原因

・グローバル関数 http_request (PECL pecl_http >= 1.0.0) との名称衝突
・pukiwiki開発者が報告を長年無視し続けているため。
・他のツールを無視したpukiwiki開発者の関数の命名方法に問題がある

 将来の衝突回避および動作チェックや
 添付プラグイン以外への影響を考慮すると最小限の修正ですむ対処法1が無難だろう。

対処法1

http_requestの名称変更
対象ファイル : lib/proxy.php , plugin/amazon.inc.php , plugin/showrss.inc.php
例
  http_request --> pkwk_http_request

対処法2(PHP 4 >= 4.3.0, PHP 5)

・ pukiwiki.ini.phpのrequire(LIB_DIR . 'proxy.php');を削除し、lib/proxy.phpを削除する
・ plugin/amazon.inc.php , plugin/showrss.inc.phpを修正する
 amazon.inc.php
  -$data = http_request($url);
  -return ($data['rc'] == 200) ? $data['data'] : '';
  +$data = file_get_contents($url);
  +return ($data !== false) ? $data : '';
 showrss.inc.php
  -$data = http_request($target);
  -if ($data['rc'] !== 200)
  +$data = file_get_contents($target);
  +if ($data === false)

コメント

  • pecl_httpのほうが後発だったような。PukiWiki 1.4が2003-11-03で、pecl_http 0.1.0が2005-01-27。 -- 2011-04-16 (土) 02:50:37
  • 修正しました。http_request()をpkwk_http_request()にリネームしました。外部からこの関数を使っている可能性を考慮して、pecl_httpが無い環境(http_request関数が定義済みでない環境)では、http_requestも使えるようにしました -- umorigu 2016-02-05 (金) 00:56:57


*1 あるならば PECL を使うようにする

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-05 (金) 00:56:57
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.275 sec.

OSDN