Напоследък се занимавам основно с код вместо с администриране затова драмите пред които се изправям с кодене са много повече от сървърните такива, затова реших да драсна няколко реда за глупостите които успявам да сътворя. Усилено се готвим да презентираме проекта си което форсира донякъде откриването на драматичните части
- Първото нещо което което със сигурност щеше да създаде проблеми е изключването на javascript от браузърната поддръжка. Както всяка модерна апликация така и нашия инструмент използва доста JS за AJAX и други динамични процеси които предават интерактивност и съвременно подобряват визията и функционалността. Помислихме за доста решения като най приемливото беше с бисквитка с информация и после php да проверява дали информацията е валидна и дали всичко е наред. Доста грамотно решение но накрая се появи още по приличен вариант. HTML който да се изпълнява ако попадне в noscript. Според мен е и най елегантното решение.
<noscript> <meta http-equiv="refresh" content="0;URL=./nojs.html" /> </noscript>
Общо взето ситуацията е тривиална ако спрем JS поддръжката ще бъдем пренасочени към nojs.html. Простичко и доста ефективно решение
- Php multhithreading – много нишковоста е нещо което доста полезно при процесори с повече ядро (не че на едноядрени не е ОК но при много ядрени системи нещата са друга бира). Нашия софтуер има част която се занимава с събирането на информация от други API – та и я импортва в наша база данни. Общовзето никакво предизвикателство освен че това го реализирахме пак на php с multhithreading в cli режим защото тоя процес е досатъчно голям и е необходимо да е атоматизиран за да се налга някой да го прави на ръка. Тука имаше една драма свързана с фокрването на процесите и поточно не самото създаване на child process-a а че скрипта изчакваше да приключабота за да създаде нов. Глупаво това убиваше идеята за multiprocessing каквото е действителност поведението а не на multhithreading но това са подробности. Най напред сложихме & след процеса което ще рече да продължава работат си скрипта но пак нямаше промяна в поведението изискваше се и стандартни изход от скрипта да бъде пренасочен – в моя случай най добре към /dev/null 🙂 Накрая структурата на тази част от кода изглеждаше така
$pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); }else if ($pid) { // we are the parent echo "I'm parent \n"; pcntl_wait($status); //Protect against Zombie children } else { // we are the child echo "I'm a child $timer \n"; exec("$command > /dev/null &"); exit (0); }
Примерчето отново е тривиално. От към производителност бях силно впечетлен със прекъсвани между вдигането на процесите и прочие направих около 50 child process-a които своя странба направиха 7800+ mysql inserts за около 30-40 сек. А машината е крайно хилава понеже ни е тестов върър преди да вдигнем приложението на реалния.
- Mysql querys – бях шокиран от една велика глупост. Имаше един код който правеше 4-5 излишни заявки към базата данни, вместо да се използва едно по тлъсто sql query и после основната работа да я отнесе php-то. Драмата беше такава, най- напред се правеше една заявка която взимаше информация после изхода от заявката се използваше да се направят други заявки като тя служеше за аргументи. Доста грозна и тлъста ситуация. Subquery а е непозната територия явно както и left join или просто не са били обмисляни нещата добре. Хванах пренаписах заявката всичко се получи доста добре и като цяло натоварването падна с около 200% за същата част от кода.
В общи линии това са нещата на последък с които се заниамваме и немога да кажа че е скучно но понякога се изумявам от разни необмисляни парчета код които трябва да поправям а най стеращното е че често са мои 😆
И аз имам тегления на данни, сложени в crontab-a. Пробвах преди със & в края, но ставаше пиково натоварване, грозна история. Сега съм ги оставил, като свърши единия процес, да пуска другия, но това е ужасТ :> Като зацикли някъде и всичко отива по дяволите… това го решавам като килвам старите процеси, като дойде време да се пуска новия, но това е още по-голям ужасТ, защото губя данни. Та ще се се опитам да имплементирам, твоето решене по този въпрос. Благодарско! 🙂
Ами по моя метод хубавото е че информацията може да се обработва от няколко процеса едновременно но това също ти гарантира по голямо натоварване 😉 Баланса между натоварване и скорост винаги е много тънък. Всичко опира до тестове.