Peter Rehm's Blog

apple,development,life & more

PHP4 & PHP5 auf einem MacBook Pro

without Comments

So mal wieder bin ich mit dem ganzen Installationszirkus beschäftigt.
Nun will ich wieder beide PHP Versionen Parallel zueinander laufen lassen.

PHP4 muss man sich Compilen, oder man kann auf die mit OSX ausgelieferte
Version zurückgreifen. Dies werde ich in diesem Fall tun.

In der http.conf muss nur PHP4 aktiviert werden. Nachdem dies getan ist,
kopieren wir die Konfigurationsdatei.

CODE:
sudo cp /etc/httpd/httpd.conf /etc/httpd/httpd.php4.conf 


Nun installieren wir gleich PHP5. Die Packages dazu findet
Ihr bei

CODE:
http://www.entropy.ch/software/macosx/php/


In der Regel ist Apache 1.3 vorinstalliert.


Nachdem PHP5 installiert ist kopieren wir die Config erneut

CODE:
sudo cp /etc/httpd/httpd.conf /etc/httpd/httpd.php5.conf 


Nun kommt das Script das für den Wechsel zuständig ist:

CODE:
#!/bin/bash
if [[ "$1" == 5 || "$1" == 4 ]]; then 
VERSION=$1; 
else 
echo -n "Please choose between PHP4 and PHP5 (4/5)"; 
echo -e "";
fi 

if [ "$VERSION" == 4 ]; then 
sudo cp /etc/httpd/httpd.php4.conf /etc/httpd/httpd.conf;
echo "config updated to php4 - restarting Apache graceful.."; 
sudo apachectl graceful; 

elif [ "$VERSION" == 5 ]; then 
sudo cp /etc/httpd/httpd.php5.conf /etc/httpd/httpd.conf; 
echo "config updated to php5 - restarting Apache graceful.."; 
sudo apachectl graceful; 
fi


Das Skript habe ich hier auch schonmal geposted, aber in diesem Zuge nochmals...

Einfach das Skript speichern, und dann wie folgt ausführen:

CODE:
./changephp 4

Dann wird die PHP4 Config kopiert und der Apache neugestartet.
Das Gleiche geht auch in die andere Richtung.

Posted by Peter Rehm

11/06/2006 at 08:04:10 PM

Defined tags for this entry: , , ,

Stress Tests für Webentwickler

with 1 Comment

Immer wieder macht sich ein Webentwickler gedanken, wie seine Webanwendung sich wohl unter Last verhält. Dies kann man nachstellen:

Im folgenden möchte ich kurz die Tools auflisten die man dazu verwenden kann:



Vielleicht kann ich demnächst Erfahrungsberichte dazu abgeben wenn ich die Zeit gefunden habe die Tools mal zu testen.

Posted by Peter Rehm

09/19/2006 at 09:02:48 PM

Posted in Verschiedenes

Defined tags for this entry: , ,

[PHP] String als Zipfile

with 2 Comments

Wie oft habe ich bereits einen String in ein komprimiertes File schreiben wollen, das vollautomatisiert und zum Download für den User. Allerdings eignet sich dazu das gzip format nicht da die meisten Benutzer mit Windows arbeiten und man ein zusätzliches Tool installieren.

Daher benötigt man das PEAR Module Archive_Zip das hervorragend Zip Dateien erstellen kann. Allerdings benötige ich das Zip File nicht direkt, da ich das File nach dem Download nicht mehr benötige da es veraltet sein könnte. Daher habe ich mir eine Funktion gebaut, die auf Archive_Zip aufbaut, mit der ich das Problem erledigen kann.

Die Funktion stringtozip erstellt temporär das Archiv mit den gewünschten Dateinamen, und löscht danach alles wieder, um nur den String zurückzuliefern.

Aber sehet selbst!

CODE:
/**
* function to create an zip file from an string
* @param string $string content of the file
* @param string $filename name of the file includes the content
* @param string $zipdescription description in the zipfile
* @param string $tmpfolder path for the temporary files with an ending /
*/
function stringToZip($string,$filename,$zipdescription,$tmpfolder)
{
global $cfg;
$rand=rand();

if(!class_exists('Archive_Zip'))
{
// module archive_zip is not existing
return false;
}

if(!is_writable($tmpfolder))
{
// directory is not writeable
return false;
}

if(!file_exists($tmpfolder.$filename))
{
$int_filename=$tmpfolder.$filename;
} else {
$int_filename=$tmpfolder.$filename.'-'.$rand;
}

$fhandler=fopen($int_filename,'a');
fwrite($fhandler,$string);
fclose($fhandler);

$zipHandler=new Archive_Zip($tmpfolder.date("YmdHis").'-'.$zipdescription.'-'.$rand.'.zip');
$zipHandler->create($int_filename,array('remove_all_path'=>true));

// unlink the file containing the string
unlink($int_filename);

// store the data and delete the temp file
$data=file($tmpfolder.date("YmdHis").'-'.$zipdescription.'-'.$rand.'.zip');
unlink($tmpfolder.date("YmdHis").'-'.$zipdescription.'-'.$rand.'.zip');

return join("\n",$data);
}


