Entries tagged ausgabe

Anleitung: Produkte bei eBay über API mit PHP SDK listen – Teil 2: XML Dateien mit PHP erstellen

Posted on 10. Oktober 2014 Comments

Dieser Blog Post ist Teil der Reihe Produkte bei eBay listen.


2.1. XMLWriter

Für das Schreiben von XML in PHP wird hier die XMLWriter Klasse verwendet, sie sollte eigentlich überall vorhanden sein. Als erstes wird ein Objekt erstellt.

$writer = new XMLWriter();

Mit dem folgenden Code kann man zwischen Ausgabe im Browser/auf der Konsole und dem Schreiben in eine .xml-Datei hin- und herschalten.

if ($DEBUG) {
$writer->openURI('php://output');
} else {
$filename = 'AddFixedPriceItem.xml';
touch($filename);
$writer->openURI($filename);
}

Der XMLWriter macht allerdings keine Absätze und so würden die folgende Anweisungen alles in eine Zeile schreiben. Prinzipiell ist das natürlich erstmal nicht unbedingt ein Problem. Allerdings wird eBay die Datei ab einer bestimmten Zeilenlänge nicht mehr akzeptieren, (wahrscheinlich) da die Zeilenanzahl ein Kriterium für die maximale Größe von BulkDataExchangeRequests sind.

$writer->setIndent(true);

Bevor die Elemente geschrieben werden, wird erst einmal das Dokument mit Version und Encoding begonnen.

$writer->startDocument('1.0', 'UTF-8');

Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>

Ab jetzt können beliebig Elemente geschrieben werden. Übergeordnete Elemente können mit den folgenden Befehlen geöffnet und geschlossen werden. Dabei ist beim Schließen der Name egal, es zählt die Reihenfolge. Gerade in Schleifen sollte man hier also genau hinsehen.

$writer->startElement('BulkDataExchangeRequests');
...
$writer->endElement();

Ergebnis:

<BulkDataExchangeRequest>
...
</BulkDataExchangeRequest>

Soll ein Element mit einem Wert geschrieben werden wird der folgende Befehl verwendet

$writer->writeElement('SiteID', '77');

Ergebnis

<SiteID>77</SiteID>

Nun gibt es noch den seltenen Fall, dass in einem Tag noch ein Attribut vorhanden ist. Dies wird folgendermaßen realisiert:

$writer->startElement('ShippingServiceCost');
$writer->writeAttribute('currency', 'EUR');
$writer->text('0.0');
$writer->endElement();

Ergebnis:

<ShippingServiceCost currency="EUR">0.0</ShippingServiceCost>

Zuletzt sollte das Dokument noch geschlossen und der Puffer geschrieben (entweder in die Ausgabe oder in die Datei) werden:

$writer->endDocument();
$writer->flush();

2.2. Dateien zippen

In den Beispielen, die in Teil 3 benutzt werden, wird die .xml-Datei noch komprimiert, bevor sie hochgeladen wird. Dies kann mit dem folgenden Snippet umgesetzt werden.

if (!$DEBUG) {
$gzfile = $filename . ".gz";
$fp = gzopen($gzfile, 'w9');
gzwrite($fp, file_get_contents($filename));
gzclose($fp);
}

dd Statusanzeige

Posted on 12. September 2011 Comments

dd ist das Kommandozeilen Kopiertool von *nix-Betriebssystemen. Im Gegensatz zu den meisten Programmen, hat es aber keine Statusanzeige oder gar einen Statusbalken um den Fortschritt anzuzeigen, so dass man kontrollieren kann, ob sich das Programm nicht vielleicht aufgehängt hat.

Mit diesem Trick kann man aus dd dennoch zu einer Ausgabe zwingen:

  1. dd Kopiervorgang starten, z.B.:
    $ dd if=/dev/sdb of=/dev/sdc
  2. Neue Konsole öffnen
  3. PID vom dd-Prozess herausfinden:
    $ ps -A |grep dd

    Die Ausgabe könnte z.B. so aussehen:

    $ 4905 pts/0   00:00:00 dd
  4. Statusreport-Signal an dd senden(PIDist die Nummer die Schritt 3. ergeben hat, z.B. 4095):
    $ kill -USR1 PID
  5. In der Konsole aus der ddgestartet wurde müsste jetzt eine Ausgabe kommen, z.B.
    75273+0 Datensätze ein
    75273+0 Datensätze aus
    38539264 Bytes (39 MB) kopiert, 27,4718 s, 1,4 MB/s

 

Ausserdem gibt es noch ein grafisches Tool für dd: air-imager

Credits to jma89 and h4shBrpwnz at linuxquestions.org

//update:
Das kleine Programm pipe viewer(pv) tuts auch und man bekommt sogar noch Datenrate und Fortschrittsbalken. Einfach installieren:

$ sudo apt-get install pv

Und dann über den geraden Strich über den eckigen Klammern an den dd Befehl hängen:

$ dd if=/mnt/sdx of=/mnt/sdy | pv

Credits to Peteris Krumin for finding this.

 

//update2:

Manchmal klappt das so nicht, z.B. beim Raspberry Pi (interne SD Karte auf USB Stick(/dev/sda) sichern). Dort muss man das folgendermaßen machen:

sudo dd if=/dev/mmcblk0 | pv | sudo dd of=/dev/sda

Thanks to from urfix.com