Full pudel och varför jag ogillar PHP

PHP är ett väldigt trevligt språk när man ska utveckla någonting kort och enkelt för webben. Som att till exempel utveckla en applikation som Creeper.

Creeper har dock med tiden börjat få lite problem med prestandan, vilket jag löst på olika sätt, bland annat genom att använda XCache för att inte låta PHP kompilera om varje PHP-sida för varje ynka request. Vad jag också provat att optimera är denna kodsnutt (och nu blir det tekniskt):

      Array(
        min => 3256002816, # ip2long('194.18.169.0'),
        max => 3256003583, # ip2long('194.18.171.255'),
        name => 'Försvarets Radioanstalt FRA',
        short => 'forsvaret'
      )

Det jag optimerat är alltså att ta bort funktionen ip2long() för att se om detta ger någon prestandavinst. Det är dock oklart hittills om det lett till någon förändring. Annat än detta:

ip2long() returnerar det heltal som finns i min och max ovan. Problemet med PHP:s variabelhantering är att man aldrig vet vilken datatyp som används. Hade jag kunnat bestämma att max och min skulle vara unsigned 32-bitars integers hade detta fungerat. Nu blir det unsigned int om jag använder ip2long() men inte om jag skriver in heltalet i koden själv. Efter att ha letat runt en stund verkar det som om heltal+0 hade fungerat och gett mig en unsigned 32 bit integer, men nu vågar jag inte prova detta utan har konverterat tillbaka koden till att använda ip2long().

Konsekvensen av allt detta då? Jo, alla myndigheter vars IP-adresser fyllt ut alla 32 bitar har blivit minustal. Detta gör att alla jämförelser med tal som jag sedan konverterar med ip2long(), dvs tal jag får via klientens IP-adress, inte fungerar eftersom värdena helt förändrats. Så då har alltså dessa myndigheter sett ut att försvinna från Creeper. Vi får se om loggen fylls upp av lite mer korrekt information nu.

Jag trodde naturligtvis att min kod fungerade utmärkt efter denna optimering och konstaterade att en serialize() på min array med IP-adresser gav samma resultat (den innehöll samma tal åtminsone). Detta är dock ett projekt jag aldrig skrivit några automatiserade tester på. Hade jag gjort det hade jag hittat detta fel omgående.

Någon som har ett förslag på ett bättre programmeringsspråk att skriva enkla små webbapplikationer med? Perl har jag god erfarenhet av, men det blir snabbt knöligt att få in en massa Perl-applikationer i en Apache som driver ett 50-tal webbsajter.

23
Apr 2008
POSTED BY
POSTED IN Creeper
DISCUSSION 23 Comments
TAGS

