PHP の oci_connect 空白ページ
質問
更新 (2010/5/21) 成功しました!
$head->desk() を何度も繰り返した後、私はそれを解決しました。
仮想化設定に応じて、使用するインスタント クライアントのバージョンに注意してください。
私は汎用のインスタント クライアントをインストールしていました (ESX サーバーが Intel ではなく AMD プロセッサ上にあることは知りませんでした) が、内部的には正常に動作しました (内部 ESXi サーバーが 64 ビットではないため、CentOS のインストールは 32 ビットでした)。驚くべきことに、AMD64 上にある仮想化サーバー上で 32 ビット インストールを実行している場合でも、どのインスタント クライアントをインストールするかが依然として重要です。
チェックするのは最後に考えたのですが、どうやら今はすべてが正常に動作しているようです。
これを解明するためにあらゆるテストを実行するのを手伝ってくれた皆さんに感謝したいと思いますが、最終的には、仮想化の違いに気づかなかった私の責任でした。
更新 (2010/5/21)このバグは内部的に新しい VM にインストールしたときに回避できたと思っていましたが、現在では狭いリンクを見つけました。
これを投稿したとき、私はこれを運用サーバーにインストールしようとしていました。1 週間進歩がなく、開発に戻る必要があるため、社内サーバー上の VM に Crap の新しいインストールを装備しました。CentOS、インスタント クライアントと oci8 の新規インストール。
完璧に機能しました。
ただし、VM の正確なコピーを運用サーバーにアップロードしただけで、魔法のように機能しなくなりました。すべてを再インストールしようとしましたが、役に立ちませんでした。
したがって、原因を絞り込めるのは、ファイアウォールの問題 (ただし、127.0.0.1 を試しても同じ問題が発生します)、またはおそらく ESX (実稼働サーバー) サーバーの問題 (内部サーバーが ESXi を実行していること) に絞り込むことができます。
何かご意見は?
更新 (2010/3/8) Xdebug をインストールし、コードをトレースさせました。これは私が得ている出力です:
TRACE START [2010-03-08 17:53:05]
0.2090 327864 -> {main}() /data/aims3/http/octest.php:0
0.2091 327988 -> ini_set(string(14), string(1)) /data/aims3/http/octest.php:3
0.2093 327920 -> error_reporting(long) /data/aims3/http/octest.php:4
0.2094 328048 -> oci_connect(string(8), string(8), string(25)) /data/aims3/http/octest.php:6
トレースはその時点で停止します。
すべてを同じ方法でローカルサーバーにインストールしましたが、正常に動作します。私が完全に途方に暮れていると言うのは、軽く言うかもしれません。
*注記:make test を実行しましたが、すべてのテストで FAIL が返されました。同じエラーが報告されるかどうかを確認するために、作業用マシンでこれを実行したことはありません。make test は FAIL を報告するのに、make はエラーを報告しない理由は何か考えられますか?
OCI8 PECL パッケージとともに Oracle Instantclient をインストールしましたが、エラーは報告されていませんでしたが、途方に暮れました。oci_connect を使用して接続を開こうとすると、PHP スクリプト全体が停止します。
例:
<?php
ini_set ("display_errors", "1");
error_reporting(E_ALL);
echo "before";
$conn = oci_connect("username", "password", "host");
echo "after";
?>
完全な空白のページを返します。モジュールがロードされ (phpinfo で確認)、すべてがエラーなしでインストールされます。
私は完全に途方に暮れています。
セントOS:5.4
アパッチ:2.2.3
PHP:5.3.1
インスタントクライアント:11.2
oci8:1.4.1
何かご意見は?
ノート
Apache エラー ログには何も報告されません
試行されたデバッグ:
1:
<?php
ini_set ("display_errors", "1");
error_reporting(E_ALL);
echo "before";
if(!function_exists('oci_connect')) die('Oracle Not Installed');
echo "after";
?>
戻り値:
beforeafter
2:
ホストを //host に変更します
戻り値:
同じエラー
解決 5
修正されました。詳細については上部を参照してくださいが、崖のメモは次のとおりです。仮想化環境は重要です。
他のヒント
Apache の error_log に何かありますか?これは mod_php ですか、FastCGI ですか、それとも通常の CGI PHP ですか?コマンドライン経由でスクリプトを実行するとどうなりますか?
設定してみるのもいいでしょう PHPのエラーログ そしてそこを覗いています。
編集1:試す:
echo "before";
if(!function_exists('oci_connect')) die('Oracle Not Installed');
そして結果を投稿してください...
編集2:本当にわかりません。私の最善の策は、この情報です PHPマニュアル:
OCI8をインストールする際の最も一般的な問題は、Oracle環境を正しく設定していないことです。これは通常、oci_connect()またはoci_pconnect()を使用して問題として表示されます。エラーは、未定義の関数oci_connect()への呼び出し、ORA-12705などのOracleエラー、さらにはApacheクラッシュなどのPHPエラーである場合があります。StartupエラーについてはApacheログファイルを確認し、上記のセクションを参照して、この問題を解決します。
ブライアンを助けるアイデアを持っている人はいますか?
ブライアン、
正直に言うと、私は2年前にこれを試みましたが、惨めに失敗しました。:) 自分でコンパイルしても OCI 関数を動作させることができませんでした。
しかし、それを実現するために代替ソリューションを探したところ、Zend Core for Oracle を見つけました。ダウンロードしてインストーラーを実行するだけで完了です。Apache/PHP、MySQL (オプション)、InstantClient がインストールされます。
現在は Zend Server となっており、基本的には同じ製品です。これがあなたが望んでいた解決策ではないかもしれないことは承知していますが、うまくいけば...
リモートデータベースに接続していますか、それともローカルデータベースに接続していますか?localhost の場合は、「host」を「false」に置き換える必要があると思います。これがお役に立てば幸いです...
編集:パラメータが不足していると思います...最後の提案は次のとおりです。1.ポート (デフォルトは 1521) および/または 2 を設定する必要があります。データベース名を入力するか、またはインスタンス名 (ORACLE_SID パラメータ) を設定する必要があります。
oci_connect() の戻り値をチェックしたり、 oci_error() を呼び出したりすることはありませんが、PHP クラッシュに悩まされているようですので、それは問題とは関係がないようです。RHEL には、あなたにも影響を与える可能性のある未解決のバグがあります。
http://pecl.php.net/bugs/bug.php?id=16626
oci8 パッケージは自分でビルドしましたか?サードパーティのバイナリを使用していますか?