Изпълняване на бекграунд скрипт

vinsbg

Registered
Приятели, пак ще имам нужда от помощ с моите "интересни" проблеми :)

Имам форма, в която потебител въвежда код ( някакъв стринг ), който е получил, след като е събмитнал поръчка.

Това, което искам да направя е когато въведе кода и събмитне формата да се задейства друг скрипт в бекгроунд, който постоянно(периодично с някакъв sleep?) да изпраща този код към апи, докато получи отговор от апито. Когато получи отговора ъпдейтва колона в базата данни и приключва.

С този код, който получава проверявам валидността на поръчката. Проблема е, че API-то може да върне OK/NOT OK след 5мин ... 55мин.. 2 часа.. Просто времето на получаване на отговор е неопределено. NOT OK означава, че още не е обработен кода.

За да ми е още по-гадно cronjob-a е забранен на сървара. Пример:

1. user1 submit order -> това се записва в база със статус 0
2. редиректва юзъра на нова страница, където той събмитва кода
3. background скрипта получава кода и проверява API-то.
3.1. API-то връща ОК -> ъпдейтвам в базата статус 1 и спира
3.2. API-то връща NOT OK скрипта проверява отново след 1-2мин, докато дойде ОК..

Трябва ми някакво бързо решение та дори да не е перфектно...
 
Има и много по-лесен варянт. Ajax + php. Иначе рискуваш нонстоп страницата да ти показва че се опитва да зареди когато няма респонд, а с ajax можеш да си направиш циклично извикване на php кода и от там той да ти връща респонд от API-то. Смисъл, така си спестяваш куп други проблеми били те със sleep или някакви други методи. Ajax ще ти реши куп проблеми, е би могъл да ти съсзаде някой друг също, но си мисля, че това е решението ти на проблема.
 
dakata__92 каза:
Има и много по-лесен варянт. Ajax + php. Иначе рискуваш нонстоп страницата да ти показва че се опитва да зареди когато няма респонд, а с ajax можеш да си направиш циклично извикване на php кода и от там той да ти връща респонд от API-то. Смисъл, така си спестяваш куп други проблеми били те със sleep или някакви други методи. Ajax ще ти реши куп проблеми, е би могъл да ти съсзаде някой друг също, но си мисля, че това е решението ти на проблема.

И това не е решение, защото API-то му ще върне отговор след няколко минути, а AJAX ще спре да работи при първата смяна на страницата, а до колкото разбирам, автора не желае това.

Генералния проблем е, че трябваше да се помисли за сървъра предварително.

Сещам се за 3 варианта:
1. Стягаш се и си взимаш хубав платен хостинг или най-добре cloud (digitalocean са чук) и си правиш неща като хората
2. Отваряш си портовете на твоя компютър, правиш си един скрипт, който да върви конзолно и от хостинга изпращаш заявка към компа ти, а когато е готов отговра, го връща към сайта ти.
-- Проблема тука е, че използването на данните от сайта ще е проблем. Ако речеш, че искаш да използваш база данните на сайта или нещо друго, няма да можеш, освен ако не изпратиш и тях данни към локалния сървър.
3. Хващаш се и четеш за WebWorkers. Обхващаш AJAX в един WebWorker и той ще си работи в отделна нишка.

П.П. Още вариант има, но не съм го тествал: pcntl_*()
 
Хич не съм видял времето за отговор. Смисъл при разсъжденията ми съм го загубил някъде. Та варянт е Cron задача. Стартираш крон задача веднъж и кода ще си върти на заден фон отговора и като го получи го вкарваш в базата с данни, като с ajax може да правиш периодични запитвания за отговор от базата и ще си каже дали е възможно. Идеята е, че ти стартираш задачата а тя ще чака отговор на заден фон, след което като въведе всичко в базата с периодично допитване за промяна ще откриеш дали има върнат резултат, без да ти се налага да чакаш страницата да зарежда постоянно. Проблема тук ще ти е с броят крон задачи.

http://stackoverflow.com/questions/6548746/how-to-start-stop-a-cronjob-using-php

