10
07
2009
Amazon plant zum 15.08.2009 eine meiner Meinung nach recht komplizierte Änderung an der XML-Schnittstwelle zum Abfragen von Amazon-Daten.
Die Product Advertising API (ehemals Amazon Web Service) benötigt ab dem 15.08.2009 eine Authentifizierung sonst bekommt man keine Daten mehr ausgeliefert. Die Authentifizierungsmethode ist recht schwer zu verstehen finde ich, deshalb poste ich hier mal meine Lösung. Ist nicht gerade die eleganteste Lösung aber es müsste funktionieren. Aber ich übernehme keinen Gewähr
Die Abfrage ($api_url) ist eine Beispielabfrage und muss durch Eure eigene ersetzt werden. Aussderm müssen der “Access Key” und der “Secret Access Key” von Euch eingetragen werden.
Ganz wichtig ist dass die URL “urlencoded” sein muss. Und zwar aus dem UTF8-Zeichensatz heraus. Soll heissen erst den String (z.B. das übergebene Suchwort) nach UTF8 umwandeln und dann “urlencoden”.
Zum Beispiel:
$query_keyword = “Hängematte”;
$query_keyword = urlencode(utf8_encode($query_keyword));
Query:
http://webservices.amazon.de/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=xxx&Operation=ItemSearch&Keywords=”.$query_keyword.”&ResponseGroup=Medium&SearchIndex=Electronics&ItemPage=1
Solltet Ihr nicht aus Deutschland kommen dann muss noch die Local-Zone angepasst werden. Also in der URL und beim “$host” einfach .de durch Eure Local-Zone ersetzen.
Die Ergebnis-URL muss noch urlencoded werden und kann dann direkt z.B. mit simple_load_file geparst werden.
Also viel Spass damit und wenn es Fragen oder Anregungen gibt, immer her damit! Die Doku zur Amazon Product Advertising API ist übrigens auch recht schwer zu verstehen finde ich.
$api_url = "http://webservices.amazon.de/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=ACCESS_KEY&Sort=-price&Operation=ItemSearch&Keywords=KEYWORD&ResponseGroup=Medium&SearchIndex=SEARCH_INDEX&ItemPage=1";
#############################################################################################
## Amazon Product Advertising API Authentifizierung #########################################
#############################################################################################
function amazon_url_signer($raw_amazon_url){
$file_03_01 = $raw_amazon_url."&Version=".date("Y-m-d");
$file_03_02 = $file_03_01."&Timestamp=".str_replace(":", "%3A", str_replace("+00:00", "", gmdate("c")."Z"))."";
$file_03_03 = str_replace(",", "%2C", $file_03_02);
$file_03_04 = str_replace(";", "%3B", $file_03_03);
$file_03_05 = parse_url($file_03_04);
$file_03_06 = explode("&", $file_03_05["query"]);
asort($file_03_06);
for($i=0; $i < count($file_03_06); $i++){
$file_03_06 = implode("&", $file_03_06);
}
$uri = "/onca/xml";
$host = "webservices.amazon.de";
$method = "GET";
$file_03_07 = $method."\n".$host."\n".$uri."\n".$file_03_06;
$file_03_08 = base64_encode(hash_hmac('sha256',$file_03_07,'SECRET_KEY',true));
$file_03_09 = str_replace("%7E", "~", rawurlencode($file_03_08));
$file_03_xx = $file_03_04."&Signature=".$file_03_09;
return $file_03_xx;
}
#############################################################################################
$file_for_xml = amazon_url_signer($api_url);
Kommentare : 2 Kommentare »
Kategorien : Allgemein, PHP
10
11
2008
Wenn man ganze Seiten die mit PHP erzeugt wurden cachen will kann man die PEAR-Bibliothek verwenden. Dort gibt es eine Klasse “CACHE” mit der sich einfach die komplette Ausgabe einer Webseite cachen lässt.
Benötigt wird:
PEAR-Cache (LINK)
Da die neue Version von PEAR-Cache wohl anders funktiniert als die von mir beschriebene, könnt Ihr hier die von mir behandelte Version runterladen. Damit sollte es hinhauen.
Einfach die Dateien in ein Verzeichnis “Cache” entpacken. Ausserdem ein weiteres Verzeichnis “cache” anlegen, in dem die Cache-Dateien gespeichert werden.
Will man eine komplette Seite zwischenspeichern, kann die Klasse wie folgt nutzen:
Am Anfang der PHP-Datei einfach folgenden Code setzen:
<?
require_once ('Cache/Output.php');
$opts = array('cache_dir' => '/absoluter/pfad/zu/ordner/cache');
$cache = new Cache_Output('file', $opts);
$cache->fileLocking=true;
$id = $cache->generateID($_SERVER['REQUEST_URI']);
if(!$content = $cache->start($id)){
?>
HIER KANN DER KOMPLETTE SEITENINHALT FOLGEN
<?
$cache->endPrint(20000);
} else {
echo $content;
exit();
}
echo $content;
?>
Das ganze funktioniert wie folgt:
Per require_once wird die nötige Klasse eingebunden. Unter ‘cache_dir’ wird das zu nutzende Cache-Verzeichnis angegeben. Dann wird eine neue Klasse instanziert (new …). Per ‘fileLocking’ wird die Cache-Datei schreibgeschützt, damit sie nicht mehrmals geöffnet werden kann.
Interessant wird es bei ‘generateID’. Anhand dieser frei generierbaren ID wird geprüft ob eine Cache-Version der Datei vorliegt oder ob die Seite neu geladen wird. In der Regel kann man hier den Dateinamen bzw. die Datei-URL benutzen. Vielleicht auch noch in Verbindung mit gesetzten Variablen oder Cookie-Infos.
Am Ende wird dann die gecachte Version ausgegeben. Mir ‘endPrint’ kann man der Klasse mitteilen nach wievielen Sekunden die Cache-Version der Datei verfallen soll und auf jeden Fall einen neue Dateiversion geladen werden soll.
Weitere Infos zum Thema:
http://openbook.galileocomputing.de/php_pear/03_0_caching-002.htm
Kommentare : 5 Kommentare »
Kategorien : PHP
23
10
2008
Um nach einer erledigten MYSQL-Query den davon belegten Speicher wieder freizugeben kann man die Funktion “mysql_free_result” verwenden.
Beispiel:
$query = mysql_query(“SELECT name FROM table”);
$result = mysql_fetch_array($query);
Mit mysql_free_result($query ); wird nun der durch die Query belegte Speicher freigegeben. Das macht aber eigetlich nur bei großen Abfragen (oder wenig Arbeitsspeicher) Sinn, da am Ende eines Scriptes der Speicher sowieso freigegeben wird.
Kommentare : 3 Kommentare »
Kategorien : PHP
23
10
2008
Um den aktuellen Sepicherbedarf eines PHP-Scriptes anzeigen zu lassen kann man einfach die Funktion “memory_get_usage” verwenden.
So gibt..
echo memory_get_usage();
.. den aktuellen Speicherbedarf im Script in Bytes aus.
Kommentare : Keine Kommentare »
Kategorien : PHP
19
08
2008
Da die PHP-Funktion ‘filesize’ nur Datei handeln kann, die lokal auf dem Server liegen, kann man die Dateigröße von entfernten Dateien (Remote, Resource) mithilfe folgender Funktionen herausfinden.
PHP4:
function extern_filesize($url)
{
ob_start();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_exec($ch);
curl_close($ch);
$head = ob_get_contents();
ob_end_clean();
$regex = ‘/Content-Length:\s([0-9].+?)\s/’;
$count = preg_match($regex, $head, $matches);
if (isset($matches[1]))
{
$size = $matches[1];
}
else
{
$size = ‘unbekannt’;
}
return $fsize;
}
Und in PHP5:
function urlfilesize($url,$thereturn) {
if (substr($url,0,4)==‘http’) {
$x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
$x = $x['content-length'];
}
else { $x = @filesize($url); }
if (!$thereturn) { return $x ; }
elseif($thereturn == ‘mb’) { return round($x / (1024*1024),2) ; }
elseif($thereturn == ‘kb’) { return round($x / (1024),2) ; }
}
echo urlfilesize(‘http://www.file.de/file.csv’,‘mb’)
Quelle: http://de2.php.net/manual/en/function.filesize.php#81906
Kommentare : Keine Kommentare »
Kategorien : PHP