23 Responses to : Full pudel och varför jag ogillar PHP

  1. Jonas B. says:

    Det där var en lurig bug! Om en sån sak hade hittats av dina tester så måste du vara en mycket nitisk testskrivare.

    Perl tycker jag verkligen är webvärldens doldis. PHP kändes som en nedbantad version med sämre prestanda. Själv har jag hängt kvar med Perl till “husbehov” utan anledning att byta. Webframeworksen har ju blivit mognare med åren, först Mason och nu Catalyst.

    Sen verkar Python och Ruby fått mogna webverktyg de med. Men med färska minnen av en Railsinstallation driftsatt har jag skräckhistorier att berätta. Med mod_perl är det mesta jämföresevis enkelt tycker jag.

  2. Rick Falkvinge says:

    Med risk för att svära i kyrkan vill jag faktiskt rekommendera C# till snabba webhack – oöverträffat, i mitt tycke, både i lättlästhet (jämförbart med Java) och prestanda (JIT-kompilering och cachning av kompilerade sidor). Med mono går det dessutom att köra utmärkt under LAMP.

  3. Albert says:

    Jag gjorde en liten skamtest för att jämföra olika språk och kom fram till att Perl och C är de två snabbaste språken (i min test). Både Perl och C kan dock lätt urarta till svårläst kod och det gäller att som programmerare ha disciplin för att hålla koden strukturerad. Vid en jämförelse mellan Python och Perl (plocka ur ord ur en ordlista med ett reguljärt uttryck) så var Perl ungefär 10 ggr snabbare än Python. Det märkligaste var att Perl t.o.m. var snäppet snabbare än C + libpcre.

  4. Stoffe says:

    Oroväckande att en människa som kan se så klart när det gäller fildelning är så förblindad av blankpolerad yta när det kommer till C#. Inte för att det är ett dåligt språk och just själva språket är väl åtminstone halvt befriat (dock via ECMA…) men hela .NET och CLI lider ju av precis samma problem som OOXML vad gäller “publicerat” kontra “i praktiken” och “patenterat”. Varför spela boll? Man blir svårligen frestad att parafrasera Mr Franklin med bekvämlighet istället för trygghet.

    Men on topic då: Bättre är ett väldigt svårt värde att mäta. Troligen är det sällan värt att mäta prestanda kontra lätt stt skriva, ändra och underhålla. Diverse mod_* lösningar ska, tillsammans med en initiering i början istället för att räkna ut varje gång, klara det allra mesta oavsett om man kör Perl, Python eller Ruby. Är du van med Perl är det säkert en bra lösning. Jag har varit sugen på att göra något litet med Camping för Ruby dock, med FastCGI eller mod_ruby, men kan tyvärr inte gå i god för det osett…

  5. Pingback: REVERSERAD ÖVERVAKNING BORTFILTRERAT! « OSÄKERHET OCH TYSTNANDET

  6. Jerker Montelius says:

    Jg rekomenderar Perl med webramverket Mason. Enkelt i sin uppbyggnad och “logisk” funktionallitet. Jag har använt det i flera projekt och det har alltid fugerat utmärkt.

  7. Pingback: Frihet, rättighet och skyldighet » Blog Archive » Myndigheterna döljer sina spår

  8. wertigon says:

    Jag håller med Stoffe; C# känns för riskfyllt för närvarande. Bättre i så fall att köra Java, som är industriledande i UNIX-världen.

  9. pawal says:

    Jag har goda erfarenheter av Perl för webben, både med ramverket Catalyst och med Mason. Jag har till och med lyckats få igång tre olika webbplatser baserade på Catalyst i en och samma Apache-instans. Fast jag är orolig för namnrymden som Perl tar upp i en sådan mod_perl-installation, jag litar helt enkelt inte på att saker och ting kolliderar, i synnerhet inte med moduler som är av tvivelaktig kvalitet. Och för fler en två sajter hostade på samma server skrivna av flera människor litar jag inte alls på det.

    Vad gäller Java och Mono har jag för liten erfarenhet av dessa språk för att veta hur man hostar flera såna sajter i samma Apache-instans, men det finns säkert någon som har en bra pekare åt mig.

  10. daniel says:

    Här kommer en liten sammanfattning:
    perl genererar svårförståerlig kod som man inte kommer förstå om 3 månader.
    python är ett nytt javascript där alla variabler inte är typade och man kan skriva över objekt hur som helst = mycket dåligt.
    php har förändrats ett antal gånger vilket har lett till flera olika olyckliga konsekvenser.
    .NET utvecklas av Microsoft och kan ändras hur som helst när som helst, kommer aldrig fungera till 100% i en annan miljö än windows.
    Java har blivit bättre med java 5 men är fortfarande ganska slött prestandamässigt.

    pawal: När man kör Java använder man oftast inte apache, då använder man istället tomcat eller jboss.

  11. rikard says:

    pawal:

    Man kan sätta upp det så att Tomcat kör Java bara för vissa URL:er och att apache tar allt statiskt material. mod_jk2 kan man t ex använda för det och mappa vissa url-mönster i apache att skicka vidare via jk till Tomcat (servlet container med stöd för JSP).

    Vi kör det där jag jobbar men jag vet inte om jag kan rekommendera det för “enkla små webbapplikationer” dock ;-)

  12. Python är ett nytt Javascript? Python (~1991) kom före Javascript (1996).

    Men visst saknar man (som C-programmerare) möjligheten att säga att ‘detta är ett 32-bitars heltal och skall inte vara ngt annat’.

  13. Daniel N says:

    Måste hålla med om Python. Har fördjupat mig en del i Django senaste tiden och är helt fascinerad. Kommer från mestadels ren C i de flesta miljöer, men att typa variabler är inte allt. ;)

    En sidofråga; kunde du se någon märkbar skillnad när du tog bort ip2long? Den funktionen låter som en ren wrapper till libc’s inet_addr som ju är rätt optimerad och borde inte ta nämnvärt många klockcykler.

  14. pawal says:

    Daniel, nej, jag har inte sett någon skillnad i prestanda alls faktiskt (inte synlig i några grafer åtminstone). Jag har tidigare varit med om att några av PHP:s funktioner har varit helt omotiverat slöa, så det var skönt att det inte var så i det här fallet. (Ja, så pass slöa att de har blivit snabbare av att skriva en helt egen variant i PHP.)

  15. Pingback: Kryptoblog » Blog Archive » Pawal pudlar, och jag också.

  16. Martin says:

    Som alternativ till PHP (som jag f.ö. också starkt ogillar) rekommenderar jag Ruby on Rails.

    Det har en mycket bra struktur, dels för att bygga sajterna (med hjälp av MVC) samt även testmetodik (det finns stöd för unit, functional & integration testing)

  17. pawal says:

    Ni som förespråkar Ruby (on Rails), har ni någon erfarenhet av prestandan också? Det jag har hört om prestandan är inte direkt skönmålande.

  18. Robert says:

    Ruby FTW!

    @pawal: Ruby on Rails eventuella prestandaproblem går mycket väl att lösa med rätt deployment. I dagsläget skulle jag rekommendera en deployment med Apache och mod_rails (“Passanger”), hostat på Amazons EC2. Kolla här: https://es.cohesiveft.com/site/rails2
    Då får du i princip den prestanda du betalar för.

  19. Björn Persson says:

    När det gäller att ha full koll på datatyper och namnrymder är ada oöverträffat så vitt jag vet. Ada konstruerades för att göra det möjligt att skriva program med mycket hög kvalitet, och typsystemet är en av språkets starkaste sidor. Det behöver aldrig råda något tvivel om vilken typ ett objekt har.

    Tyvärr är det nog ont om ramverk för vävgränssnitt för ada. Det finns ett antal CGI-bibliotek, men om belastningen är hög så vill du kanske inte använda CGI. FastCGI är ju en möjlighet, och det bör vara fullt möjligt att skriva Apachemoduler i ada, men i båda fallen skulle du nog bli något av en pionjär så det torde ta ett tag att komma igång. Det enda avancerade ramverket jag känner till är Ada Web Server. Det gör ditt program till en fristående HTTP-server som du kör i stället för Apache.

    Ada kompilerar man till maskinkod, så själva språket medför inga prestandaproblem. Däremot är det naturligtvis möjligt att skriva ineffektiva bibliotek.

    PS: Din bloggserver påstår felaktigt att min epostadress är ogiltig.

  20. Django är ett web-ramverk för Python. Det är inte MVC-baserat, men om man kan MVC lär man sig snabbt att bli produktiv med MTV. Jag är imponerad av hur snygg och ren koden blir….. ibland känns det, som i fallet med Rails, som att det är magi …. det bara funkar. Automagiskt.

  21. Andreas Ehn says:

    Flera har tagit upp typning i Python, men få verkar ha greppat hur det egentligen fungerar. Det finns (för att hålla det enkelt) två ortogonala egenskaper som programmeringsspråk kan ha med avseende på typning: starkt–svagt och statiskt–dynamiskt.

    Python är starkt och dynamiskt typat. C är svagt och statiskt typat. Java är starkt och statiskt typat. PHP och JavaScript är svagt och dynamiskt typade.

    Wikipedia har en bra artikel om typsystem: http://en.wikipedia.org/wiki/Type_system

  22. A B says:

    php har inte unsigned integers. Stora heltal konverteras till flyttal, se http://www.php.net/manual/en/language.types.integer.php
    Det i sin tur leder naturligtvis till funderingar över likhetsjämförelser.

    Jag tycker det är lite väl hårt att beskylla php för ett dokumenterat beteende vad gäller storleken på heltal och hur de behandlas. Informationen går att hitta på mindre än 1 minut på phps hemsida, och hanteras stora heltal i närheten av jämna bytegränser, som tex 4 byte för ett ip-nummer, är det väl rimligt att man kollar den typen av saker. Speciellt som just 32 bitar inte sällan brukar vara en gräns för ordinära heltal på 32-bitars-arkitkturer, och heltal också har en tendens att vara beskrivna med 2-komplement. Problemet är också tydligt beskrivet på manualsidan för ip2long().
    Jag kan inte se någon avgörande skillnad mot tex C eller Java därvidlag. Jag förväntar mig tex inte att heltal av typen char i C ska fungera för att hålla stora tal.

    Vad gäller olika p-språk och körtider finns här:
    http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all
    en rolig jämförelse. Denna gäller naturligtvis inte webapplikationer, men kan väl ändå tjäna som någon form av vägledandning.

    Själv tycker jag att java är trevligt.

    /A