Выполнение PHP-скриптов и многопоточная среда (расширение PHP5) - PullRequest
1 голос
/ 26 марта 2011

Мне нужно кое-что прояснить, выполняя «класс», который реализован в виде модуля 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)
?>

Мой вопрос: когда выполняется запрос, выполняется ли приведенный выше скрипт в одном потоке в модуле PHP сервера Apache2? На мой взгляд, так и должно быть.

Я спрашиваю об этом, потому что я реализовал расширение PHP5 в C, которое использует Java JVM с некоторым кодом JNI, поэтому при выполнении вышеуказанного сценария он подключается к JVM с помощью конструктора класса, вызывает методы (которые на самом деле являются обертками). для моих вызовов JNI) и отсоединяется от JVM с деструктором. При выполнении Apache в режиме отладки (с использованием -X) сценарий and запускается как чудо, многократные запуски (перезагрузка) не создают никаких проблем, но Apache2 / PHP в обычном многопроцессорном режиме после нескольких вызовов JNI AttachCurrentThread к JVM висит. Я пытаюсь отследить эту проблему, чтобы найти решение.

Есть ли возможность получить некоторую информацию, в каком потоке (id или тому подобное) я выполняю?

Мне нужно убедиться, что выполнение является однопоточным.

Я использую Apache2 с PHP 5.2.16 (скомпилировано из исходного кода) в Ubuntu Lucid 10.04 LTS

Если что-то неясно, пожалуйста, дайте мне знать. Спасибо за информацию и помощь!

Andreas

1 Ответ

0 голосов
/ 01 апреля 2011

Если у вас есть apahce2 в рекомендованной для php конфигурации prefork () с modphp.Тогда каждый http-запрос будет выполняться в своем собственном http-процессе с одним потоком php на процесс.Я подозреваю, что вы работаете в одном из других режимов.

Если вы не используете конфигурацию prefork, некоторые из функций php, которые обертывают библиотеки c, начнут работать, поскольку они не являются поточно-ориентированными, включая упомянутый вами пользовательский код Java.выше.

Есть также несколько конфигураций fastcgi, которые работают немного иначе, чем modphp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...