PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘PHP’ tag

Thumbnails erstellen mit PHP

with 2 comments

Da es im Zend Framework keine schöne Klasse für diese Aufgabe gibt (Zend_Image gab es mal als Proposal, wurde aber abgelehnt), muss man anderweitig eine Lösung finden.

Ich habe dazu eine uralte Funktion, die aber nach wie vor fabelhaft funktioniert. Man übergibt einfach nur den Pfad zur Quelldatei (häufig ist das eine hochgeladene Datei, es kann sowohl ein jpg als auch ein gif sein), ein Zielverzeichnis (häufig ein Ordner im webroot), sowie Informationen über die Zieldatei: Dateiname, Endung, maximale Höhe und Breite.

Ein Beispiel würde so aussehen:

Util::createThumbnailAndSave($_FILES['uploadfile']['tmp_name'], 'images/uploads', $_FILES['uploadfile']['name'], 'jpg', 250, 250)

Danach schreibt man die Informationen über die Datei natürlich noch in eine Datenbank, damit man sie auf der Webseite einbinden kann.

Und natürlich möchte ich euch meine kleine Funktion nicht vorenthalten. Es wird kein Imagick benötigt, sondern nur eine „normale“ PHP-Installation incl. aktivierten GD-Funktionen.

public static function createThumbnailAndSave($filePath, $targetDir, $targetFilename, $targetExtension, $targetWidth, $targetHeight)
{
	$imageinfo = getimagesize($filePath);

	// check if source image is smaller than target dimensions
	if ($imageinfo[0] > $targetWidth || $imageinfo[1] > $targetHeight)
	{
		if ($imageinfo[2] == 1) {       // GIF
			$srcImg = imagecreatefromgif($filePath);
		}
		elseif ($imageinfo[2] == 2) {   // JPG
			$srcImg = imagecreatefromjpeg($filePath);
		}
		$widthDivisor = $imageinfo[0] / $targetWidth;
		$heightDivisor = $imageinfo[1] / $targetHeight;
		if ($widthDivisor > $heightDivisor)
		{
			$dstImg = imagecreatetruecolor($targetWidth, $imageinfo[1] / $widthDivisor);
		}
		else
		{
			$dstImg = imagecreatetruecolor($imageinfo[0] / $heightDivisor, $targetHeight);
		}
              
		imagecopyresampled($dstImg, $srcImg, 0, 0, 0, 0, imagesx($dstImg), imagesy($dstImg), imagesx($srcImg), imagesy($srcImg));

		// Save to harddisc and delete from RAM
		imagejpeg($dstImg, $targetDir . "/" . $targetFilename . "." . $targetExtension, 95);
		$fsize = filesize($targetDir . "/" . $targetFilename . "." . $targetExtension);
		if ($fsize > 50000)
		{
			imagejpeg($dstImg, $targetDir . "/" . $targetFilename . "." . $targetExtension, 60);
		}
		imagedestroy($dstImg);
		imagedestroy($srcImg);
	}
	else {
		copy($filePath, $targetDir . "/" . $targetFilename . "." . $targetExtension);
	}
	chmod($targetDir . "/" . $targetFilename . "." . $targetExtension, 0777);
}

Eigentlich könnte ich sie mal auf Aktualität überprüfen, heutzutage würde ich sie wahrscheinlich auch etwas anders schreiben. Aber für meine paar kleinen privaten Homepages reicht es. Alternativen sind natürlich fertige Klassen von phpclasses.org etc,

Written by Michael Kliewe

Juni 28th, 2009 at 10:36 pm

Posted in PHP

Tagged with , , ,

Versionierungssysteme (auch SCM genannt)

without comments

Nahezu jedes OpenSource-Projekt hat ein svn-Repository. Aber was genau ist das eigentlich? Und gibt es Alternativen?

