0

Zend Framework プロジェクトでpthreads ( http://php.net/manual/en/book.pthreads.php ) ライブラリを使用しています。問題は、新しいスレッドが ZF 初期化全体とは異なるメモリ スコープを使用することです。したがって、スレッド スコープからは Zend Framework の機能にアクセスできません。したがって、スレッド呼び出しごとに Zend Framework 全体をロード (初期化) する必要があります。しかし、これを適切に行う方法がわかりません...私がすでに行っていること(スレッドでのZF初期化)と、実際に機能していないこと:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

アイデアはありますか?ZF全体を適切にロードする例はありますか?

あなたの助けをいただければ幸いです。

4

1 に答える 1

4

スレッドは別のアドレス空間にあります。ただし、環境にスレッドを作成すると、ロードされたクラス(オブジェクトではない)、関数、宣言された定数、およびiniエントリが新しいコンテキストに複製されます。

アプリケーションを表すオブジェクトは標準オブジェクトのようです。スレッドのメンバーに設定するだけで、アプリケーションオブジェクトをスレッドコンテキストで使用できるようになります。それが正しいことであるかどうかはわかりません。すべてのスレッドでアプリケーション全体をロードすることは役に立たないようです。フレームワークのインスタンスをロードしたいが、タスクごとに異なる構成をしたいと思います。

フレームワークについては何も知らないと言ったので、スレッドコンテキストで利用可能なZF2の実際の例を次に示しますが、役立つ場合があります。

<?php
use Zend\Loader\StandardAutoloader;
use Zend\Feed\Reader\Reader;
use Zend\Debug\Debug;

require_once 'Zend/library/Zend/Loader/StandardAutoloader.php';
$loader = new StandardAutoloader(array('autoregister_zf' => true));
$loader->register();

class T extends Thread {
    public function __construct($loader) {
        $this->loader = $loader;
    }

    public function run() {
        $this->loader->register();

        printf(
            "Executing Thread with ZF2 Loaded (%s)\n", Debug::getSapi() 
        );

        var_dump ($this->loader);
    }
}

$t = new T($loader);
$t->start();
?>
于 2013-01-25T12:48:22.390 に答える