Jump to content
  • 0

PHP в несколько потоков


Veseloff
 Share

Question

Вроде бы как PHP вообще не умеет работать с потоками, что, конечно, жаль. На одном ресурсе есть необходимость массового ресайза картинок. Какие я вижу варианты:

1. Делать всё через, например, imagecopyresampled, но тут такой момент, что пока функция не исполнится не запустится следующая итерация

2. Запускать какой-нибудь «пережимный» скрипт через exec('команда & > /dev/null'), но тут может создаться дичайшая очередь, процессор нагрузится на все ядра на 100% и его не отпустит, пока всё не будет пережато.

Я бы хотел найти какой-нибудь компромисс между первым и вторым вариантами, чтобы больше одного потока использовалось и очередь не создавалась. В данный момент всё делается при помощи хитрого демона, который определённым образом рулит этим хозяйством, но этот вариант сейчас стал по мнногим причинам неудобным и вот я думаю как же быть. Кто-нибудь сталкивался с таким? Кто вообще что думает по этому поводу?

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Многопоточность в пхп всегда решалась через cURL:

curl_multi_init -- Создает набор cURL дескрипторов

curl_multi_exec -- Выполняет операции с набором cURL дескрипторов

curl_multi_add_handle -- Добавляет обычный cURL дескриптор к набору cURL дескрипторов

curl_multi_getcontent -- Возвращает результат операции, если был установлен параметр CURLOPT_RETURNTRANSFER

curl_multi_info_read -- Возвращает информацию о текущих операциях

curl_multi_select -- Возвращает сокеты, созданные модулем cURL

curl_multi_remove_handle -- Удаляет cURL дескриптор из набора cURL дескрипторов

curl_multi_close -- Закрывает набор cURL дескрипторов

  • Like 1
Link to comment
Share on other sites

  • 0

Многопоточность в пхп всегда решалась через cURL:

curl_multi_init -- Создает набор cURL дескрипторов

curl_multi_exec -- Выполняет операции с набором cURL дескрипторов

curl_multi_add_handle -- Добавляет обычный cURL дескриптор к набору cURL дескрипторов

curl_multi_getcontent -- Возвращает результат операции, если был установлен параметр CURLOPT_RETURNTRANSFER

curl_multi_info_read -- Возвращает информацию о текущих операциях

curl_multi_select -- Возвращает сокеты, созданные модулем cURL

curl_multi_remove_handle -- Удаляет cURL дескриптор из набора cURL дескрипторов

curl_multi_close -- Закрывает набор cURL дескрипторов

Благодарю. Надо будет взглянуть.

Link to comment
Share on other sites

  • 0

Я делал потоки в виде бесконечных циклов. У каждого потока свой файл для чтения заданий и записи результатов. Один поток главный - запускает и сбрасывает другие потоки, а так же раздает задания и анализирует результаты. При этом всплыли следующие неожиданные моменты:

1. Потоки иногда сбрасываются сами, поэтому периодически надо проверять их "признаки жизни": счетчик циклов и момент остановки. У главного потока "признаки жизни" проверяет Крон.

2. В начале файла потока ставил flush(), что бы минимизировать задержку при запуске через culr.

3. Файлы, через которые ведется обмен данными не всегда доступны для записи и это надо как-то учитывать.

Еще эта тема иногда мелькает на Хабре. Но там они давно уже не ограничиваются стандартными средствами PHP.

Link to comment
Share on other sites

  • 0

Я делал потоки в виде бесконечных циклов. У каждого потока свой файл для чтения заданий и записи результатов. Один поток главный - запускает и сбрасывает другие потоки, а так же раздает задания и анализирует результаты. При этом всплыли следующие неожиданные моменты:

1. Потоки иногда сбрасываются сами, поэтому периодически надо проверять их "признаки жизни": счетчик циклов и момент остановки. У главного потока "признаки жизни" проверяет Крон.

2. В начале файла потока ставил flush(), что бы минимизировать задержку при запуске через culr.

3. Файлы, через которые ведется обмен данными не всегда доступны для записи и это надо как-то учитывать.

Еще эта тема иногда мелькает на Хабре. Но там они давно уже не ограничиваются стандартными средствами PHP.

Идейки весьма интересные!

Может через register_shutdown_function() можно дать возможность потоку "сказать" о своем закрытии?

Edited by alanvanduke
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy