* php HTTP 拡張モジュールのインストールをインストール(有効)にしているとダウンする [#b28bd9ef] - ページ: [[BugTrack2]] - 投稿者: 名無しさん - 優先順位: 普通 - 状態: 完了 - カテゴリー: 本体バグ - 投稿日: 2007-11-15 (木) 02:14:29 - バージョン: - バージョン: 1.4.7 - リリース予定バージョン: 1.5.1 #contents ** メッセージ [#q22c774a] 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 拡張モジュールをあんいんすとーるする *** 実装 [#f36187fb] - [[commit:8e23f5085f264a8a8c013cc53ea70d6ca17a2569]] http_request を pkwk_http_request にリネーム -------- ***コメント [#vb9d5c51] - if(! function_exists('http_request')) { require(LIB_DIR . 'proxy.php'); } ではダメですか? -- [[よっちい]] &new{2007-11-15 (木) 20:08:07}; -- それだけでは、ダメだと思います。&br;PukiWiki のhttp_request 関数のパラメータは、(string)$url, (string)$method という順番で始まりますが、&br;PHP のhttp_request 関数は、(int)$method , (string)$url という順番で始まるので、&br;http_request 関数を使っているamazon.inc.php やshowrss.inc.php に影響が出ます。&br;PukiWiki のをPHP にあわせる修正が必要になるかも。 -- &new{2007-11-15 (木) 21:04:40}; --- では、上記回避方法の「~をコメントにする」でもダメなわけですね。''PECLにあわせる''に1票入れときます。 -- [[よっちい]] &new{2007-11-15 (木) 23:16:51}; -- でなければ、PukiWiki 専用のhttp_request ということで、pukiwiki_http_request に改名するとか。 -- &new{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() のラッパーとして構築する((あるならば PECL を使うようにする))とさらに美しいのだろうと思うのですが、よく比較しないと何とも言えないと思います -- [[henoheno]] &new{2007-11-15 (木) 23:40:02}; -- いずれにせよ次の一手は名称変更かなと。 -- [[henoheno]] &new{2007-11-15 (木) 23:44:56}; -- 第三引数以降を使っていたのは、TrackBack 関連だけみたいです。上に挙げた2つのプラグインは、第一引数しか使っては無いんですけど・・・。(上に引数の型を追記しておきました) -- &new{2007-11-15 (木) 23:52:31}; - 戻り値の型も違うようです(PECL版は'''string'''に対して、PukiWiki版は'''array''')。ラッパーを作るにしても、ちょっと面倒かもしれません。名称変更で様子見ですね。 -- [[よっちい]] &new{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.'); してみる。 -- [[よっちい]] &new{2007-12-15 (土) 10:24:15}; - 確認ありがとうございます。方針としては、そのバッティングしている機構が過去のtrackback実装でしか使われていない(そのために作られた)というのなら、その部分を捨てた上で、PECLにも互換の関数として作り直すのがスマートなのであろうと思っています。 -- [[henoheno]] &new{2007-12-18 (火) 01:01:42}; - 私は、以下の対処法にしました。 1、lib/pukiwiki.php // require(LIB_DIR . 'proxy.php'); のようにコメントにする (2、index.phpにて、error_reporting(E_ALL)を無効にする(コメントアウトする)) -- &new{2009-06-11 (木) 22:44:56}; - lib/proxy.php関連: [[BugTrack2/215]], [[BugTrack2/305]], [[BugTrack2/317]] -- &new{2010-10-05 (火) 21:18:06}; #comment ---- *インストールしたが何も表示されない [#u4369ca4] エラー表示を有効にした際の表示 Fatal error: Cannot redeclare http_request() in pukiwiki\lib\proxy.php on line 126 **原因 [#of5d1d59] ・グローバル関数 http_request (PECL pecl_http >= 1.0.0) との名称衝突 ・pukiwiki開発者が報告を長年無視し続けているため。 ・他のツールを無視したpukiwiki開発者の関数の命名方法に問題がある 将来の衝突回避および動作チェックや 添付プラグイン以外への影響を考慮すると最小限の修正ですむ対処法1が無難だろう。 **対処法1 [#uf9316b0] **対処法1 [#uf9316b0] 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) [#jae4f3e1] **対処法2(PHP 4 >= 4.3.0, PHP 5) [#jae4f3e1] ・ 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) -------- ***コメント [#b6a7202b] - pecl_httpのほうが後発だったような。PukiWiki 1.4が2003-11-03で、pecl_http 0.1.0が2005-01-27。 -- &new{2011-04-16 (土) 02:50:37}; - 修正しました。http_request()をpkwk_http_request()にリネームしました。外部からこの関数を使っている可能性を考慮して、pecl_httpが無い環境(http_request関数が定義済みでない環境)では、http_requestも元のように使えるようにしました -- [[umorigu]] &new{2016-02-05 (金) 00:56:57}; - 修正しました。http_request()をpkwk_http_request()にリネームしました。外部からこの関数を使っている可能性を考慮して、pecl_httpが無い環境(http_request関数が定義済みでない環境)では、http_requestも使えるようにしました -- [[umorigu]] &new{2016-02-05 (金) 00:56:57}; #comment