2011-03-26 2 views
1

PHP 5 모듈로 구현 된 "클래스"를 실행하는 데 필요한 설명이 필요합니다. 이 클래스는 생성자/소멸자를 포함하여 몇 가지 방법을 가지고 있으며, 다음과 같이 PHP 스크립트에서 나는 그것을 사용할 수 있습니다PHP 스크립트 실행 및 다중 스레드 환경 (PHP5 확장)


<?php 
// --- construct 
$c = new my_class("some argument"); 

// --- add data 
foreach ($arr_of_elements as $k => $v) { 
    $c->add_element($v); 
} 
// --- execute algorithm 
$c->execute(); 

// --- get result as xml format 
$result = $c->get_result_as_xml(); 
// --- end of script (destruct) 
?> 

내 질문은 : 요청이 내 단일 스레드에서 위의 스크립트를 실행하게되면 아파치 2 서버의 PHP 모듈? 제 의견으로는 그렇게해야합니다.

일부 JNI 코드가있는 Java JVM을 사용하는 C에서 PHP5 확장을 구현했기 때문에이 질문을하고 있습니다. 위의 스크립트를 실행하면 클래스 생성자가있는 JVM에 연결되어 실제로 JNI 호출 용 래퍼) 소멸자가있는 JVM에서 분리됩니다. 디버깅 모드에서 아파치를 실행하면 (그리고 -X을 사용하여), 스크립트는 charme처럼 실행되며, 다중 실행 (재 로딩)은 전혀 문제가되지 않지만, 아파치 2/PHP는 일반적인 멀티 프로세스 모드에서 JNI AttachCurrentThread을 호출 한 후 JVM이 중지됩니다. 나는 해결책을 찾기 위해 그 문제를 추적하려고 노력한다.

실행중인 스레드 (ID 등)의 정보를 얻을 수 있습니까?

실행이 단일 스레드 실행인지 확인해야합니다.

나는

뭔가 불분명 경우 우분투 맑은 10.04 LTS

에 (소스에서 컴파일 된) PHP 5.2.16와 아파치를 사용하고, 알려 주시기 바랍니다. 정보 및 도움에 감사드립니다!

안드레아스 당신이 modphp와 PHP는 prefork의 권장() 구성 apahce2을 가지고있는 경우에

+0

PHP 내부와 Apache에 대해 조금이라도 통찰력을 갖고있는 사람이 있습니까? –

답변

0

. 그런 다음 각 HTTP 요청은 프로세스 당 하나의 PHP 스레드로 자체 http 프로세스에서 실행됩니다. 다른 모드 중 하나에서 실행되고있는 것 같습니다.

prefork 구성을 사용하지 않는 경우 위에 언급 한 사용자 정의 Java 코드를 포함하여 스레드 라이브러리가 포함되어 있지 않으므로 C 라이브러리를 래핑하는 일부 PHP 함수가 파열되기 시작합니다.

또한 modphp와 약간 다른 방식으로 작동하는 fastcgi 구성이 몇 가지 있습니다.

+0

저는 실제로 그 개발 서버에서 다중 스레드 버전을 실행합니다. 아마 아파치'-X' 플래그 디버그 플래그를 사용하여 확장 기능이 단 하나의 프로세스에서만 작동하는 이유 일 수 있습니다. 좀 더 읽고 나면 MPM 버전을 사용하기 때문에 이것이 내 문제의 원인이라고 생각합니다. MPM이 아닌 사전 포크 (pre-fork) 버전에서 확장 기능을 테스트 할 것입니다. 나는 다음날 결과를보고 할 것이다. –

+0

Andreas, prefork 버전을 사용해 본 적이 있습니까? –

+0

아직은 아니지만 다른 서버를 설치하고 내 질문에 대한 프로젝트를 계속 진행하고 거기에서 일을 시도합니다. 결과가 나오면 다시 올거야! –