Viel Spaß!

Posted by Peter Rehm

09/15/2006 at 04:17:50 PM

Posted in PHP, Programmierung

Defined tags for this entry: ,

Multi List Drag & Drop - Part 2!

with 1 Comment

Mich hat es mal wieder gepackt, und ich hab das Multi List Package upgedated.
Wofür ein Urlaub doch gut ist :-)

Ich will es kurz und schmerzlos machen, hier findet ihr den alten Beitrag, mit allen wichtigen Informationen.

Allerdings ist das Package flexibler geworden, nachdem ich gedacht habe man sollte die Listen einfach erwitern können. Zusätzlich habe ich die addLoadEvent unterstützung eingebaut.

Update: Es gibt mal wieder eine erweiterung. Ab jetzt kann man die Class komfortabel selber erweitern und muss sich um die Updates nicht mehr sorgen. Man erzeugt eine angepasste Klasse die die sajax Klasse erweitert. In dieser Klasse werden alle Einstellungen getätigt, und man kann die update_db Funktion überschreiben, mit welcher die Daten geschrieben werden.

download - demo and simple documentation

Viel Spaß!

Posted by Peter Rehm

09/01/2006 at 07:43:35 PM

Posted in Verschiedenes

Defined tags for this entry: , , ,

Mod Rewrite und die Sonderzeichen

without Comments

Wer viel mit Mod Rewrite arbeitet hat meist mit einem Problem zu tun.

Namen, die Sonderzeichen enthalten, können zu Fehlern führen. Eine kleine Funktion kann dabei helfen, da ich nicht auf die umfangreichere Version zurückgreifen wollte, auf die mich Sebastian aufmerksam gemacht hat, Translit.
CODE:
<?php
/**
*    Clean Name prepares an String to be used in the mod rewrite
*    @param string $string string to clean
*    @return string clean string
*    @access public
*/
function cleanName($string)
{
$search=array('é','á','ó','í','ñ','Ä','ä','Ö','ö','Ü','ü','ß',' ','-','/');
$replace=array('e','a','o','í','n','Ae','ae','Oe','oe','Ue','ue','ss','','','_');
return str_replace($search,$replace,$string);
}
echo cleanName('Diäsüsß ißt éiñ Tásót');
?>


Diese Funktion ha bisher in den meisten kleinen Anwendungen gereicht, allerdings kann es gut sein dass man diese noch um ein paar Sonderzeichen erweitern muss.

Über ein Feedback würde ich mich freuen.

Posted by Peter Rehm

08/16/2006 at 11:14:15 PM

Posted in Verschiedenes

Defined tags for this entry: , ,

Xdebug zum Performancetest in PHP

without Comments

Es ist während der Entwicklung immer interessant zu sehen wie performant der Code ist, bzw. wie viele Funktionen gestartet werden.

Dies kann man alles mit xdebug einsehen. Xdebug lässt sich über PEAR sehr einfach installieren.

Achtung! Diese Installation beziegt sich auf ein OSX Betriebssystem mit Apache 1.x und dem zufolge xdebug 1.
Eventuelle Ähnlichkeiten mit anderen Plattformen sind vollkommen unbeabsichtig.
CODE:
pear install xdebug


Danacht muss nun Xdebug nur noch in der PHP Config vermerkt werden. Ich empfehle davor noch ein Verzeichnis anzulegen, in dem man den ganzen Krempel dann ablegen lässt.

CODE:
mkdir /xdebug/
sudo chmod -R 777 /xdebug/

Nun machen wir uns an das Bearbeiten der php Config

CODE:
;;xdebug
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so"
xdebug.auto_trace=1
xdebug.auto_profile=1
xdebug.profiler_enable=1
xdebug.output_dir="/xdebug/"


So werden autmatisch alle Seitenaufrufe geparst. Ist aber nicht zu empfehlen, da wenn man das mal vergisst und eine Woche an einem Projekt arbeitet ein dickes temporäres Verzeichnis entstehen kann.

