我需要做一些澄清来执行作为PHP 5模块实现的“类”。该类有一些方法,包括构造函数/析构函数,在PHP脚本中,我可以按如下方式使用它:
<?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)
?>
我的问题是:当发出请求时,上述脚本是在Apache2服务器的PHP模块中的单个线程中执行的吗?在我看来应该。
我问这个,因为我在C中实现了一个PHP5扩展,它使用Java JVM和一些JNI代码,因此当执行上面的脚本时,它使用类构造函数附加到JVM,调用方法(实际上是包装器)对于我的JNI调用)并使用析构函数从JVM中分离。
在调试模式下执行Apache(使用-X
),脚本运行就像一个魅力,多次运行(重新加载)完全没有问题,但Apache2 / PHP在常规多进程模式下,在几次调用JNI之后JVM的AttachCurrentThread
挂起。我尝试追踪该问题以找到解决方案。
是否有可能获得我正在执行哪个线程(id等)的信息?
我需要确保执行是单个线程执行。
我在Ubuntu Lucid 10.04 LTS上使用Apache2和PHP 5.2.16(源代码编译)
如果不清楚,请告诉我。感谢您的信息和帮助!
安德烈亚斯
答案 0 :(得分:0)
如果你在推荐的php prefork()配置modphp中有apahce2。然后每个http请求将在其自己的http进程中运行,每个进程只有一个php线程。我怀疑你是在其他一种模式下运行。
如果您不使用prefork配置,那么包装c库的一些php函数将开始破坏,因为它们不是线程安全的,包括上面提到的自定义Java代码。
还有一些fastcgi配置比modphp略微不同。