Portál AbcLinuxu, 30. dubna 2025 21:26
Byly vydány verze 5.5.29, 5.6.13 a 7.0.0 RC 2 skriptovacího jazyka PHP. Ve všech verzích jsou řešeny také bezpečnostní chyby. Ve verzích 5.5.29 a 5.6.13 bylo opraveno 11 bezpečnostních chyb. Ve verzi 7.0.0 RC 2 jich bylo opraveno 7. Dle plánu by finální verze PHP 7.0.0 měla vyjít 12. listopadu 2015.
Tiskni
Sdílej:
Takže řetězec v Ruby teda není sekvence znaků? Jak se to projevuje?Imho naráží například na problémy s indexováním, kde indexování v ne-unicode přináší problémy s variable-lenght encoding u UTF-8, kde třeba znak
`á`
zabírá dva bajty a `a`
jen jeden. Pokud budu mít takovýto řetězec, tak přistoupením na konkrétní index získám v někdy neplatný odpad a jindy celý znak, což je krapet nepředvídatelné.
[1] pry(main)> str = 'příliš 黄色 лошадь' => "příliš 黄色 лошадь" [2] pry(main)> str.encoding => #<Encoding:UTF-8> [3] pry(main)> str.size => 16 [4] pry(main)> str.bytesize => 29 [5] pry(main)> str[10] => "л"
U datového typu řetězec mě nezajímá, jak je vnitřně uložen – to je interní věcí programovacího jazyka. Z hlediska programátora je řetězec sekvencí znaků, ideálně Unicode.jsme se dostali akorát k tomu, že řetězec nesmí být vnitřně uložen jako "bajtový chrchel". Příklad jazyka s nějakou zázračnou strukturou pro reprezentaci skutečných řetězců™ jste neuvedl a kde jsou v Ruby ty problémy s přistupováním k řetězcům jako sekvenci znaků také ne. Takže je asi zbytečné dále ztrácet čas.
str = 'příliš 黄色 лошадь' puts str.encoding # UTF-8 file = File.open("rusian.txt", "r:KOI8-U") strrus = "" file.each {|line| strrus << line } puts strrus.encoding # KOI8-U cons = str + strrus # sample.rb:30:in `<main>': incompatible character encodings: UTF-8 and KOI8-U (Encoding::CompatibilityError)Což by dávalo Pankrácovi za pravdu. ruby -v ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
# -*- coding: utf-8 -*- import codecs s1 = 'příliš 黄色 лошадь' f = codecs.open('rusian.txt', encoding='KOI8-U') s2 = f.read() print (s1, type(s1)) print (s2, type(s2)) print (s1 + s2) # příliš 黄色 лошадьлошадь
V čem ty ostatní jazyky nejsou adekvátní náhrada?Většinou nemůžeš to existující statické stránky prostě vložit <?jazyk kousek_kódu ?>, který se prostě vykoná a vypíše.
To radšej prasácky jazyk a server a budem sa vyhýbať tomu čo sa označuje ako zlé praktiky.Hm. Označovat kým? Co může být víc zlé, než PHP?
Bolo by dobre rozlišovať programovacie a šablónovacie jazyky. Je v tom totiž dosť podstatný rozdiel.
PHP je webový framework napísaný v C. Jeho šablónovací jazyk (šablóny majú príponu .php) sú turing complete. Nie je to nič výnimočné čo by sa v iných šablónovacích jazykoch neobjavovalo. Nie je to síce žiadúce, ale je to tam.
Rozdiel je v tom, že programovacie jazyky nepotrebujú žiadne otváracie a uzatváracie značky označujúce "tu je kód" a zvyšok vyhoď na stdout.
Teoreticky môžem mať framework napísaný v pythone ktorý by som spustil podobne ako php-fpm (ak nepoznáš vygoogli si, predstavy o fungovaní webserveru niekedy okolo roku 2000 sú už prekonané a dnes sa považuje za rozumné použiť blbý webserver na obsluhu statického obsahu a zvyšok forwardovať na php-fpm, uwsgi ..., v minulosti sa pred apache dával varnish, lebo apache je žalostne pomalý), interpretoval by každý súbor s príponou .somskaredyjaknoc niektorým z týchto templatovacích systémov a mal by som prakticky to isté čo PHP. Spúšťalo by sa to tak isto, fungovalo by to tak isto ... ale načo keď sa to dá riešiť lepšie?
% grep -R "item.name" . ./static/js/richeditor/editor.js: link.name = item.name; ./static/vendor/ckeditor/samples/plugins/toolbar/toolbar.html: names.push( buttonsNames[ item.name ] );
Templatovací jazyk je jazyk ebedovaný v dokumente. Ja v shakalovi používam templatovací engine jinja2.
Premenné pomenované z RND generátoru bez jedinej poznámky zrejme sa dá prasiť všade.
Neviem koľko krát som to povedal povedz presne kde ti chýba dokumentácia, ja ju doplním. Neviem kde si pozeral, ale hádam všetko okrem HTML parsera ktorý chcem vyhodiť hneď keď nájdem náhradu je ok. A to keď si porovnám s PHP-čkovou verziou tak vyzerá ešte celkom ok:
static $pos=0; static $opened_tag=array(); static $depth=0; static $r=array(); static $empty=array(); while ($pos<$num) { $char=$html[$pos]; if ($char=='<'&&$pos<$num-1) { $pos++; $char=$html[$pos]; $tag=""; while ($char!='>'&&$pos<$num-1) { $tag=$tag.$char; $pos++; $char=$html[$pos]; } if (strlen($tag)==0) array_push($error,array($pos,"empty",strlen($out))); else { if ($tag[0]=="/") { $name=substr($tag,1); $depth--; $open_tag=array_pop($opened_tag); // Oprava span if ($name=="span") { if (is_array($open_tag)) { $span_tags=array_reverse($open_tag); $name=implode("></",$span_tags); $open_tag=$name; } else array_push($error,array($pos,"close",strlen($out),$name)); } // Oprava span if ($name==$open_tag) { $out=$out."</".$name.">"; } else array_push($error,array($pos,"close",strlen($out),$name)); if (isset($r[$depth])) { if (count($r[$depth])!=0) { array_push($error,array($pos,"req",array_pop($r[$depth]))); } } if ($empty[$depth]) array_push($error,array($pos,"empty",$name)); } elseif ($tag[strlen($tag)-1]=="/") { $name=substr($tag,0,strpos($tag,' ')); $out=$out."<".$name." />"; } else { $empty[$depth]=true; $name=substr($tag,0,strpos($tag,' ')?strpos($tag,' '):strlen($tag)); $opened_tag[$depth]=$name; if ($depth==0) { if (!in_array($name,$tags["root"]["tags"]["o"])) { array_push($error,array($pos,"unknown",$name)); $name=""; unset($opened_tag[$depth]); } else { if (isset($tags[$name]["tags"]["r"])) $r[$depth]=$tags[$name]["tags"]["r"]; else $r[$depth]=array(); } } else { if (isset($opened_tag[$depth-1])&&isset($tags[$opened_tag[$depth-1]])) { if (!in_array($name,$tags[$opened_tag[$depth-1]]["tags"]["o"])&&!in_array($name,$tags[$opened_tag[$depth-1]]["tags"]["r"])) { array_push($error,array($pos,"unknown",$name)); $name=""; unset($opened_tag[$depth]); } else { if (isset($r[$depth-1])) { foreach ($r[$depth-1] as $id=>$t) { if ($name==$t) unset($r[$depth-1][$id]); } } $r[$depth]=$tags[$name]["tags"]["r"]; } } else { unset($opened_tag[$depth]); array_push($error,array($pos,"unknown",$name)); $name=""; } } //array_push($error,array($pos,"not_closed",array_pop($opened_tag))); // Oprava span if ($name=="span") { $style=substr($tag,strpos($tag,'=')+2,strrpos($tag,'"')-strpos($tag,'=')-2); $stylea=explode(';',$style); foreach ($stylea as $style) { $position=0; //ostranime zbytočné medzery $stylecp=""; while ($position<strlen($style)) { if ($style[$position]!=' ') $stylecp=$stylecp.$style[$position]; $position++; } $at=explode(":",$stylecp); if (count($at)==2) $tag_array[$at[0]]=$at[1]; } $out_tag=array(); if (isset($tag_array["font-weight"])) { if ($tag_array["font-weight"]=="bold") $out_tag[0]="b"; } if (isset($tag_array["font-style"])) { if ($tag_array["font-style"]=="italic") $out_tag[1]="i"; } if (isset($tag_array["text-decoration"])) { if ($tag_array["text-decoration"]=="underline") $out_tag[2]="u"; } $tag=implode("><",$out_tag); $opened_tag[$depth]=$out_tag; } // Oprava span $depth++; if (strlen($tag)>0) { $out=$out."<".$tag.">"; } Parser::parse($html,$error,$out,$num); } } } elseif ($char!=">") { if ($char==' '||$char=="\t"||$char=="\n"||$char=="\r") { if ($char=="\r") { $cont=false; if (isset($html[$pos-1])) { if ($html[$pos-1]=='>') $cont=true; } if (isset($html[$pos+1])) { if ($html[$pos+1]=='<') $cont=true; } if (isset($html[$pos+2])) { if ($html[$pos+2]=='<') $cont=true; } if (!$cont) { if ($depth==0) $char="<br />"; elseif($tags[$opened_tag[$depth-1]]["e"]=="n"&&$opened_tag[$depth-1]!="pre") $char="<br />"; } } } else { if (isset($empty[$depth-1])) { if ($empty[$depth-1]) { for ($j=0; $j<$depth; $j++) $empty[$j]=false; } if (isset($opened_tag[$depth-1])&&isset($tags[$opened_tag[$depth-1]])) { if ($tags[$opened_tag[$depth-1]]["e"]=="y") { array_push($error,array($pos,"ue",$opened_tag[$depth-1])); } } } } $out=$out.$char; } $pos++; } if ($pos==$num) { if (count($opened_tag)>0) { array_push($error,array($pos,"not_closed",array_pop($opened_tag))); } }
prostě pošle výstup a o ten se postará web server
Záleží na tom aký webserver. Autor komentára žije v predstave že správne je keď je webserver tlstý a keď si vypýtam súbor index.php
tak ho webserver vezme, nájde tam reťazce <?php a ?> a ich obsah nahradí tým, čo vráti php-čkovy eval. Ešte raz zdôrazňujem, že toto robí priamo web server, nie PHP, nie niekto iný, ale webserver pri štarte loadne shared object (knižnicu) a stará sa o tieto veci sám. PHP teda beží v procese apacha, ak má pretečenie stacku alebo niečo podobné má rovnaké práva ako apache, ak sa zasekne tak proste zasekne proces apacha, lebo nie je nijako oddelený. Z historických vecí spomeniem ešte htaccess a mod_rewrite, ktoré sa využívali na to, aby sa s PHP dali dosiahnuť pekné URL adresy (teda mod_rewrite zvyčajne prepísal adresy typu /kravina/1/ na index.php?dajmi=kravina&id=1).
Túto predstavu narušil až príchod web serverov, ktoré vedia dobre jednu vec - obsluhovať HTTP(S). Taký nginx je proste blbý proces ktorý na rozdiel od apacha ani len nespúšťa vlákna pri požiadavke. Celé spracovanie funguje v jednom event-loope. Otvorené spojenie na rozdiel od apacha nepotrebuje žiaden vlastný stack, ukladá len minimálnu informáciu o stave (doslova pár B). Preto pre nginx nie je problém nechávať http spojenie aktívne aj niekoľko hodín a kľudne môže mať niekoľko tisíc (až kým nedôjdu porty) aktívnhych spojení súšasne a spotrebou pamäte to prakticky ani nepohne. Väčšina požiadaviek na web server sú jednoduché požiadavky na statický súbor (zvyčajne 1 request na webovú stránku a mnoho requestov na css, javascripty, obrázky ...) a to vedia blbé web servery na rozdiel od apacha s minimálnou réžiou. Potom už stačí len nastaviť nech zvyšné požiadavky preposiela serveru, ktorý obsluhuje dynamické veci. Na webhostingoch je to často apache (u nás najväčší hosting websupport to má takto riešené, jednoducho pred apachom je nginx, ktorý sa stará o statické súbory a dynamické veci rieši apache ktorý je tam kvôli kompatibilite s htaccess). Ak nie je potrebný htacces je možné apache vynechať a posielať požiadavky rovno na php-fpm, uwsgi, unicorn, gunicorn ... To, že je to budúcnosť už pochopili aj zadubenci z PHP a od verzie 5.3 je php-fpm štandardnou súčasťou PHP. Keby ešte neboli banda idiotov a riešili si bezpečnostné diery ...
Ešte aby som trochu dovysvetlil: PHP je ekvivalent ERB v ruby on rails. PHP je webový framework napísaný v C. Ruby on rails je webový framework napísaný v ruby. PHP je možné programovať v C (a pár krát som bol nútený si prepísať niektoré funkcie ktorým leakovala pamäť sám v C). Ruby on rails zase v ruby. Niektorí ľudia sú schopní písať aplikácie v šablónovacom jazyku PHP. Väčšinou si tá skupinka ľudí uzatvára kód do divných značiek lebo inak by im web server vrátil celý kód v nedotknutom stave.
# apt-get install php5-fpm php5 # lighttpd-enable-mod fastcgi # lighttpd-enable-mod fastcgi-php # /etc/init.d/lighttpd force-reload # mv index.html index.php # vim index.php > <?php echo "ahoj"; ?>Podle mě je tohle ten důvod, proč si snad všichni jako první zkusí helloworld v PHP, no a pak už u něj zůstanou (můžu se mýlit).
# apt-get install ruby-sinatra # mkdir views # mv index.html views/index.erb # vim myapp.rb > require 'sinatra' > get('/') { erb :index } # vim views/index.erb > <%= 'hello world!'%> # ruby myapp.rbJá proti PHP vcelku nic nemám, prasit se dá ve všem. Jen si myslím, že vstupní bariéra mohla být argument možná tak před 10 lety.
Kde sa stratila windows 9?
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.