Posted by Peter Rehm

07/19/2006 at 04:08:09 PM

Posted in Verschiedenes

Defined tags for this entry: , ,

ADODB Table Prefix

without Comments

Bei fast jedem Projekt arbeitet man mit Tabellen Prefixen, um das Projekt z.b. 2x in der gleichen Datenbank laufen zu lassen. Gestern habe ich angefangen mein Projekt auf ADOBD und dabei festgestellt dass es noch keine eingebaute Funktion für das Verwalten eines Prefixes gibt. Daher hab ich das nun auf meine Anforderungen angepasst.

Mein Prefix liegt in $cfg['tbl_prefix'].

Die Querys werden nun so aufgebaut ("SELECT * FROM ##daten").

Statt Execute nimmt man nun die neue Funktion pExecute.

Diese Funktion muss in die adodb.inc.php implementiert werden, ich hab diese in der aktuellen ADODB Version in Zeile 784 direkt vor Execute plaziert.

CODE:
/**
*    Function to Replace the Prefixes
*    After replacing it the SQL Statement will be passed to EXECUTE()
*    @param sql SQL statement to execute, ## will be replaced with the Prefix
*/
function &pExecute($sql)
{
global $cfg;
return $this->Execute(str_replace('##',$cfg['tbl_prefix'],$sql));
}

Posted by Peter Rehm

06/28/2006 at 10:39:27 AM

Posted in PHP, Programmierung

Defined tags for this entry: ,

Multi List Drag & Drop - Sajax!

with 2 Comments

Als ich über die Seite von Tom Westcott gestolpert bin war mir klar, ich muss das in mein neues CMS einbinden. Ich hatte mir damals schon vorgestellt dass das für die Inhaltsstruktur oder für die Sidebar interessant sein könnte, aber ich war damals noch in der Planungsphase.

Als ich dann die Implementation in Serendipity die ich durch Garvin's SuperBlog entdeckt habe getestet habe, war mir klar, genau das will ich auch. Allerdings hat mir nur die AJAX Implementierung zugesagt, da ich ganz genau weiss da manche kunden bei so futuristischen Anwendungen sicher vergessen das abzuschicken. Daher muss das automatisch gemacht werden. Tom hat glücklicherweise auch gleich beide Methoden bereitgestellt.

Allerdings war der Code sehr verworren, und daher habe ich angefangen den Code neu aufzubauen, da ich vor allem im CMS das dann schon sauber einbauen wollte. Anstelle der umfangreicheren Implementation reicht nun folgendes:

CODE:
/**
* db settings
*/
$cfg['server']['host'] = "localhost"; // server
$cfg['server']['user'] = "root"; // dbuser
$cfg['server']['pass'] = ""; // password
$cfg['server']['db'] = "sajaxdemo"; // dbname

/**
*    start the connection
*/
$conn = mysql_connect ($cfg['server']['host'],
$cfg['server']['user'],
$cfg['server']['pass']);
$result = mysql_select_db ($cfg['server']['db'],$conn);

/**
*    include the sajax file
*/
include("sajax.php");


Danach muss noch der Pfad in der sajax Datei angepasst werden, dass das einbinden der styles und des JS auch funktioniert.

CODE:
var $sajax_path='thirdparty/sajax/';


Die Funktion update_db sollte dann auch an die Gegebenheiten angepasst werden. Die Funktion greift auf die global Datenbankverbindung zu.

Das Auslesen wird dann direkt in dem File gemacht in dem Sie die Liste anzeigen möchten.

Um dies zu vereinfachen habe ich eine Bespiel Datei mitgeliefert, in der Sie das alles sehen können. Dazu auch der passende SQL dump.

Beispielseite - Download
    Ich hoffe dieses Script findet irgendwo sinvollen Einsatz. Über Feedback würde ich mich freuen.

Posted by Peter Rehm

06/20/2006 at 12:33:22 AM

Posted in PHP, Programmierung

Defined tags for this entry: , ,

PHPThumb Fehler

with 1 Comment

phpthumb error

Zum Bilder verkleinern und skalieren wird sehr oft phpThumb verwedet was an sich auch toll ist, jedoch hat man oft das Problem, dass man eine Applikation lokal entwickelt und beim Hochladen gibt es dann einen Fehler.

Bei phpThumb kommt es relativ oft zu dem Fehler

Unknown image type identified by ?ph ( 0x3c 0x3f 0x70 0x68 ) in SourceImageToGD

