Async задачи в PHP
Привет :)
Работя върху система, която автоматично да извършва задачи, които понякога може да отнемат доста време от порядъка на 20 и повече секунди. Няма да е ок потребителят да седи на страницата докато му се показва някакъв loadbar, а и задачите, които ще се извършват от сървъра няма да са пряко свързани с потребителя.
И се чудя дали е възможно да се реализира подобна функционалност с php: потребителят изпраща заявка на сървъра, че иска да направи нещо и сървъра връща отговор: "ок, заемам се"; след което сървъра започва да работи върху изпратената от потребителя задача. Ако юзера иска да провери до каква степен от изпълнението на заявката е стигнал сървъра, праща заявка на която сървъра връща само процент на това колко от задачата е свършил. А когато сървъра свърши със задачата, просто вдига един флаг в БД, че е готов.
Тази функционалност наподобява малко на youtube, където може да пуснеш заявка, че искаш да си направиш видеото черно бяло например. Но няма да седиш и да чакаш отговор от сървъра, а тази задача се изпълнява отзад, а потребителя само вижда до каква степен на завършеност на задачата е стигнал сървъра. Горе долу ми трябва подобна функционалност само дето няма да обработвам видео. :)
Благодаря ти много за предложенията!
А възможно ли е да се направи и с cron или няма да е толкова ефективно. Идеята ми е да върви един крон, който всяка минута да проверява за нови записи в таблица в БД, в която таблица ще се добавя запис, когато потребителят поиска да пусне background задача, като съответните необходими параметри ще бъдат в различни колони. И крон-а като види, че има нов запис в таблицата, взимам му параметрите, слага един флаг че се работи върху съответния запис в базата (за да не го хване същото нещо следващия крон). И крон-а като си свърши работа вдига още един флаг на съответния ред от базата, от който е взел параметрите, че е готово.
Това може ли да се приеме като ефективно решение, ако приемем, че не е критично за workflow-a ако не се започне изпълнението на beckground task-a в момента, в който потребителя прати заявката за начало на задачата.
Да, разбира се, кронът е просто начин на определени интервали да spawn-неш процеси от операционната система. Това, което ще направи кронът е да spawn-не php процес, който да интерпретира определен .php файл. Същото ще постигнеш и с proc_open :) Направо го както ти е по-удобно щом не е критично натоварването, тъй като кронът на всяка минута със сигурност е по-затормозяващ :)