PHP utml.
Desmit mīti par PHP
3
Jaybill McCarthy savā blogā uzskaitījis desmit mītus par PHP un katru no tiem atspēkojis. Ja ne atspēkojis, tad vismaz devis labu vielu pārdomām par to vai tiešām attiecīgā lieta ir patiess pieņēmums par PHP.
Runa iet par sekojošiem mītiem (atvainojos, ja tulkojums nebūs 100% precīzs):
1) PHP nav patiesi (pilnībā) objektorientēta valoda
2) PHP iedrošina (veicina) nekvalitatīvu kodu (par šo es jau vienreiz biju izteicies un šķiet, ka nedaudz pa daudz biju sacepies)
3) PHP neseko MVC
4) PHP ir lēns, jo tiek interpretēts
5) PHP nav labu debuggeru un IDEs
6) Visas PHP aplikācijas izskatās vienādi
7) PHP nav domāts “nopietniem” izstrādātājiem
8) PHP der tikai Web aplikācijām
9) PHP kods ir juceklīgs dēļ “include” un “require”
10) PHP kods ir pārpilns ar iekšrindas SQL teikumiem (iekšrindas domāts “in-line”)
Ieteicams izlasīt gan tiem, kas ar PHP strādā, gan tiem, kas strāda ar citām valodām.
Zend ietvars
4Domājot par to, kā paātrināt programmēšanu PHP, kā arī kodu padarīt pēc iespējas lasāmāku un vieglāk modificējamu biju sācis veidot pats savas klases dažādu uzdevumu veikšanai. Piemēram, mijiedarbībai ar datu bāzi viena klase, lietotāju autorizēšana un ar to saistītajām lietām cita klase utt. Tādā veidā varēju ieekonomēt laiku, ja vairākos Web projektos nepieciešama kāda daļa pamatfunkcionalitātes, kas atkārtojas. Turklāt, ja jāveic kādi labojumi vecajā kodā, man atliek tikai pamainīt attiecīgo klasi un nomainīt klases failu projektos, kuros tas ir iesaistīts. Bet tad es aizdomājos, ka klases kuras es varu uzrakstīt bieži vien ir stipri ierobežotas kādos apstākļos. Tāpēc vai nu tās būtu jāpapildina, kas prasa daudz laika un daudz testēšanas vai arī vajadzētu paskatīties uz kādu ietvaru pusi. Iepriekš biju pretinieks ietvariem, jo lai tos izmantotu, tie no sākuma ir jāapgūst, bet tas prasa laiku. Turklāt kāda cita taisītu ietvaru nevar tik labi pārzināt kā paša rakstītu ietvaru vai klašu kopumu. Bet tad aizdomājos, ka neesmu jau es eksperts programmēšanā un gan jau, ka tie ietvari kas ir uztaisīti ir tādas kvalitātes, kādu man nekad nesasniegt. Tāpēc esmu nolēmis, ka apgūšu vismaz vienu ietvaru. Un izvēle ir kritusi uz Zend ietvaru.
Paskatoties šo pamācību, secināju, ka pamācīties nāksies diezgan daudz. Bet viens ir skaidrs – ja kāda lapa tiks uztaisīta ar Zend ietvara palīdzību, tad kādam citam to kodu modificēt būs krietni ātrāk un vieglāk nekā ielauzties manā kodēšanas stilā (pieņemot, ka viņš būs zinošs par to kā Zend strādā). Turklāt, ja attiecīgā lieta būs apgūta labi, tad jaunu Web projektu taisīšana varētu notikt krietni ātrāk nekā tas man sanāk tagad. Tie ir pirmie iespaidi. Nezinu kā īsti būs. Bet skaidrs ir viens – nākamo projektu taisīšu ar Zend – vienīgi būs jāmeklē jaunu hostingu, jo tagadējais PHP5 nepiedāvā (pagaidām).
Varbūt kādam ir pieredze ar Zend ietvaru un var padalīties ar lielākajiem ieguvumiem, problēmām?
Par PHP strtotime() funkciju
3Kādu laiku iepriekš jau rakstīju par problēmām, kuras man bija radušās izmantojot PHP funkcijas date() un strtotime(). Nesen saskāros ar vēl vienu problēmu strtotime() izmantošanā. Pēc savas būtības šī funkcija ir neaizvietojama daudzās situācijās. Varbūt ir aizvietojama, bet tādā gadījumā es labprāt uzzinātu par alternatīvām ar līdzīgu funkcionalitāti. Ko tad šī funkcija dara? Viņa paņem datumu, kas pierakstīts teksta formātā un pārvērš to sekundēs. Savukārt sekundes mēs varam ar date() funkciju pārvērst par mums nepieciešamā formātā esošu datumu.
Parasti, ja funkcijai strtotime() padod datumu kādā formātā, kuru tā nespēj apstrādāt, atbildē būs sekundes, kuras neatbilst konkrētajam datuma. Nu lūk – problēma radās apstāklī, ka visi datumi, kurus Web lapā jāredz lietotājam un kurus viņš ievada nepieciešamajos laukos, ir reprezentēti formātā dd.mm.yyyy. Daudz nedomājot es šādu datumu ar strtotime() pārvērtu uz sekundēm un tālāk ar date() uz yyyy-mm-dd. Viss strādāja ideāli. Taču uzliekot skriptus uz cita servera, korektā strādāšana bija kaut kur pazudusi. Sāku meklēt kur ir kļūda. It kā strtotime() atbalsta gan PHP4, gan PHP5. Piebildīšu, ka uz gala servera stāv PHP4. Iemetot aci php.net uzreiz nekādas īpašās atšķirības nepamanīju. Iespējams ne tā skatījos. Tad uzrakstīju mazu skriptu, kurš ņēma dažādi formatētus datumus un pārtaisīja tos par sekundēm un tad atpakaļ par datumu. Skriptu palaidu gan uz PHP5, gan PHP4. Rezultāti sekojoši:
Ievads | PHP5 | PHP4
2007-09-26 | 2007-09-26 | 2007-09-26
26-09-2007 | 2007-09-26 | 2032-02-28
09-26-2007 | 1970-01-01 | 2016-07-30
2007.09.26 | 1970-01-01 | 1970-01-01
26.09.2007 | 2007-09-26 | 1970-01-01
09.26.2007 | 1970-01-01 | 1970-01-01
Kā redzams – PHP5 dd.mm.yyyy formātu labprāt konvertē tā kā vajag, bet PHP4 nē. Tāpēc mācieties no citu kļūdām un atcerieties, ka maģiskā funkcija strtotime() strādā dažādi uz dažādām PHP versijām.
Programmē PHP un sabojā programmēšanas stilu
6Nezinu kā īsti noformulēt virsrakstu. It kā aptuvena doma ir, bet kaut kas ne līdz galam pateikts. Runa iet par to, ka PHP ar tajā pieļaujamo visatļautību skriptu veidošanā ļoti sabojā programmēšanas stilu. Es sāku programmēt ar Pascal, bet tad C++. Lūk – C++ man patika ļoti. Jā – bija nedaudz jāmaina domāšanu, salīdzinot ar Pascal, bet toties ar katru nākamo uzrakstīto kodu sapratu, ka tas, kā tas tiek veidots, ir ļoti pareizs veids un veicina pareizu domāšanas veidu. Programmēšana C++ palīdzēja pareizāk izprast programmēšanas būtību. Tad es pārslēdzos uz PHP un nu jau vairāk kā divus gadus rakstu skriptus šajā valodā. Neesmu eksperts, bet šo to māku uztaisīt. Pa šiem gadiem C++ nebiju aizticis. Bet tagad pienāca brīdis, kad nācas vienu programmiņu uztaisīt C++. Teikšu kā ir – tās bija mocības.
PHP bija mani sabojājis. Piemēram, lietas, kuras no PHP dzīves ļoti sabojā: mainīgo definēšana kā vien ienāk prātā un kurā brīdī vien gribās; dažādu struktūru izmantošana datu uzglabāšanai, pirms tam šīs struktūras nedefinējot un citas. Labi, ka es pirms tam biju saskāries ar C++, jo lai gan pārslēgties no PHP bija grūti, tas nebija neiespējami. Taču, ja man ar C++ nebūtu vispār bijusi nekāda saskarsme un tad vajadzētu kaut ko viņā uzrakstīt, es visticamāk lamātos par to, ka C++ ir nejēdzīgs un pareizākais ir PHP piekoptais stils. Jā – var arī PHP programmēt, pirms tam definējot visus mainīgos utt., un tā ir tikai mana vaina ka es to nedaru. Lai gan savu vainu atzīstu, gribu arī vainot PHP pie tā, ka tas atļauj šādu izlaidību. Paņemot 3 programmētāju PHP skriptus, varam redzēt kardināli pretējus stilus kā skripti tiek organizēti (dati, funkciju/klašu definēšana utt.), bet paņemot 3 programmētaju C++ kodus visticamāk, ka tie būs ieturēti līdzīgā stilā.
Tāpēc topošie programmētāji – iesaku jums nesākt apgūt prasmi programmēt ar PHP, bet pašus pamatus un loģikas iesākumus apgūt ar Pascal, bet tad C++. Un tikai tad kad C++ principi ir saprasti varat mēģināt programmēt PHP. Bet ik pa laikam arī uzrakstiet kaut ko C++, ja negribat sabojāt domāšanu. Savukārt, ja sāksiet ar PHP, tad domāšanu pamatīgi sabojāsiet. Nē, tas nenozīmē, ka jūs ar PHP neko uzrakstīt nevarēsiet, bet tas, ka pārslēgties uz jebkuru citu, daudz maz striktākiem noteikumiem apveltītu valodu, būs ļoti grūti ir skaidrs.
Un ko jūs pārējie, kas programmē dažādās valodās domājat par to, kurai valodai ir pareizākie koda rakstīšanas nosacījumi un kurai gluži pretēji?
Web lapu kešošana ar PHP
0Pārskatot vecos PHP skriptus atradu vienu, kas varētu noderēt tiem, kuri vēlas paātrināt savu Web lapu ielādi. Ideja pavisam vienkārša – izmantojam kešošanu. Tātad – verot vaļā Web lapu tiek pārbaudīts vai attiecīgā lapa ir iekešota. Ja nav iekešota, tad Web lapas saturs tiek ierakstīts failā (tiek iekešots). Ja lapa ir iekešota un lapas vecums nav lielāks par noteikto, tad vairs netiek lapas saturs ģenerēts ar ierasto PHP skriptu, bet paņemts no iepriekš saglabātā faila.
Iespējams, ka šādas funkcionalitātes skriptu var uzrakstīt arī optimālāk, bet šis variants ir pārbaudīts un šķiet, ka tam pat ir jāstrādā. Ja kāds pamana kļūdas – ziņojiet.
Ja gadījumā nolemjat skriptu izmantot īpaši pievērsiet uzmanību $cache_path mainīgajam. Dotajā gadījumā skripts bija paredzēts, lai kešotu pašu pirmo lapu tāpēc ceļš varēja būt arī šāds. Bet ja gribat kešot kaut ko dziļākās direktorijās (piemēram, yyyyyy.com/aaa/bb.php), tad direktoriju būtu jāizmanto citu, jo pretējā gadījumā arī /aaa/ būs nepieciešamība pēc direktorijas /cache/.
// Web lapu kešošana
$cache_expire = 600; // Sekundes pēc kurām kešs jāatjauno
$cache_path = 'cache/'; // Ceļš uz direktoriju kur tiks glabātas iekešotās lapas
if (is_callable('file_put_contents', false) == false)
{ // PHP4 gadījumā izveidojam funkciju file_put_contents
function file_put_contents($file, $str)
{
$f = fopen($file, 'w');
fwrite($f, $str);
fclose($f);
}
}
// ŠEIT liekam skriptus kuriem ir jāizpildās pirms lapa tiek atgriezta
// piemēram lietotāju logošana utt.
$key = md5($_SERVER['QUERY_STRING']);
if (is_file($cache_path.$key) && filemtime($cache_path.$key) > time() - $cache_expire)
{ // Ja pieprasītā lapa ir iekešota un tās vecums nav pārāk liels
// nolasam un atgriežam apmeklētājam lapas saturu. Pēc tam skripts beidz savu darbību
echo file_get_contents($cache_path.$key);
die();
}
// Savukārt ja nebija derīgas lapas kešā..
ob_start();
// Šeit jābūt tai skripta daļai, kura uzģenerē lapu. Tās saturs netiks uzreiz izvadīts
// apmeklētājam, bet ievietots buferī.
$tmp = ob_get_contents(); // Paņemam bufera saturu
file_put_contents($cache_path.$key, $tmp); // Ierakstam failā
ob_end_flush(); // Parādam saturu apmeklētājam
?>
Aizmirsu vēl piebilst, ka šāda kešošana der tikai gadījumos, kad lapas saturs nav dinamiski jāveido katram lietotājam unikāls.
Iznācis PHP 5.2.4
0
Jau vakar Betanews bija pieejams PHP 5.2.4, bet tā arī nebija parādījusies oficiāla informācija php.net par šo versiju. Taču šodien uzmetot aci redzu, ka, lai gan ar mazu nokavēšanos, arī php.net ir informācija par jaunāko PHP versiju 5.2.4. Šī versija ir koncentrēta uz kļūdu labošanu un stabilitātes uzlabošanu. Pilns izmaiņu saraksts atrodams šeit. Kā redzams – labojumu ir visai daudz (virs 120) un būtu vēlams atjaunot savu PHP versiju.
Failu augšupielāde ar PHP
4
Ik pa laikam forumos uzpeld jautājumi par to, kā ar PHP uztaisīt failu augšupielādi (upload). Ja jautājuma uzdevējs netiek nolamāts par to, ka nemāk pats sameklēt atbildi, visbiežāk viņš saņem saiti uz php.net attiecīgo sadaļu. Taču ar to ir par maz, lai varētu uztaisīt drošu failu augšupielādi. Lai attiecīgo lietu uzprogrammētu kvalitatīvi (nevis perfekti, bet kvalitatīvi) vajadzētu saprast kuros soļos kādi draudi pastāv. Līdz šim labākais apraksts kuru esmu atradis par attiecīgo tēmu (vismaz man tā šķiet) ir Scanit, kas ir IT drošības kompānija, sacerētais. Tas ir uz 20lpp garš un tajā ir piemēri tipiskiem failu augšupielādes skriptiem, kā arī pastāstīts kas šajos skriptos nav pareizi. Mūtu jāizlasa ikvienam PHP koderim, kurš šaubās par savām zināšanām šajā jautājumā.
Apraksta oriģināls, kā arī aprakstā izmantotie skripti pieejami šeit. Bet atļāvos aprakstu saglabāt un augšupielādēt tepat.
GMetrix vizuāls skaitītājs
7Izdomāju ka tā, kā GMetrix vēl nepiedāva vizuālos skaitītājus, tad izviedošu tādu pats. Tā arī izdarīju. Tagad lapas kreisajā malā (tur kur citi skaitītāji un logo) ir arī GMetrix skaitītājs. Tam ir divas iedaļas. Pirmā ir Rank, kura norāda uz vietu topā, bet otrā Hosts, kura norāda uz apmeklētājiem tekošājā nedēļā. Dati tiek ņemti reālajā laikā. Kešingus netaisīju, jo mans blogs nav no tiem apmeklētākajiem, tāpēc nekādu slodzi šim skriptam radīt nevajadzētu.
Man jau šķiet, ka interesantākais ir Rank parametrs. Tā varētu būt tāda kā sacensība starp blogeriem. Kuram augstāks Ranks pēc attiecīgās statistikas sistēmas datiem. Bet varbūt tā ir tikai tāda muļķīga iedoma. Katrā ziņā līdz neienāks protesti no GMetrix cilvēkiem tikmēr šito skaitītāju izmantošu. Vienīgi, ja viņiem ienāks prātā doma ļoti bieži mainīt lapas HTML kodu, tad gan skriptu, kurš ģenerē skaitītāju neatjaunošu.
Vizuāli viņš izskatās šādi: 
Labots: Tagad skaitītājs tiek kešots. Lai nebūtu lieka slodze GMetrix serverim – skaitītājs tiek atjaunots reizi pusstundā.