#worker
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете таймауты при http запросах, продолжительные вычисления, парсинг файлов и так далее.
Что можно с этим сделать? Например, использовать сигналы. Для этого вам потребуется расширение
Разберем, что здесь происходит:
1. Включаем асинхронную обработку сигналов, так как синхронно сигнал вы не получите, если воркер будет заблокирован:
2. Задаем таймер для сигнала
3. Устанавливаем обработчик данного сигнала:
4. Запускаем долгую задачу.
5. Сбрасываем обработчик сигнала:
Теперь каждая ваша задача не может выполняться дольше, чем 3 секунды.
На тему обработки сигналов есть хорошая библиотека от автора монолога, которая позволяет обрабатывать любые сигналы, отправленные процессу, и как-то на них реагировать.
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете таймауты при http запросах, продолжительные вычисления, парсинг файлов и так далее.
Что можно с этим сделать? Например, использовать сигналы. Для этого вам потребуется расширение
pcntl:pcntl_async_signals(true);
while (1) {
pcntl_alarm(3);
pcntl_signal(SIGALRM, function (): void {
throw new RuntimeException();
});
doWork(); // running too slow task.
pcntl_alarm(0);
}
Разберем, что здесь происходит:
1. Включаем асинхронную обработку сигналов, так как синхронно сигнал вы не получите, если воркер будет заблокирован:
pcntl_async_signals(true);
2. Задаем таймер для сигнала
SIGALRM, которые будет отправлен текущему процессу через 3 секунды:pcntl_alarm(3);
3. Устанавливаем обработчик данного сигнала:
pcntl_signal(SIGALRM, function (): void {
throw new RuntimeException();
});
4. Запускаем долгую задачу.
5. Сбрасываем обработчик сигнала:
pcntl_alarm(0);
Теперь каждая ваша задача не может выполняться дольше, чем 3 секунды.
На тему обработки сигналов есть хорошая библиотека от автора монолога, которая позволяет обрабатывать любые сигналы, отправленные процессу, и как-то на них реагировать.
GitHub
GitHub - Seldaek/signal-handler: Simple unix signal handler that silently fails on windows for easy cross-platform development
Simple unix signal handler that silently fails on windows for easy cross-platform development - Seldaek/signal-handler
👍22
#worker
По следам вчерашней публикации.
Оказалось, такой сигнал, к сожалению, не сможет прервать выполнение кода, если выполняется какой-нибудь длительный запрос через
Решение для
Для
Спасибо @the_toster за ссылку.
По следам вчерашней публикации.
Оказалось, такой сигнал, к сожалению, не сможет прервать выполнение кода, если выполняется какой-нибудь длительный запрос через
file_get_contents, curl, etc. Решение для
curl можно найти на stackoverflow. Для
file_get_contents можно использовать контекст:$ctx = stream_context_create(['http'=> ['timeout' => 3]]);
echo file_get_contents(filename: 'http://example.com/', context: $ctx);
Спасибо @the_toster за ссылку.
Telegram
Библиотека пхпшника
#worker
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете…
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете…
👍12