Kurze Lösung für ein Problem, das mich gerade doch einige Zeit aufgehalten hat.

Die Standard-Einstellung für den Dateinamen, der für die Profiler-Dumps verwendet wird, ist unter XAMPP 1.7.4:

xdebug.profiler_output_name = "xdebug_profile.%R::%u"

Windows erlaubt aber keine Doppelpunkte im Dateinamen. Es gibt keine Fehlermeldung, gar nichts. Es tut sich einfach nichts.

Geändert auf z.B.

xdebug.profiler_output_name = "callgrind.%t-%s"

…und es funktioniert. Das Prefix “callgrind.” benutze ich, damit ich die Datei dann in KCacheGrind öffnen kann.

Weitere Informationen gibt es in der Xdebug-Doku.

Da muss man erstmal draufkommen.

Hi,

Twitter hat ja am 31. August die Basic Auth abgeschaltet. Es wird nur noch OAuth unterstützt.

Blöd, wenn man Twitter über den RSS-Feed gelesen hat, denn RSS-Reader wie Google Reader unterstützen kein OAuth.

Ich hab mir also ein kleines PHP-Script geschrieben, das mich per OAuth authentifiziert, meinen RSS-Feed von Twitter abholt und auspruckt. Dieses Script kann man dann einfach in den RSS-Reader einbinden.
Hierfür habe ich die schlanke TwitterOAuth-Lib von Abraham Williams benutzt.

Bevor man das Script benutzen kann, muss man erstmal eine App bei Twitter registrieren.
Das geht unter folgender Adresse: http://dev.twitter.com/apps/

1) Zunächst muss man eine neue App anlegen, indem man rechts auf “Register a new app” klickt.

2) Bei den Einstellungen sind 2 Punkte wichtig.

  • Application Type auf Client setzen
  • Default Access type auf Read-only setzen

3) Danach landet man wieder auf der Übersicht seiner Apps. Einfach die gerade neu erstellte App auswählen

Für das Script brauchen wir nun 4 Tokens/Keys:

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret

4) Auf der Detailansicht der App findet man den Consumer Key und das Consumer Secret.

5) Dann rechts auf “My Access token” klicken.

6) Hier findet man dann den Access Token und das Access Token Secret.

Diese 4 Werte trägt man nun einfach oben in der index.php ein und fertig.

Download: Twitter OAuth RSS Feed Fetcher

Yay \o/

http://schlueters.de/blog/archives/138-Features-in-PHP-trunk-Array-dereferencing.html

Vor kurzem hatte ich erst darüber geschrieben.

awesome!

<?php

function foo(){
	return array('a' => 'b', 'c' => 'd', 'e' => 'f');
}

echo ${!${!1}=foo()}['a'];

?>

Quelle: http://www.mail-archive.com/php-general@lists.php.net/msg224709.html

Ich wollte gerade prüfen ob ein Array assoziativ ist oder nicht. Hier ein paar Funktionen, die ich dazu gefunden habe.

function isAssoc($arr){
   return count( array_diff( array_keys($arr), array_keys( array_keys( $arr )) ));
}
function isAssoc($arr){
    return array_keys($arr) !== range(0, count($arr) - 1);
}
function isAssoc($arr){
    return array_values($arr) !== $arr;
}

PHP – Quick and Dirty

9. August 2008

Hi,

jetzt habe ich aber schon lange nichts mehr gepostet. Zeit wirds!
Bin gerade zufällig auf einen kleinen aber feinen PHP Hack gestoßen.

Kurz gefasst: Hier eine schnelle Methode um anonyme Objekte zu erzeugen.

< ?php

$obj = (object) array('foo' => 'bar', 'property' => 'value');

echo $obj->foo; // prints 'bar'
echo $obj->property; // prints 'value'

?>

Hi,

heute bin ich mal wieder auf einen interessanten und zugleich ärgerlichen Bug gestoßen. Versucht man Eigenschaften einer Klasse zu serialisieren, die in der Vater-Klasse als private deklariert sind, spielt PHP leider nicht mit.

Zumindest dann nicht, wenn man die Methode __sleep() implementiert. Lässt man diese weg, liefert PHP das erwartete Ergebnis zurück.

Der “Fehler” ist schon lange bekannt, aber leider immer noch nicht gefixt. Stattdessen verweisen die Entwickler auf das Interface Serializable und behaupten, dies sei kein Bug

http://bugs.php.net/bug.php?id=36172

Ich finde, das ist sehr wohl ein Bug…

Es gibt noch einen weiteren Workaround für dieses Problem, den man in den Kommentaren in der Dokumentation findet.

http://de2.php.net/manual/en/language.oop5.magic.php#81492

class A {
  private $foo;

  function __sleep(){
    return array("\0A\0foo");
  }
}

class B extends A {
}

// Liefert nun das richtige Ergebnis
unserialize(serialize(new B()));

Somit lassen sich auch private Eigenschaften der Vaterklasse serialisieren.

PHP: Array-Benchmark

19. Februar 2008

Hiho,

heute hab ich mich ein bisschen mit Arrays in PHP beschäftigt. Speziell ging es mir darum herauszufinden, welche Methode am schnellsten ist um einen neuen Wert ans Ende eines Arrays zu speichern.

Dabei habe ich 4 Möglichkeiten untersucht:

  1. Der []-Operator
    $a = array();
    $a[] = "foobar";
    
  2. Die Funktion array_push()
    $a = array();
    array_push($a,"foobar");
    
  3. Via Index und count()
    $a = array();
    $a[count($a)] = "foobar";
    
  4. Direkt via Index
    (setzt voraus, dass der nächste Index bekannt ist)

    $a = array();
    $a[0] = "foobar";
    

Ich habe in meinem Benchmark 10.000 mal einen 1000 Byte-Wert an das Array angehängt. Was dabei herausgekommen ist, zeigt dieses Diagramm.
(Achtung: logarithmische x-Achse!)

PHP Array Benchmark

Fazit:

  • Der Gewinner ist mit knappem Vorsprung Methode 1, der []-Operator.
  • Methode 4 liefert einen nahezu identischen Wert, da ja der selbe Operator benutzt wird.
  • Den 3. Platz hat sich array_push() gesichert. Das Geschwindigkeitsdefizit gegenüber Methode 1 lässt sich durch den zusätzlichen Overhead erklären, da hier bei jedem Durchlauf eine Funktion aufgerufen wird.
  • Und, nicht überraschend, weit abgelegen die Kombination aus count() und Index-Zugriff. Der Grund ist offensichtlich. Das wiederholte Aufrufen der count()-Methode, die das Array vermutlich jedes mal mit einem Aufwand von O(n) durchläuft um die Größe/Länge zu ermittlen, erzeugt eine deutliche Zeitverzögerung.
  • Eine kleine Vermutung meinerseits: Arrays sind in PHP als Liste implementiert, was das Mischen von assoziativen und numerischen Arrays erleichert, allerdings anscheinend auch das Zählen der Elemente verlangsamt. Ich würde mich aber wundern, wenn die interne Datenstruktur des PHP-Arrays keine Zähl-Variable enthielte, welche die aktuelle Größte speichert. Mein Ergebnis spricht nicht dafür. Weiß es jemand genau?

Das wars auch schon mit meinem kleinen Benchmark. Eventuell werde ich in Zukunft noch ein paar weitere durchführen. Hat jemand Vorschläge?