SVN (Subversion) ist das wohl bekannteste Version Control System(VCS). Häufig wird diese Art von Software auch Source Configuration Management system (SCM) genannt. Das Hauptziel ist es, eine gemeinsame Platform für Quelltexte bereitzustellen, um mit vielen Personen gleichzeitig daran zu arbeiten, und dabei viele Probleme wie Inkonsistenzen, Versionsprobleme und gleichzeitigen Zugriff zu beseitigen.

In den Anfängen der Programmierung mußte man die Arbeit an einem Softwareprojekt immer gut organisieren, d.h. es mußte geplant werden, welche Person an welcher Datei arbeitet, man brauchte einen gemeinsamen Ordner, damit jeder alles lesen kann usw.  Und wie sollte es sein, häufig öffneten zwei Personen die selbe Datei, machten Änderungen, und beim Speichern überschrieb der eine die Änderungen des anderen. Auch mit Hilfe von Locks auf die Dateien war dieses Problem nicht wirklich zufriedenstellend lösbar.

Also überlegten sich kluge Köpf, einen Server-Dienst anzubieten, wo man seine Dateien „hochladen“(commit) kann. Jeder kann sich nun eine Kopie von diesem Server herunterladen(checkout) und an den Dateien arbeiten. Das interessante ist nun, dass beim erneuten Hochladen die Datei auf dem Server nicht überschrieben wird, sondern zusammengeführt (merge) wird. Außerdem hat man durch dieses System die Möglichkeit, auf ältere Versionen der Dateien zuzugreifen, denn der Server speichert die Änderungen mit, und zu jeder Änderung gehört auch ein Kommentar. Ungefähr 1980 kamen die ersten Umsetzungen RCS und SCCS für einzelne Dateien ans Licht. Das erste nutzbare System für die Softwareentwicklung und große Projekte wurde 1989 geboren: CVS (Concurrent Versions System).

Merging machen natürlich nur Sinn bei Textdateien, Binärdateien wie zB. Bilder müssen weiterhin überschrieben werden.

Seit dem Jahr 2000 wird Subversion als Nachfolger von CVS entwickelt, um konzeptionelle Fehler auszubügeln und das wichtigste, nämlich das mergen, zu verbessern. Durch Tags und Branches kann man nun auch besser verschiedene Zweige oder Releasestände/Versionen definieren.

Alle bisher besprochenen VCS waren zentralisierte Lösungen, es gibt also einen zentralen Server, der diesen Dienst zur Verfügung stellt. Heutzutage setzen sich langsam immer mehr die verteilte SCM durch, wie zB git oder Mercurial.

Aber genug Text, hier ein paar Screenshots aus meinem eclipse, in dem ich einen SVN-Client-Plugin installiert habe und so einfach via Menu Dateien ins svn commiten oder mir aktuelle Versionen aus dem svn holen kann:

eclipse

Falls man eine IDE nutzt, die kein svn-Plugin unterstützt, kann man das ganze auch direkt im Windows-Explorer erledigen mit Tortoise-SVN.

tortoise

diff

Linux-Fans empfehle ich das Video von Linus Torvalds zum Thema git, und warum es seiner Meinung nach das beste SCM ist:

Mehr Informationen zu VCS, ihren Funktionen und Zielen findet man bei Wikipedia schön zusammengefasst:

http://de.wikipedia.org/wiki/Versionsverwaltung

Eine sehr schöne Übersicht aller Features der bekanntesten 6 VCS:

http://versioncontrolblog.com/comparison/CVS/Git/Mercurial/Subversion/Visual+SourceSafe/BitKeeper/index.html

Wir nutzen in der Firma aktuell Subversion, privat nutze ich es ebenfalls.

Written by Michael Kliewe

Juni 21st, 2009 at 9:13 pm

Posted in PHP

Tagged with , , , ,

UML Diagramm automatisch erstellen mit phuml

with 4 comments

Da im php hates me Blog heute morgen ein Artikel zum Thema UML im Web erschienen ist, möchte ich auch noch eine Software vorstellen, die ich mal genutzt habe, um von zwei bestehenden Projekten ein Klassendiagramm zu erstellen.

