我需要澄清一下执行一个作为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
),and脚本像一个charme一样运行,多次运行(重新加载)完全没有问题,但是Apache2/PHP在常规的多进程模式下,在对jmiAttachCurrentThread
调用了几次之后,JVM挂起。我试图找出那个问题的答案。有没有可能得到我在哪个线程(id,或类似的)中执行的一些信息?
我需要确保执行是单线程执行。
我在Ubuntu Lucid 10.04lts上使用Apache2和PHP 5.2.16(从源代码编译)
如果有什么不清楚的地方,请告诉我。谢谢你的信息和帮助!
安德烈亚斯
最佳答案
如果在modphp的php prefork()配置中推荐了apahce2。然后每个http请求将在其自己的http进程中运行,每个进程有一个php线程。我怀疑你是在用另外一种模式。
如果不使用prefork配置,包装c库的一些php函数将开始崩溃,因为它们不是线程安全的,包括上面提到的自定义java代码。
还有一些fastcgi配置的工作方式与modphp略有不同。
关于php - PHP脚本执行和多线程环境(PHP5扩展),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5440198/