WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Flamebait: Perl oder PHP ? (http://www.wcm.at/forum/showthread.php?t=57529)

_m3 24.05.2002 22:17

Flamebait: Perl oder PHP ?
 
Nachdem von mir immer mehr PHP gefordert wird, bin ich heute wieder über was gestolpert, was mich an PHP mehr als zweifeln ließ.

Ein Script, dass die Files eines Verzeichnisses ausliest und ausgibt, schaut in Perl z.B. so aus:
Code:

#!/usr/bin/perl
use strict;
print "Content-type: text/html\n\n\n";

my $dir = '../htdocs/ate/data';
opendir(DIR, $dir) || die "can't opendir $dir: $!";
my @files = grep { /\.txt/ } readdir(DIR);
closedir DIR;

foreach (@files) {
    print "$_
\n";
}

In PHP hab ich das so gemacht:
Code:

<?php
$datadir = "data";
$handle = opendir($datadir);
if($handle == "") {
        exit("Konte Verzeichnis $datadir nicht lesen!\n");
}
 
$files = array();
while (false !== ($file = readdir ($handle))) {
//        if ( strlen($file) > 4 && strpos($file, ".txt", strlen($file)-4 ) ) { // Ohne RegEx
if( preg_match( "/\.txt/", $file) ) {        // Mit RegEx
        array_push ($files, "$datadir/$file");
}
closedir($handle);

foreach ($files as $file) {
        echo "$file
\n";
}

?>

Ich mein, viel umständlicher als in PHP gehts nicht mehr. Abgesehn davon, dass nirgends dokumentiert ist, wie man einen ungültigen Handle abfragt.
Wo sind die PHP-Gurus? Geht das nicht eleganter?
Ich bin von PHP (wieder einmal) schwer enttäuscht.

sagi 25.05.2002 00:34

Tja es ist natürlich eine Frage der Anforderungen. Ich finde, dass es praktisch unmöglich ist, Perl in eine grafisch aufwendige Site einzubauen, da der gesamte Quelltext vom Script ausgegeben werden muss und dadurch mit keinem WYSIWYG Editor mehr bearbeitet werden kann.

PHP rulez

mfg

c.

_m3 25.05.2002 09:15

Perl kann mehr als PHP - allein schon deswegen, weil es vor dem Web entstand. Kommandozeile, GUI (mit TK), Web, einbetten in Applikationen, ........
Wenn schon Vergleiche auf Webebene, dann z.B. Mason vs. PHP. Und dagegen schaut PHP IMNSHO ganz schön alt aus :D

Philipp 25.05.2002 12:01

Zitat:

Perl kann mehr als PHP - allein schon deswegen, weil es vor dem Web entstand.
Genau das ist der Unterschied. Perl wurde nie speziell für Webapplikationen entwickelt, PHP dagegen schon :). Es bietet auch eine Reihe von Features an die bei Perl nur relativ umständlich möglich sind.

Ausserdem sind die meisten Perl Scripts wesentlich Ressourcenhungriger (CPU Auslastung von 100% ist bei Hochlast keine Seltenheit) als das PHP Gegenstück. Das liegt aber größtenteils daran das Perl auf den meisten Servern als CGI läuft bzw. auch viele Scripts nicht unter mod_perl funktionsfähig sind.

Während Perl mittels mod_perl in die Geschwindichkeitsregion von PHP kommt, kann man PHP mit PHP Accelerator weiter beschleunigen.

Bestes Beispiel: http://www.majorgeeks.com/article.php?sid=99

Dieser Mirror von 3D Mark 2001 SE hatte in den ersten beiden Tagen ca. 250000 Downloads, wobei der MajorGeeks Webserver (Cobalt RaQ3 AMD K6/2-300MHz mit 512MB Ram) knapp eine 1 Million Pageviews hatte.

Glaubst du das man mittels einer dynamisch generierten Perl Seite wirklich mehr aus dem Webserver hätte herausholen können? Ich glaube es nicht.

Ich habe mir dein PHP Script kurz angesehen und da sind mir zwei Sachen sofort aufgefallen:

PHP-Code:

$handle opendir($datadir);
if(
$handle == "") {
    exit(
"Konte Verzeichnis $datadir nicht lesen!\n");


Bei $handle = opendir($datadir); wird trotzdem eine Fehlermeldung von PHP ausgegeben. Diese kann mittels @opendir($datadir); unterdrückt werden.

if($handle == "") kann auch kürzer geschrieben werden: if (!$handle) bewerkt das gleiche.

Am schnellsten ist aber nach wie vor:
PHP-Code:

$handle opendir($datadir) or die("Konnte Verzeichnis $datadir nicht lesen!"); 

In dieser Zeile:
PHP-Code:

while (false !== ($file readdir ($handle))) { 

ist das false !== ( ... ) unnötig.

Who-T 25.05.2002 13:01

<?
$directory = "datadir";

$dir = @opendir($directory) or die ("not found");

while ($file = readdir ($dir))
{
if (substr ($file, strlen($file)-4, 4) == ".txt")
echo $file."
\n";

}
closedir ($dir);

?>

so würd ich das auf die schnelle lösen, wobei ich beim substr vielleicht doch noch mal überlegen würd, was am schnellsten geht, das müsst ich mir noch anschauen.
aber prinzipiell ist dass dann auch nicht komplizierter als das perl script

gibts eigentlich einen besondern grund, warum du zuerst in ein array schreibst, und dann das array erst ausgibts?
wieso nicht gleich ausgeben?


wennst wirklich alle files (nicht nur alle textfiles) auslesen willst, schreibst einfach statt dem substr-topfen
if (is_file($file))
hin


zu der frage was besser ist
ich kann von mir sagen, dass ich php code weitaus einfacher lesen kann als perl-code
grund dafür ist, dass php weitaus mehr ähnlichkeit zu c und java hat, in denen ich schon vorher programmiert hab, als perl

sprich ein c-programmierer wird sich glaub ich mit php weitaus einfacher tun als mit perl.

_m3 25.05.2002 17:12

Zitat:

Original geschrieben von Philipp
Es bietet auch eine Reihe von Features an die bei Perl nur relativ umständlich möglich sind.
Welche? Mir sind schon Sachen untergekommen, die Perl hatte, aber PHP nicht, aber ned umgekehrt.

Zitat:


Während Perl mittels mod_perl in die Geschwindichkeitsregion von PHP kommt, kann man PHP mit PHP Accelerator weiter beschleunigen.

Das würde ich nicht so stehen lassen, aber das könnte man ja mal in einem WCM-Artikel genauer betrachten :)

Zitat:


Ich habe mir dein PHP Script kurz angesehen und da sind mir zwei Sachen sofort aufgefallen:
...
Bei $handle = opendir($datadir); wird trotzdem eine Fehlermeldung von PHP ausgegeben. Diese kann mittels @opendir($datadir); unterdrückt werden.

Das ist mir schon klar, nur wenn ich den Fehler überhaupt nicht abfange, verhält sich das Script überhaupt total verrückt unsc schiebt die Fehlermeldung zig mal.
Ach ja - danke für's ansehen.

Zitat:


if($handle == "") kann auch kürzer geschrieben werden: if (!$handle) bewerkt das gleiche.

Am schnellsten ist aber nach wie vor:
PHP-Code:

$handle opendir($datadir) or die("Konnte Verzeichnis $datadir nicht lesen!"); 


Und warum steht das nicht in der Doku? Keine einizoge Zeile zur Fehlerbehandlung bnei der Beschreibung der Funktion :(

Danke für's Feedback, wieder was gelernt :)

_m3 25.05.2002 17:20

Zitat:

Original geschrieben von Who-T
PHP-Code:

if (substr ($filestrlen($file)-44) == ".txt"

so würd ich das auf die schnelle lösen, wobei ich beim substr vielleicht doch noch mal überlegen würd, was am schnellsten geht, das müsst ich mir noch anschauen.

Da hast Du aber das Problem, dass Du bei den Fileeinträgen "." und ".." eine Fehlermeldung bekommst :) Hatte ich zuerst auch ;)
Zitat:

gibts eigentlich einen besondern grund, warum du zuerst in ein array schreibst, und dann das array erst ausgibts?
wieso nicht gleich ausgeben?

War ein Teil eines größeren Scripts, wo ich mit dem Array nacher noch was gemacht habe.

Zitat:


zu der frage was besser ist
ich kann von mir sagen, dass ich php code weitaus einfacher lesen kann als perl-code
grund dafür ist, dass php weitaus mehr ähnlichkeit zu c und java hat, in denen ich schon vorher programmiert hab, als perl
sprich ein c-programmierer wird sich glaub ich mit php weitaus einfacher tun als mit perl.

Veto! Ich kann Perl auch wie C-Code schreiben, die Sprachen sind sich ähnlich (http://quong.best.vwh.net/perlin20/#LtohTOCentry-8). Also das mit dem Lesen ist IMHO kein Argument, das ist reine Gewohnheitssache. Aber mit fehlen einfach ein paar Konstrukte/Funktionalitäten, die PHP gegenüber Perl nicht hat.

Z.B.:
Es gibt in PHP eine Funktion, um ein File in ein Array zu lesen - Fein.
Es gibt auch einen Funktion, um eine Zeile in einen String zu lesen. Da muss ich aber wissen, wie lang der String wird - des is doch a Schass, oder?

Who-T 25.05.2002 17:35

stimmt
bei . und .. gibts probleme, auf die hab ich vergessen

die behandelt ich normal mit
if ($file == "." || $file ="..")

weil die meistens andere funktionen bekommen und daher gesonderte ausgabe benötigen.



das mit dem lesen ist gewohnheitssache, nur trau ich mir zu sagen, dass wenn ich von c komm, auf anhieb ein php-script eher versteh als ein perl-script
zumindest wars bei mir so.

was heißt eigentlich das "my" in perl?



falls du mit der zeile einlesen "fgets" meinst, stimmt das nur zum teil
denn ich kann bei fgets ($filehandler, 100000); mitgeben und das liest mir dann die ersten 100 kB aus (ja, ich weiß, sind nicht genau 100kB);

wenn vorher ein linebreak oder eof kommt, passts auch, weil dann wird nur bis zum ende der zeile/des files gelesen.

das problem war in meinen scripts bis jetzt immmer nur sehr bedingt vorhanden, weil ich selten über diese längen hinausgekommen bin.

aber ich weiß was du meinst, das problem selbst ist da, wie oft es relevant wird, hängt halt wieder von der art des scripts ab.

_m3 25.05.2002 17:54

Wie gesagt, dass mit dem Lesen ist IMHO Ansichtssache;)

Das mit dem eine Zeile einlesen kommt bei mir öfter - und ich hatte schon LANGE Zeilen :D

Mit "My " deklariest Du eine Variable. Wenn Du "use strict" am Anfang eines Scripts angibst, musst Du eine Variable deklarieren, bevor Du sie verwendest. Sehr praktisch, da dadurch bereits zur Kompilierzeit viele Fehler gefunden werden.
Weiters beschrängt ein my die Gültigkeit der Variablen auf den aktuellen Block (File bzw. {}).

Philipp 25.05.2002 21:41

Zitat:

Welche? Mir sind schon Sachen untergekommen, die Perl hatte, aber PHP nicht, aber ned umgekehrt.
z.B. die ganzen Buffering Features die auch die Möglichkeit bieten Seiten mittels gzip zu komprimieren. Selbst die einfachsten Dinge wie MD5 Verschlüsslung sind bei Perl wesentlich komplizierter.

Zitat:

Das würde ich nicht so stehen lassen, aber das könnte man ja mal in einem WCM-Artikel genauer betrachten
Dann probiere es doch selber:
http://forums.ikonboard.com (mod_perl)
http://www.invisionboard.com/forums/ (PHP ohne PHP Accelerator)

Was ist schneller?


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag