Wenn man Cloudfusion für die Product Advertising API einsetzt und Italien und China abfragen will, muss man einen kleinen Hack vornehmen. Beispiel ist für Italien, China funktioniert entsprechend.
Kategorie: PHP
PHP Probleme,Tipps und Tricks
Jeder kennt das Problem, aus irgendeinem Grund wurden Wörter in der falschen Kodierung in die Datenbank geschrieben. Wenn das passiert ist, kann man daran erkennen, dass sich Zeichen wie diese untergemischt haben:
'¦, '¨, '?, '´, '¸, 'À, 'Ã, 'Â, 'Ã, 'Ä, 'Ã…, 'Æ, 'Ç, 'È, 'É, 'Ê, 'Ë, 'ÃŒ, 'Ã, 'ÃŽ, 'Ã, 'Ñ, 'Ã’, 'Ó, 'Ô, 'Õ, 'Ö, 'Ø, 'Ù, 'Ú, 'Û, 'Ãœ, 'Ã, 'Þ, 'ß, 'à , 'á, 'â, 'ã, 'ä, 'Ã¥, 'æ, 'ç, 'è, 'é, 'ê, 'ë, 'ì, 'Ã, 'î, 'ï, 'ð, 'ñ, 'ò, 'ó, 'ô, 'õ, 'ö, 'ø, 'ù, 'ú, 'û, 'ý, 'þ, 'ÿ
Das Problem ist, dass diese Zeichen nicht utf8 kodiert worden sind, aber in utf8 dargestellt worden sind, was eine Vielzahl an Gründen haben kann.
Wenn die Performance einer Webseite nachgibt, stellt man sich oft die Frage, an welche Funktion/Modul liegt der Performanceverlust? Die Lösung ist das Profiling einer Webseite.
Profiling beschäftigt sich der Analyse der Funktionsaufrufe eine Webseite. Es kann dadurch analysiert werden, welche Teile sehr lange brauchen oder welche Funtionen doppelt aufgerufen werden.
Profiling sollte nicht auf einem Produktivsystem ausgeführt werden, weil die Performance einbricht und Ausgaben sichtbar sind. Übrigends: Wer seine Webseite schneller macht, SEO optimiert gleichzeitig.
XDebug ermöglicht es ein Programm zur Laufzeit zu debuggen und Step by Step.
Dazu sollte als erstes das folgende Tool verwendet werden für die Installation um die richtige Version zu installieren:
- XDebug Installations Hilfe Tool
- Zur Kontrolle kann nach der Installation das Tool noch mal verwendet werden und es sollte unter Xdebug installed: 2.x anzeigen
- php.ini Einstellungen anpassen:
xdebug.remote_enable=onxdebug.remote_handler=dbgp xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.remote_log=" \xampp\htdocs\xError.log"
- Danach sollte geteste werden, ob der Port 9000 freigegeben ist mit dem folgenden Script:
$address = '127.0.0.1'; $port = 9000; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die('Unable to bind'); socket_listen($sock); $client = socket_accept($sock); echo "connection established: $client"; socket_close($client); socket_close($sock);
- Danach kann in Netbeans mit Debug Projekt (STRG+F5) und einem Breakpoint das passende Projekt debugt werden. Wenn es nicht klappt, muss die URL im Browser manuell angepasst werden:http://localhost/class.php?XDEBUG_SESSION_START=netbeans-xdebug
Wenn man schreibenden Zugriff auf Dateien wie z.B. .txt oder .dat Dateien aus einem Skript heraus hat, sollten diese
- vom Skript angelegt worden sein, nicht manuell bei FTP. Damit ist sichergestellt , dass der Besitzer kein FTP Account ist.
- die Schreibrechte 644 haben, damit sie nicht von einem anderen Account überschrieben werden können oder durch den automatischen Upload einer IDE überschrieben werden.
Bsp:
if(!file_put_contents ($log_file ,"")) { chmod ($log_file, 0644); }
So können Fehler wie dieses vermieden werden:
Warning: file_put_contents(log.txt) [function.file-put-contents]: failed to open stream: Permission denied in class.php on line x
Warning: chmod() [function.chmod]: Operation not permitted in class.php on line x
PHP Konstanten ändern
Es scheint erst einmal unsinnig zu sein, aber in machen Situationen, z.B: wenn man in ein komplettes SDK Eingreifen will ohne es zu verändern, würde man gern PHP Konstanten ändern.Möglich ist das mit dem PHP-Core nicht, aber es gibt eine PECL Extension namens runkit, damit funktioniert es.
Im folgenden Beispiel habe ich versucht den Wert eine Kosntanten per Referenz anschließend zu ändern, leider (oder Gott sei Dank) hat es ncht geklappt:
$key = 'vorher'; define('KONSTANTE', &$key); echo KONSTANTE; $key = "nachher"; echo KONSTANTE;
//Ausgabe:vorher vorher
Das ist auch gut so, weil Konstanten nun mal konstant sein sollen und nicht variabel.
Auch eine nachträgliche Änderung funktioniert natürlich nicht:
$key = 'vorher'; define('KONSTANTE', $key); echo KONSTANTE; $key = "nachher"; define('KONSTANTE', $key); echo KONSTANTE;
//Ausgabe:vorher vorher
Ab Februar 2012 stellt Amazon den Support älterer Versionen Ihrer Product Advertising API
ein und untersrützt nur noch das neue AWS System.Auch inhaltlich werden ein paar Änderungen vorgenommen (Quelle Amazon aws-portal.amazon.com):
- Associate Tag will be a required and verified input parameter in all requests to the API
- SellerLookup, SellerListingLookup and SellerListingSearch operations will no longer be supported by the API
- ItemPage parameter will be limited to a maximum of 10 pages for ItemSearch results
- MerchantId parameter will no longer be supported for filtering offers, variations and search results
- Merchants search index will no longer be supported
- Data returned by the Offers and ItemAttributes response groups will be limited to the most frequently used attributes
Zur Zeit kann es bei älteren Versionen zu leeren Responses kommen, was strategische oder technische Ursachen seitens Amazon haben kann.
Die Account Umstellung kann hier durchgeführt werden.
Das Cloudfusion SDK für PHP
Mit Hilfe des Cloudfusion PHP SDK für PHP kann der Zugriff auf die API vereinfacht werden. Cloudfusion ist eine von Community entwickelte Erweiterung des AWS SDK for PHP von Amazon. Es ist nur zu empfehlen Cloudfusion zu benutzen, wenn ein nicht vom AWS SDK for PHP von Amazon unterstützter Dienst angesprochen werden soll. Dazu gehören:
- Amazon Product Advertising API
- third-party API-kompatibele Services wie Eucalyptus oder Google Storage
Für einen Request muss die config.php mit den Account Daten befüllt werden und mit dem Code kann dann ein Abfrage gesendet werden:
require_once 'sdk.class.php'; $pas = new AmazonPAS(); $response = $pas->item_search('red hot chili peppers'); var_dump($response);
Wer die Amazon API nutzt um seine Artikel zu verkaufen, der muss diese nach Amazon MWS migrieren, weil am 8. Oktober 2012 die AIM- und SOAP-Dienste heruntergefahren werden. Bis dahin gibt es eine Übergangsfrist, die gilt, wenn die API im Zeitraum vom 9.9.2011 und 9.10.2011 benutzt wurde.
Für das Rechtesystem in meinem Tippspiel werden die Komponenten Zend_Auth und Zend_Acl im Zendframework verwendet. Zend_Auth ist dabei für die Authentifizierung registrierter Nutzer zuständig und Zend_Acl für Verteilung und das setzen der Rechte. Es wurden drei Rollen angelegt: Guest, Member und Administrator.
Zend Test mit PhpUnit
Zum Testen wurde PHPUnit verwendet als Standard-Testing-Tool für PHP und in Netbeans intergriert.
Dazu wurde eine Bootstrap Datei angelegt, in der die Applikationsvariablen geladen werden (IndexControllerTest.php):
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini'); parent::setUp(); } }
Ein Test kann dan so aussehen (Test Files/application/controllers/IndexControllerTest.php):
require_once '/../../TestConfiguration.php'; require_once '/../../../application/models/Players.php'; class PlayersTest extends PhpUnit_Framework_TestCase{ public function setUp() { TestConfiguration::setupDatabase(); } public function testFetchAll(){ $TippspielObjekt = new Players(); $TippspielAnzahl = $TippspielObjekt->fetchAll(); $this->assertGreaterThan(10, $TippspielAnzahl->count()); } public function testLatest(){ $TippspielObjekt = new Players(); $TippspielAnzahl = $TippspielObjekt->fetchLatest(1); $this->assertSame(1,$TippspielAnzahl->count()); } }