Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Добрый день, товарищи.
Есть необходимость выполнить определённый процесс в несколько потоков. Открыл для себя расширение для php - pthreads.
На примере простого скрипта вне Laravel всё работает замечательно и мне очень понравились результаты. Решил перенести в Laravel и столкнулся с проблемой. Конечно же я поискал в сети, отыскал несколько вопросов на stackoverflow, где отвечал сам автор расширения. Но мне не помогли его ответы, потому я прошу вас помочь мне.
Вопрос с ответом автора расширения.
Есть класс App\Commands\QuestionsParserCommand. Внутри я создаю экземпляр класса App\My\Questions\QuestionsParser и вызываю метод init. Дальше код метода init():
// Создадим пул
$pool = new Pool($this->threads, ParserWorkers::class);
// Создадим класс потока
$thread = new class extends Threaded
{
public function run()
{
// Класс будет получать определённые данные из некого провайдера, который будет распределяться между потоками через ParserWorkers
// Работать с API и сохранять данные в БД.
// Необходима работа с потоками, ибо данных для обработки невероятно много
echo '+';
}
};
// Запустим потоки
for ($i = 0; $i < $this->threads; $i++) {
$pool->submit($thread);
}
$pool->shutdown();
Класс ParserWorkers наследуется от Worker и пока имеет пустой метод run().
В итоге я запускаю сценарий и получаю в логах сообщение:
[13-Oct-2016 11:27:35 Europe/Moscow] PHP Fatal error: Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0
Stack trace:
#0 {main}
thrown in [no active file] on line 0
Сведения:
Laravel 5.2.43, php 7.0.8, Windows
Изменено Nik_Gubin (13.10.2016 11:52:51)
Не в сети
Изобретаешь велик.
В ларе есть механизмы консольных команд, очередей и механизм шедулера.
Дёргай ИЗВНЕ шедулет, дёргающий очереди АСИНХРОННО, которые работают с командной строкой.
И будет тебе параллельное исполнение кода.
Если нужно взаимодействие между такими "потоками", то в принципе тоже не большая проблема создать посредника, который будет читаем и записываем, например БД.
Не в сети
Я знал, что получу такой ответ. Ничего нового.
А что вы можете предложить с решением вопроса?
Мне не подходит реализация этой задачи на очередях.
Не в сети
пиши свой фреймворк для исполнения работы и реализуй на базе сервера очередей Gearman. Обязательно посмотри и почитай про него, я на нём подобное реализовывал. А со сторонв РНР я тупо форкал процессы, а не делил на потоки. Язык в принципе линейный, потоки и форки это от лукавого...
Не в сети
Laravel + Redis + Node.js
Нода хорошо работает с асинхронным кодом. ну аесли тебе результаты парссинга надо заносить в бд, то можно обойтись и без laravel.
Плюсую к @hzone. Адекватно на PHP, с использованием существующих пакетов, мультипоточность сделать не получится. Слишком не приспособлены они.
Возможно тебе стоит воспользоваться ещё какими нибудь языками программирования.
Не в сети