https://www.google.bg/?gws_rd=ssl#q=php+start+cron+job
 
Проблема му е, че сървъра му е скапан и няма CronJobs :D :D

Защо въобще се занимавате още с безплатни хостинги. Не е толкова скъпо да се плаща на година хостинг + домейн, а можеш да си го ползваш постоянно и да тестваш реални приложения.

Сега нямам време да тествам последния вариант, който дадох, защото идеята е да се пусне още една нишка паралелно(понеже няма cron).

@vinsbg на какво се базира времето за отговор и защо е толкова бавен ?
 
А тва "API" ти ли го държиш, или е некъв third-party сървис?

Иначе най-добре е VPS, OVH (примерно) предлагат големи гъзарийки. ;D
 
Eми не виждам начин на една страница да очакваш респонд от някъде си без да не остава страницата да зарежда до отговор. Единствено ajax но и той, както казват колегите би крашнал. Варянт е да направиш изкачащ прозорец или да отваря страницата в друг таб и там да върти и очаква респонд от API то докато потребителя си се рови из сайта. На едно приложение което писах, доста тежко това се оказа решението. Клика потребителя на формата с попълнените полета отваря се нов таб в браузъра, който търси отговор от някъде си, докато на същата страница пренасочвам потребителя да си се рови из сайта ако е наложаща логика. (<form target="_blank">)
 
И с web workers не става, като презареди страницата пак се спира. Трябва ти background job queue. Пример amazon sqs
 
Здравейте,

Благодаря за предложенията. API-то е 3rd party и не е мое. Времето за реакция не ми е ясно, защо е неопределено и така се бави.

Хоста не е безплатен, но с крон не може да се работи. Това, което аз успях да намеря по въпроса е Gearman: http://gearman.org/

Мисля, че би трябвало да свърши работа. Някой запознат ли е с него?
 
Не може ли да се проверява тоя статус само когато юзъра е логнат и си цъка из сайта? При всяка заявка пускаш AJAX да си проверява и ако е готова поръчката си прави там квото си прави...
 
vinsbg каза:
Здравейте,

Благодаря за предложенията. API-то е 3rd party и не е мое. Времето за реакция не ми е ясно, защо е неопределено и така се бави.

Хоста не е безплатен, но с крон не може да се работи. Това, което аз успях да намеря по въпроса е Gearman: http://gearman.org/

Мисля, че би трябвало да свърши работа. Някой запознат ли е с него?

Виж, това, което трябва да направиш е да вкараш job-а с кода и worker-a там през 2 мин да правиш заявки да видиш дали е ОК, когато е ОК, правиш си нещата в БД и махаш job-а. Rinse and repeat. Дали ще използваш gearman, beanstalkd, amazon sqs или каквото и да е, е твой избор.
 
lam3r4370 каза:
Виж, това, което трябва да направиш е да вкараш job-а с кода и worker-a там през 2 мин да правиш заявки да видиш дали е ОК, когато е ОК, правиш си нещата в БД и махаш job-а. Rinse and repeat. Дали ще използваш gearman, beanstalkd, amazon sqs или каквото и да е, е твой избор.

Може ли малко да обясниш, че не те разбрах?

uphero каза:
Какво ти пречи да ползваш крон от външен хост?!?

Не се бях замислял за това. Скрипта да върви на другия хост и да изпращам резултата?
 
vinsbg каза:
lam3r4370 каза:
Виж, това, което трябва да направиш е да вкараш job-а с кода и worker-a там през 2 мин да правиш заявки да видиш дали е ОК, когато е ОК, правиш си нещата в БД и махаш job-а. Rinse and repeat. Дали ще използваш gearman, beanstalkd, amazon sqs или каквото и да е, е твой избор.

Може ли малко да обясниш, че не те разбрах?

uphero каза:
Какво ти пречи да ползваш крон от външен хост?!?

Не се бях замислял за това. Скрипта да върви на другия хост и да изпращам резултата?
Както ти е кеф.
 

Горе