Mission impossible
Ovih dana sam dobio “mission impossible”, znači ceo server na kojem se nalazi oko 50 živih SMS servisa, sa nekoliko hiljada incoming SMS-ova dnevno, treba prebaciti na novi server, incoming i outgoing SMS-ovi koriste novi SMS gateway, input i output postaje XML, … sve to a da korisnici ne primete ništa.
Napomena: ovde ne otkrivam toplu vodu, oni koji su iskusniji neka prekinu sa čitanjem ovde da ne bih dobijao komentare tipa “pa dobro, to sve znamo”. Ovo je namenjeno onima koji tek počinju ili su tek nedavno počeli, ili možda tek planiraju da počnu. Mada i ostalima ne može da škodi
![]()
“Aj’ sad, dosta mašte, daj da pričamo ozbiljno” - bio je moj odgovor na takav zahtev. Prvo, novi SMS gateway koristi potpuno drugačiju sintaksu. Ranije smo zahteve primali standardim POST HTTP zahtevom, sada je XML i zahtev i odgovor. Parametri su promenili ime, pa se sada umesto provider koristi operator, umesto tariff - cost, umesto Call-number koristi se receiver… Sve to treba promeniti u svakom scriptu za svaki servis. Šta više, i sistem tarifiranja nije isti, ranije se se koristile tarife 1,2,3, … 30 koje predstavljaju deseti deo CHF, sada su cifre 20, 30, 40,… 300 koji predstavljaju stote delove CHF, takozvane Rapene (isto što je “para” za “dinar”). Provajder je postao operator, i umesto šifara koje se su koristile ranije: 22801, 22802, 22803, koristie se imena “swisscom”, “orange”, “sunrise”. Da ne pričamo o bazi podataka. I sve to za jedan dan? Kao što rekoh - “dream on”.
Dobra stvar je što sam za sve definisao konstante, konfig fajlove, … svi SMS-ovi idu kroz jednu klasu, vraćaju se kroz istu klasu… pa je bilo dovoljno da promenim na jednom mestu neke paramatre pa da proradi u (većini) scriptova kao da se ništa nije promenilo. Kako? Pa evo na primer, kada se proverava koji je provider, postojala je lista
$valid_providers = array ('22801', '22802', '22803');
pa kada treba da proverim de li je provider validan, samo ga potrazimo u tom nizu
if (in_array($provider, $valid_providers))
// ok
else
// greska
Šta sam promenio? Sada je niz valid_providers postao
$valid_providers = array ('swisscom', 'orange', 'sunrise');
A sve ostalo ostaje isto.
Slično je i za tarife, analogno $valid_providers imam array $valid_tariffs.
Dalje, problem je što se čak i short id promenio. Short id je broj na koji korisnici šalju SMS-ove. Kada dobijaju nazad SMS pošiljaoc treba da bude 9229, a sada je nešto drugo. Sva sreća pa sam definisao globalnu konstantu
define ('SHORT_ID', '9229');
i izmenom toga, rešavam problem za sve servise jer sam svuda umest pošiljaoca stavljao $sender = SHORT_ID; umesto $sender = '9229'. Sada će neko pomisliti da je to moglo automatski search-replace - moglo je, međutim, tu se pojavljuje velika mogućnost greške.
Što se tiče SMS-ova, postoji jedna klasa koja barata sa svime. Recimo, postoji funkcija function read_sms() i funkcija function send() pa je (skoro) svo čitanje i pisanje bilo preko klase SMS:
$SMS->read_sms ($input);
...
$SMS->send ($text);
Veliki je problem što su do sada svi ulazni i izlazni parametri bili standardni HTTP requests: POST ili GET, a sada je HTTP_RAW_POST_DATA i u XML formatu. Da nisam koristio ovu klasu i funkcije, verovatno bi ulaz bio nešto ovako:
$sender = isset($_POST['sender']) ? $_POST['sender'] : "";
$provider = isset($_POST['provider']) ? $_POST['provider'] : "";
...
i tako u svakom scriptu.
Da sam tako radio, morao bih da menjam svaki script i menjam ulazne parametre. Funkcija read_sms($input) čita sve parametre i smešta u $SMS->input pa onda ulazne parametre citam iz tog niza. Promenio sam funkciju read_sms() i sada se u njoj, umesto parsovanja HTTP POST parametara parsuje XML i opet smesta u isti array $SMS->input;
Zašto je to dobro? Zato što svaki script koji je koristio $SMS->input['sender'], $SMS->input['provider'] ... i dalje koristi to isto, znači ostaje nepromenjen. Promenilo se samo ono što se dešava “ispod haube” dok ne dođe do tog scripta.
Slično tome, i funkcija za slanje SMS-a je samo promenila output iz HTTP POST u XML, ali to ni jedan script ne zna - i ne mora da zna, svaki i dalje šalje SMS funkcijom $SMS->send($text);.
Mission impossible? Pa moda i nije ako ste mislili na ove stvari kada ste počeli da pišete script-ove. Jedini je problem što sam i ja deo koda nasledio, a taj ko je pisao to pre mene - nije mislio da će jednog dana sve da se promeni.
u 07:24
svaka cast! fasciniran sam iako nista ne razumem, meni treba(real time) 100x vise vremena da ovaj komentar napisem nego da ga izgovorim!
Daklem internet i sve na njemu sto se dogadja, bice tek stvarno interesantan, i upotrebljiv kada bude dostigo nivo klasiicne verbalne komunikacije. mozda kroz deset godina?
u 02:24
srecno
u 10:12
Poslednji pasus u ovom tekstu je sve rekao.
u 01:39
Dodatak:
Extra dodatak klijenta: scriptovi moraju u “prelaznom periodu” da prihvataju i stari i novi sistem slanja, znači i stare i nove parametre. Eh, sad… mora samo da se umre
Posao je zavren za 2 dana, bilo je par sitnih grekica, ne znam da li su korisnici “primetili” ali znam da se nije niko alio - so far so good