Wem UML garnichts sagt, möge sich den Artikel bei der Wikipedia durchlesen: http://en.wikipedia.org/wiki/Unified_Modeling_Language

Zuerst zeige ich euch mal die Ergebnisse. Draufklicken für eine größere Version. Leider kann ich es nicht in der vollen Größe mit allen Details zeigen, aber einen Eindruck sollte es euch geben:

UML Diagramm

Hier das zweite Beispiel:

UML Diagramm

Das PHP-Projekt, das diese Diagramme erstellt, heißt phuml. Es wird über die Konsole aufgerufen, mit einem Pfad als Parameter, und schon erstellt es aufgrund der rekursiven Suche nach Klassen eine solche Übersicht als png-Datei.

Sie enthält alle Klassen, ihre Methoden sowie die Vererbungshierarchie und Abhängigkeiten. Ihr solltet es einfach mal ausprobieren mit euren Projekten.

D:\xampp\htdocs\Projekt17\testunit>phuml.bat -r ../application/classes -graphviz -createAssociations false -neato projekt17.png

graphviz bzw. neato sind nötig, denn als Zwischenschritt wird eine dot-Datei erstellt, die daraufhin zu einem png konvertiert wird.

Die Installation ist denkbar einfach. Nachdem man phuml aus dem svn des Entwicklers (oh, ein neues Thema, das ich noch näher beleuchten werde in den nächsten Tagen) ausgecheckt hat, kann man erstmal die Hilfe aufrufen mittels

$ phuml -h

Alle Ausgangsformate (Prozessoren genannt) erhält man mit

$ phuml -l

Wundert euch übrigens nicht über riesige Ausmaße des Ergebnisses. Die oben gezeigten Diagramme sind im Original 10900*17740 bzw. 13928*11833 Pixel.

Für Klassendiagramme, die man vor der eigentlichen Programmierung erstellen möchte, gibt es auch jede Menge Tools. Eine Übersicht von über 100 UML-Tools findet sich hier. Ich persönlich habe bisher nur Erfahrungen mit Visual Paradigm. Das Ergebnis damals sah ungefähr so aus:

vp

Ich bin gespannt auf eure Ergebnisse und Erfahrungen!

Written by Michael Kliewe

Juni 17th, 2009 at 11:10 pm

Posted in PHP

Tagged with ,

PHP und die Konsole/STDIN

with one comment

Heute in der Firma durfte ich einen kleinen Ausflug auf die Konsole machen. Ziel war es, ein kleines Script zu schreiben, welches via „Standard-Eingabe“ ein serialisiertes Objekt erhält, und dann eine Email versendet mit Informationen aus diesem Objekt.

Da man das nicht allzu oft macht, hier ein paar Grundlagen:

Sowohl unter Linux als auch Windows kann man ein Programm (oder besser einen Prozess) auch direkt via Shell starten, so wie hier zB:

console1

Hier habe ich beispielhaft die ipconfig.exe unter Windows aufgerufen, die bei jedem Windows mit dabei ist.

Nun kann man einem Programm auch noch Parameter/Argumente mitgeben:

console2

Parameter übergibt man einfach durch ein Leerzeichen getrennt hier der eigentlichen Programmdatei.

Als fortgeschrittener Nutzer hat man vielleicht schonmal von „Pipes“ gehört. Unter Linux deutlich häufiger genutzt, aber auch in Windows möglich. Pipes sind einfach Datenströme, die von einem Programm an das nächste weitergegeben werden. Hier ein häufig genutztes Beispiel unter Linux:

console3

„ls -al“ erzeugt eine Liste der Ordner und Dateien des aktuellen Verzeichnisses. Die Ausgabe dieses Befehls leite ich weiter an das Programm „grep“, welches mit nur die Zeilen ausgibt, die ein „e“ enthalten.

Genau dieses „Empfangen von der Eingabe“ und das „Senden an die Ausgabe“ kann PHP auch. Standardmäßig wird alles, was man via echo, print und Konsorten ausgibt, in die Standard-Ausgabe (StdOut) geschrieben.

