2013-01-25 3 views
0

내 젠드 프레임 워크 프로젝트에서 pthreads (http://php.net/manual/en/book.pthreads.php) 라이브러리를 사용하고 있습니다. 문제는 새 스레드가 전체 ZF 초기화에서 다른 메모리 범위를 사용한다는 것입니다. 그래서 쓰레드 범위에서 Zend Framework 기능에 접근 할 수 없습니다. 그래서 모든 단일 스레드 호출에서 전체 Zend Framework를로드 (초기화)해야합니다. 하지만 제대로이 작업을 수행하는 방법을 모른다 ... 임은 이미 (스레드에서 ZF 초기화)하고 실제로 나를 위해 무엇을 작동하지 않습니다 무엇 :젠드 프레임 워크 및 pthreads 라이브러리 구현

<?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

스레드가 다른 주소 공간에 있습니다. 그러나 스레드를 생성 할 때 환경 (객체가 아닌), 함수, 선언 된 상수 및 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(); 
?> 
+0

+ 멋진 트릭 .. 나는 이것이 다른 관련 문제 – Baba

+1

@JoeWatkins 해결을 참조하십시오 - 당신이 추가 정보 @의 GitHub의에이 주제를 연결하면 아마 유용 할 것, 그것은 자동로드에 스레드를 얻기 위해 잠시했다 및 그 후 나는이 게시물을 발견 할 수 있었는데, 그것은 나에게 공정한 시간을 절약 할 수 있었다. 그 외, php를위한 유저 랜드 스레딩을 제공하는 훌륭한 일 :) –