Соединение PHP OCI игнорирует SIGINT (ctrl-c)

У меня проблема с модулем php OCI8.

У меня есть рабочий php, обрабатывающий некоторые вещи, и я понял, что когда есть открытое соединение oci, скрипт php игнорирует любой сигнал прерывания:

<?php

$db = oci_connect(...);

while (true) {
    // do something
}

нет способа изящно остановить этот скрипт. По крайней мере, то, что я знаю. Я попытался использовать pcntl_signal() для создания собственного обработчика сигналов, но это не сработает. Сейчас мне нужно убить процесс вручную.

У кого-нибудь есть эта проблема или способ справиться с SIGINT с помощью oci?

ваше здоровье!


person Friedrich Roell    schedule 23.01.2017    source источник
comment
возможный дубликат: stackoverflow.com/questions/17124881/   -  person ibre5041    schedule 24.01.2017


Ответы (1)


Вы можете попробовать этот код:

declare(ticks=1); //mandatory
oci_connect(...);

pcntl_signal(SIGINT, 'sig_handler'); //set handler for signal

$i = 0;
while(true) {
    echo $i;
    $i++;
}

//will handle the ctrl+c. Put whatever you want to do
function sig_handler() {
    echo "DIE DIE DIE!";
    die();
}

Подробнее здесь: http://php.net/manual/en/function.pcntl-signal.php

person Felippe Duarte    schedule 23.01.2017
comment
к сожалению, как я уже говорил, пользовательские обработчики сигналов тоже не работают :/ - person Friedrich Roell; 24.01.2017
comment
Я запустил именно этот код, подключившись к базе данных Oracle 11g, и он работает. Вы пробовали именно этот код? - person Felippe Duarte; 24.01.2017
comment
ИМХО лучше поставить env. переменная DIAG_SIGHANDLER_ENABLED=FALSE перед запуском PHP. - person ibre5041; 24.01.2017
comment
@FelippeDuarte хорошо ... после запуска ТОЧНО предоставленного вами кода он действительно сработал. Разница: у меня был пустой цикл while, а у вас было эхо. кто-нибудь знает, как это заставило его работать? - person Friedrich Roell; 30.01.2017
comment
Работай здесь с while(true) {}. Не могли бы вы обновить свой вопрос кодом, который вы на самом деле используете? (опуская конфиденциальную информацию) - person Felippe Duarte; 30.01.2017