Hier ein einfaches Beispiel, wie ich den Inhalt einer Datei an ein PHP-Script schicken kann:

console4

Aber wie kann ich in PHP nun diese Zeichen lesen? Ganz einfach, indem man den Stream liest:

// read serialized object from stdIn
$stdIn = "";
if ($fp = fopen("php://stdin", "r")) {

while (!feof($fp)) {
$stdIn .= fgets($fp, 4096);
}
fclose($fp);

}

Danach habe ich die Zeichen, die dem Script via StdIn übergeben wurden, in der Variablen $stdIn verfügbar.

Der zweite Teil des Scriptes ist auch ähnlich simpel:

Wenn ich weiß, dass ich in $stdIn nun ein serialisiertes Objekt der Klasse „My_User“ habe, kann ich es einfach wieder deserialisieren:

// $stdIn is our My_User object!

$myUser = unserialize($stdIn);

Die Email verschickt man dann auf bewährtem Wege, entweder mit PHP-Bordmitteln

// load email template text file
$content = file_get_contents(TMPL_EMAIL);

// fill the placeholder(s)
$href = "http://www.domain.de/kontakt/kontakt2.php?custId=".$UID;

$subject = "AR: ".$subject." ---->>(AUTOREPLY)";
$sender = $myUser->getUsername();
$to = $myUser->getEmail();

$content = str_replace("<!-- [HREF] -->", $href, $content);
$content = str_replace("<!-- [SUBJECT] -->", $subject, $content);
$content = str_replace("<!-- [DATE] -->", $date, $content);
$content = str_replace("<!-- [ANREDE_DE] -->", $sender  ? 'Sehr geehrte(r) Herr/Frau ' . $sender  : 'Sehr geehrte Damen und Herren', $content);
$content = str_replace("<!-- [ANREDE_FR] -->", $sender  ? 'Chère Madame/ Cher Monsieur ' . $sender  : 'Mes Dames et Messieurs', $content);
$content = str_replace("<!-- [ANREDE_NL] -->", $sender  ? 'Geachte mevrouw/ mijnheer ' . $sender  : 'Geachte mevrouw/ mijnheer', $content);

# send the mail
$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$header .= "From: noreply@domain.de"."\r\n";

ini_set("SMTP", SMTP_HOST);

return mail($to, $subject, $content, $header, '-fnoreply@domain.de');

oder auch via PEAR_Mime oder Zend_Mail oder oder oder.

Weitere Informationen findet man zB hier:

http://www.php.net/manual/de/features.commandline.php

http://www.contentmanager.de/magazin/artikel_213_datenstroeme_in_php.html

http://talk.cmyweb.net/tag/phpstdin/

oder bei Dr. Google.

Written by Michael Kliewe

Juni 16th, 2009 at 10:31 pm

Posted in PHP

Tagged with

WordPress und meine Plugins

with one comment

Da dies mein erster Blog ist, experimentiere ich natürlich auch etwas mit WordPress. Aktuell habe ich die Plugins

  • WP-Cumulus
  • WP-Memory-Usage
  • WP-ServerInfo
  • SyntaxHighlighter Evolved

installiert. Gibt es sonst noch welche, die ich unbedingt kennen muss und nutzen sollte?

Was tut ihr gegen Spam in den Comments? Akismet wird ja bereits mitgeliefert, man muss es nur noch aktivieren. Welches Anti-Spam-Plugin bevorzugt ihr?

Ich habe ausserdem noch Probleme mit dem Einrücken des php Codes, irgendwie klappt das noch nicht so wie ich möchte. Hat jemand Erfahrung damit und einen Tip?

Und hier noch ein kurzer php-Code-Test:

<?
echo "bla";
class MyFirstClass {
public $name = null;
public function myTest() {
return "just a test";
}
}
?>

Test Ende.

Written by Michael Kliewe

Juni 15th, 2009 at 12:46 am

Posted in Allgemein

Tagged with , ,