• 19-04-2021, 04:29:25
    #1
    Merhaba,

    Aşağıda ki kodu kullanarak farklı URL'lerde ki JSON çıktısını değişkene kaydedip, parse ediyorum. Sonra veritabanına yazdırıyorum. Her bir link 250 adet veri içeriyor. Almak istediğim veri daha fazla ama bir sayfada en fazla 250 adet gösterim sağlıyor site. O yüzden sayfa sayfa almam gerekiyor. dataOne olan değişken sorunsuz çalışıyor. dataTwo olan değişken sanırım JSON verisini tam olarak almadan çalışıp, sonlanıyor. Çünkü Veritabanına 250 kayıt geliyor. Üzerine +60 +80 +50 gibi sürekli değişken veri ekleniyor. Yani ikinci veri tam olarak değişkene aktarılmadan işleme alınıyor. Bunun önüne nasıl geçebilirim. Bu şekilde yaklaşık 8-9 URL'den veri çekmem gerekiyor. Döngü kullandım, fonksiyon kullandım fakat sorunu çözemedim.


    NOT: PHP konusunda çok acemiyim, bunu baz alarak yardımcı olursanız çok minnettar olurum.

    $dataOneURL = file_get_contents("https://xxx.com/data.php?page=1");
    $dataOne = json_decode($dataOneURL , true);
    
    $dataTwoURL = file_get_contents("https://xxx.com/data.php?page=2");
    $dataTwo = json_decode($dataTwoURL  , true);
    
    $count = 0;
    
    while( $count < 250 ) {
    $insertOne = mysqli_query($baglan, "INSERT INTO data VALUES (DEFAULT,
    '{$dataOne[$count]["id"]}',
    '{$dataOne[$count]["image"]}',
    ...
    ... ");
    
    $insertTwo = mysqli_query($baglan, "INSERT INTO data VALUES (DEFAULT,
    '{$dataTwo[$count]["id"]}',
    '{$dataTwo[$count]["image"]}',
    ...
    ... ");
    
    $count += 1;
    }
  • 19-04-2021, 04:36:40
    #2
    ayrı ayrı çalıştırınca sorunsuz çekiyor yani değil mi bunu denediniz mi?
  • 19-04-2021, 04:39:51
    #3
    Gelen her bir data ya id verseniz çektiğiniz datalarida sorgulasaniz önceden ekli ise bir daha eklenmese bir sorun kalmaz bence sunucuyu yorar ama çalışır veya sunucuyu yormadan bir url ile bir dosya yapsanız güzel olur
  • 19-04-2021, 04:50:35
    #4
    ealgan adlı üyeden alıntı: mesajı görüntüle
    ayrı ayrı çalıştırınca sorunsuz çekiyor yani değil mi bunu denediniz mi?
    Az önce yine denedim. İkinci URL'den 20 veri çekti hocam. Yine çözüm olmadı maalesef.

    mehmetkilic1409 adlı üyeden alıntı: mesajı görüntüle
    Gelen her bir data ya id verseniz çektiğiniz datalarida sorgulasaniz önceden ekli ise bir daha eklenmese bir sorun kalmaz bence sunucuyu yorar ama çalışır veya sunucuyu yormadan bir url ile bir dosya yapsanız güzel olur
    Hocam başka kaynaktan aldığım veri üzerinde işlemler yaparak kullanıcılara gösteriyorum RestAPI ile. Bir adet ekleme fonksiyonu yazıyorum. İlk kez çalıştıracağım zaman kullanıp sonra yorum satırı yapıyorum. Sonrasında veriler geldiğinde veritabanında UPDATE işlemini yapıyorum.
  • 19-04-2021, 04:59:03
    #5
    hocam linkleri pm atar mısınız
  • 19-04-2021, 05:27:19
    #6
    Açıkçası koda bakıpta şunu anladım kısaca botvari bir işlem yaptırmak istiyorsunuz gibi duruyor. Yani verileri işleyeceksiniz datatwo dataone gibi ifadeler yerine for döngüsü ile işi daha kolay yaptırabilirsiniz. Hem daha az kod yığını hem daha güzel sonuçlar verir. Veri büyükse ini_set ile max memory ve max exec time tanımlarını verin. For aktifken web kısmında çalıştırabilirsiniz fakat dökümleri tek tek dökmez. Dökümleri tek tek almak isterseniz konsol ile çalıştırmanız gerekir.
  • 19-04-2021, 05:41:01
    #7
    Aynı anda 500 defa insert yapmaya çalışıyorsun. Bunun yerine her 250 kayıdı tek seferde insert etmelisin. While ile değil.

    INSERT INTO MyTable ( Column1, Column2 ) VALUES
    ( Value1, Value2 ), ( Value1, Value2 )
  • 19-04-2021, 15:57:15
    #8
    BeratYildiz adlı üyeden alıntı: mesajı görüntüle
    Açıkçası koda bakıpta şunu anladım kısaca botvari bir işlem yaptırmak istiyorsunuz gibi duruyor. Yani verileri işleyeceksiniz datatwo dataone gibi ifadeler yerine for döngüsü ile işi daha kolay yaptırabilirsiniz. Hem daha az kod yığını hem daha güzel sonuçlar verir. Veri büyükse ini_set ile max memory ve max exec time tanımlarını verin. For aktifken web kısmında çalıştırabilirsiniz fakat dökümleri tek tek dökmez. Dökümleri tek tek almak isterseniz konsol ile çalıştırmanız gerekir.
    MCERAN adlı üyeden alıntı: mesajı görüntüle
    Aynı anda 500 defa insert yapmaya çalışıyorsun. Bunun yerine her 250 kayıdı tek seferde insert etmelisin. While ile değil.

    INSERT INTO MyTable ( Column1, Column2 ) VALUES
    ( Value1, Value2 ), ( Value1, Value2 )
    Öncelikle yanıtlarınız için çok teşekkür ederim, PHP konusunda kendimi geliştirmek için basit bir coin veri sayfası yapmak istiyorum. Bu verileri direkt siteden de çekebilirim ama biraz daha fazla konuya aşina olmam için veritabanına kayıt işlemi de yapmak istiyorum. Verileri bir URL'den alıp, veritabanıma kayıt edeceğim. Gösterirken de benim veritabanımdan göstereceğim. Yapmak istediğim şey budur.

    Örnek çıktı:


    Tek bir veriyi parse edip farklı tablolara kayıt ediyorum. 1 verinin içerisinde fazla detay var. Tek tabloda tutmam çok kötü olur. O yüzden verileri ayırıp ayırıp insert etmem gerektiğini düşünüyorum.

    Bu şekilde bir kod bloğu denedim. Verilere bu şekilde ulaşabilirsem bir array kayıt edip tek seferde insert yapabilirim, yukarıda ki arkadaşımızın söylediği gibi.. Fakat beyaz boş ekran döndürüyor bana...

    $urlAllData = file_get_contents("https://raw.githubusercontent.com/codehakan/deneme/main/data.json");
    $AllData = json_decode($urlAllData);
    
    foreach ($AllData->market_data as $mydata) {
        foreach ($mydata->current_price as $values) {
            echo $values->usd . "\n";
        }
    }
  • 19-04-2021, 16:11:33
    #9
    Anlık değişenn bir sistem için db de çok fazla insert ve update işlemi yapmayı planlıyorsunuz. Anladığım kadarı ile sunucunuz ve veritabanınız buna göre optimize değil veya yeterli donanımsal özelliklere sahip değil. Veritabanında insert ve update işlemlerinde ayrıca index devamlı yeniden hesaplanır. Buda veritabınınızın kilitlenmesine yol açar. Tamamen buna yönelik yapılandırsanız bu seferde select işlemleriniz yavaşlar. En iyi çözüm Redis, memcache veya daha basit olarak file caching yöntemine başvurmanız olacaktır. Sağlıklı yöntem budur.

    Koda gelecek olursak;
    Data elimizde yok ama çıktı resiminden yola çıkarsak şunu farkediyorum. Json çıktısında parent olarak bir üst kısımda bir dizi daha var. Yani şöyle olabileceğini varsayıyorum.

    $urlAllData = file_get_contents("https://api.com/?per_page=3&page=1");
    $AllData = json_decode($urlAllData);
    
    foreach ($AllData as $mydata) {
        foreach ($mydata->market_data as $marketData) {
            foreach ($marketData->current_price as $values) {
                echo $values->usd . "\n";
            }
        }
    }