1

いつでもアクセスできるようにしたいphpオブジェクトがあります。このオブジェクトを一度作成し、永続的にして、再度リロードする必要がないようにします。また、このオブジェクトをコントローラー/モデルなどでアクセスできるようにしたいと思います。

これは、セッションを使用せずにCodeIgniter / PHPで実現できますか?

または、セッションを使用している可能性がありますが、そのメソッドにアクセスできますか?

このオブジェクトは、私のdllファイルからPHPCOMライブラリを使用して作成されます

これが私のオブジェクトのサンプルです:

 $myDllObject = new COM("MyDLL.MyCLass");
4

3 に答える 3

3

PHPには、ホスト環境からの各Web要求が、要求が完了すると破棄される新しい新しいPHP環境を生成する実行モデルがあります。

したがって、簡単な答えは「いいえ」です。オブジェクトを作成して、リクエスト間で永続化することはできません。他の方法でオブジェクトを「永続化」する必要があります。

  1. シリアル化/逆シリアル化を通じて、セッション、データベース、APCのようなキー値ストア、ファイルシステム上のファイル、またはその他の方法を使用します。
  2. 別の長時間実行プロセスにオブジェクトを保持させ、PHPオブジェクトに、共有メモリ、パイプ、ソケットなどのIPCメソッドを介してオブジェクトと通信させることによって。

COMについてはよくわかりませんが、実行中のプロセスの外部でCOMオブジェクトを作成できるため、新しいオブジェクトを作成するのではなく、既存のオブジェクトに接続する(PHP固有ではない)方法があるのではないかと思います。(これは基本的に上記のオプション2であり、COMサービスをIPCとして使用します。)

PHP COMライブラリのドキュメントを少し掘り下げると、com_get_active_object()機能が明らかになり、実用的なソリューションが得られる可能性があります。ただし、おそらくPHP以外のソースからCOMについてさらに学ぶ必要があります。また、単一のCOMオブジェクトを同時に使用することについての大きな警告を読んでください。

Webサーバーのコンテキストで使用com_get_active_object()することは、必ずしも賢明なアイデアではありません。ほとんどのCOM/OLEアプリケーションは、Microsoft Officeであっても(または特に!)複数のクライアントを同時に処理するようには設計されていません。関連する一般的な問題の詳細については、»Officeのサーバー側の自動化に関する考慮事項をお読みください。

これは、すべてのリクエスト間で共有されるシングルトンCOMオブジェクトを作成することは、実際にはやりたくないことであることを私に示唆しています。

それが機能しない場合、PHPには、オブジェクトの実行状態を文字列にシリアル化し、再び同じ状態に逆シリアル化できるオブジェクトシリアル化メソッドがあります。__sleep()クラスにand__wakeup()メソッドを追加することで、これをカスタマイズできます。このメカニズムには癖があり、PHPCOMライブラリプロキシオブジェクトがどれだけうまくサポートするかはわかりません。

于 2012-10-15T20:54:39.993 に答える
1

ライブラリの作成に関するCodeIgniterのドキュメントを参照してください。

ライブラリが作成されたら、を自動ロードするconfig/autoload.phpか、またはを使用してライブラリをロードするかを選択できます。$this->load->library('yourlib');

すべてのページリクエストでこのクラスの新しいインスタンスを作成する必要がある場合は、コントローラーのコンストラクターにインスタンス化を配置することを検討してください。または、基本コントローラークラスを作成し、そのコンストラクターに配置します。

于 2012-10-15T18:50:04.757 に答える
1

私はPHPCOMライブラリにあまり詳しくありませんが、オブジェクトの場合は、ベースコントローラでオブジェクトを作成し、そこで作成することで、その状態を維持できませんでした。次に、Baseクラスから他のクラスを拡張します。

class Base_Controller extends CI_Controller
{

    public $myDllObject;

    public function __construct()
    {
        $this->myDllObject = new COM("MyDLL.MyCLass");
    }
}

/*ファイルの終わりMY_Controller.php//場所:./ application / core / MY_Controller.php * /

コントローラの例

// ------------------------------------------------------------------------

class YourController extends Base_Controller
{

    public function __construct()
    {
        if (is_object($this->myDllObject))
        {
            echo 'Yep';
        }
        else 
        {
            echo 'Nope';
        }
    }
}
于 2012-10-15T18:48:38.877 に答える