PHP: JSON in CSV konvertieren

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

canju

Mitglied
Ach entschuldige das war nicht der inhalt der test-get-json.json sondern habe mir via
php /pfad/zur/datei.php >> test_file.txt das ergebnis ausgeben lassen.
War nur gut zu sehen, dass das api limit überschritten wurde.

Inhalt der test-get-json.json sieht so aus:

JSON:
[
    [],
    [],
    [],
    [],
    [
        {
            "id": 259630312,
            "url": "http://www.publisher.com",
            "advertiserId": 7052,
            "publisherId": 189069,
            "commissionSharingPublisherId": 55555,
            "commissionSharingSelectedRatePublisherId": 189069,
            "campaign": "campaign name"
            "siteName": "Publisher",
            "commissionStatus": "pending",
            "commissionAmount": {
              "amount": 5.59,
              "currency": "GBP"
            },
            "saleAmount": {
              "amount": 55.96,
              "currency": "GBP"
            },
            "ipHash": "-66667778889991112223",
            "customerCountry": "GB",
            "clickRefs": {
              "clickRef": "12345",
              "clickRef2": "22222",
              "clickRef3": "33333",
              "clickRef4": "44444",
              "clickRef5": "55555",
              "clickRef6": "66666"
            },
            "clickDate": "2017-01-23T12:18:00",
            "transactionDate": "2017-02-20T22:04:00",
            "validationDate": null,
            "type": "Commission group transaction",
            "declineReason": null,
            "voucherCodeUsed": true,
            "voucherCode": "example123",
            "lapseTime": 2454307,
            "amended": false,
            "amendReason": null,
            "oldSaleAmount": null,
            "oldCommissionAmount": null,
            "clickDevice": "Windows",
            "transactionDevice": "Windows",
            "publisherUrl": "http://www.publisher.com/search?query=dvds",
            "advertiserCountry": "GB",
            "orderRef": "111222333444",
            "customParameters": [
              {
                "key": "1",
                "value": "555666"
              },
              {
                "key": "2",
                "value": "example entry"
              },
              {
                "key": "3",
                "value": "LLLMMMNNN"
              }
            ],
            "transactionParts": [
              {
                "commissionGroupId": 12345,
                "amount": 44.76,
                "commissionAmount": 4.50,
                "commissionGroupCode": "DEFAULT",
                "commissionGroupName": "Default Commission"
              }
        
              {
        
                "commissionGroupId": 654321,
                "amount": 11.20,
                "commissionAmount": 1.50,
                "commissionGroupCode": "EXISTING",
                "commissionGroupName": "EXISTING"
              }
        
        
            ],
            "paidToPublisher": false,
            "paymentId": 0,
            "transactionQueryId": 0,
            "originalSaleAmount": null
          }
    ]
    ],
    [],
    [],
    [],
    [],
    [],
    [],
    [],
    []
]
 

Sempervivum

Erfahrenes Mitglied
Hm, wir schicken ja nur 13 Requests raus. Kann es vielleicht sein, dass Du beim Testen das Skript häufiger aufgerufen hast und dass es dadurch zu der Überschreitung gekommen ist? Ist ja häufig so beim Testen.
 

Sempervivum

Erfahrenes Mitglied
Oder ist vielleicht der Text der Fehlermeldung irreführend: 60 sec / 20 = 3 sec, so dass man nur alle 3 sec einen Request schicken darf?
 

canju

Mitglied
Ja, gut möglich , dass ich zwei mal zu schnell hintereinander ausgeführt habe. Habe es gerade nochmal ausgeführt, kam keine Fehlermeldung mehr.

Könntest du mir evtl. noch eine Zeitverzögerung zwischen den einzelnen requests einbauen, die ich per variable ändern kann? *liebguck. Sodass quasi sagen wir 30 sekunden zwischen jedem request gewartet wird bevor der nächste gesendet wird

Ich vermute ich muss doch weiter in die Vergangenheit gehen als 12 Monate und wir haben noch einige andere services, die diesen Endpunkt ansprechen.
 

Sempervivum

Erfahrenes Mitglied
Dafür gibt es die Funktion sleep mit der Anzahl von Sekunden als Parameter. Rufe sie am Ende der Schleife auf:
Code:
for ($i = 0; $i < 13; $i++) {
    // prepare start and end time and URL:
    $start_date = $dateObj->format('Y-m-d');
    $dateObj->modify('+30 days');
    $end_date = $dateObj->format('Y-m-d');
    $url = 'https://webentwicklung.ulrichbangert.de/testget-json.php?startDate=' . $start_date . 'T00%3A00%3A00&endDate=' . $end_date . 'T00%3A00%3A00&timezone=Europe/Berlin&dateType=transaction';
    echo 'url=' . $url . '<br>';

    // fetch from API by use of curl:
    $ch = curl_init($url) or die($current_datetime . " - " . $script_name . " - Couldnt reach endpoint \n");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $data = curl_exec($ch);
    echo 'response=' . $data . '<br>';
    $data = json_decode($data, true);
    $responseArr[] = $data;
    sleep(30);
}
Du musst nur aufpassen, weil dann das Skript relativ lange läuft: 30 * 13 sec plus die Antwortzeiten auf die API.
 

Sempervivum

Erfahrenes Mitglied
Man könnte auch das Skript zyklisch aufrufen durch einen Cronjob mit 30 sec. Dann hättest Du das Problem mit der langen Laufzeit nicht.
 

canju

Mitglied
Man könnte auch das Skript zyklisch aufrufen durch einen Cronjob mit 30 sec. Dann hättest Du das Problem mit der langen Laufzeit nicht.
ja ist vielleicht die sicherere variante. ich habs jetzt auf jeden fall schonmal mit sleep(4) und 24 monaten laufen lassen. ist nicht in den timeout gegangen.

weiß gar nicht wie ich das wieder gut machen kann, hast mir sehr geholfen @Sempervivum, vielen lieben dank nochmal.

ich mach jetzt erstmal feierabend und bastel morgen weiter.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…