Die ist sehr ärgerlich aber es gibt einen einfach Workaround

Man muss einfach folgende Zeilen in phpThumb/phpThumb.php entfernen:

CODE:
if (@$_SERVER['PATH_INFO']) {
$_SERVER['PHP_SELF'] = str_replace($_SERVER['PATH_INFO'], '', @$_SERVER['PHP_SELF']);</em></em>

<em><em>$args = explode(';', substr($_SERVER['PATH_INFO'], 1));
if (!empty($args)) {
$_GET['src'] = @$args[count($args) - 1];</em></em>

<em><em>}
if (eregi('^([0-9]*)x?([0-9]*)$', @$args[count($args) - 2], $matches)) {
$_GET['w'] = $matches[1];
$_GET['h'] = $matches[2];
}
for ($i = 0; $i < count($args) - 2; $i++) {
@list($key, $value) = explode('=', @$args[$i]);
if (substr($key, -2) == '[]') {
$_GET[substr($key, 0, -2)][] = $value;
} else {
$_GET[$key] = $value;
}
}
}


Danach sollte es gehen, mir ist vor allem das Problem bei meinem 1&1 Server aufgefallen, da es lokal meistens funktionierte.

Posted by Peter Rehm

04/27/2006 at 02:39:57 PM

Posted in PHP, Programmierung

Defined tags for this entry: ,

PHP4 & 5 im Shaker unter OSX

without Comments

Eigentlich bin ich immer noch hin und hergerissen auf welcher PHP Version ich die Anwendeungen entwickeln soll.

PHP5 bringt schon tolle Features mit sich. Daher habe ich mich dazu durchgerungen nun endlich mal PHP5 für mich als Testplattform zu installieren. Ich kann wegen Kundenprojekten aber nicht auf PHP4 verzichten, daher habe ich beide Pakete nebeneinader installiert.

Dann habe ich ein Config File für PHP4 erstellt in /etc/httpd/httpd.php4.conf und das gleiche für PHP5 /etc/httpd/httpd.php5.conf
Für die Installation habe ich die Entropy.ch Packages verwendet.

Um aber nicht immer von Hand wechseln zu müssen hab ich ein kleines Shellscript gebastelt. Sind nur ein paar Zeilen.

CODE:
#!/bin/bash
if [[ "$1   " == 5 || "$1" == 4 ]]; then
VERSION=$1;
else
echo -n "Please choose between PHP4 and PHP5 (4/5)";
echo -e "";
fi

if [ "$VERSION" == 4 ]; then
sudo cp /etc/httpd/httpd.php4.conf /etc/httpd/httpd.conf;
echo "config updated to php4 - restarting Apache graceful..";
sudo apachectl graceful;

elif [ "$VERSION" == 5 ]; then
sudo cp /etc/httpd/httpd.php5.conf /etc/httpd/httpd.conf;
echo "config updated to php5 - restarting Apache graceful..";
sudo apachectl graceful;
fi

Posted by Peter Rehm

02/11/2006 at 01:50:14 PM

Posted in PHP, Programmierung

Defined tags for this entry: , ,

FCKedit Pt. II

without Comments

Selbst das Update auf die 2.2 Version brachte keine Verbesserung.
Aber dafür eine entscheidende Erkenntnis:

Das wird alles verhunzt weil der HTML Code nicht komplett XHTML valid war.
Ist ja ein sinniger Grund.
Der Haken ist nur, dass quasi alles versaut wird was nicht 100% XHTML ist.
Und bei Bedienung durch Kunden kann alles mögliche passieren.

Und ich weiss wovon ich rede :-)

Ich bitte daher die OS-Gemeinde, behebt die Probleme.
Komisch ist auch, im IE gibt es das Problem, im FF quasi nicht.
Und wenn ich schon mecker, ICH WILL SAFARI SUPPORT!!

Posted by Peter Rehm

01/19/2006 at 02:19:46 AM

Posted in PHP, Programmierung

Defined tags for this entry: , , ,

Easteregg in PHP

without Comments

Sachen gibts...

Sogar die PHP Entwickler haben sich einen Spaß erlaubt und einen Easteregg in den Source eingebaut. Es ist so banal dass man damit immer noch viele Leute schokieren kann :-)

Gerade eben erhielt ich den Link

http://peter-rehm.de/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

und war schokiert was ich da sah. Ein Hundebild!!

Die Eastereggs funktionieren mit folgenden Strings:

CODE:
?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000


Posted by Peter Rehm

01/15/2006 at 06:29:20 PM

Defined tags for this entry: ,