Giriş yapmadınız.

#1 30.10.2014 20:06:42

betho
Üye
Kayıtlı: 15.05.2014
Mesajlar: 78

408 Connection Timeout Sorunu ?

Arkadaşlar merhaba,
Projemde bazı işlemler çok büyük boyutlu dosyaları okuma ve yazma esnasında time out a takılıyor ve program kırılıyor
Bunu önlemek için sunucumdaki time out sürelerini ve bununla ilgili tüm gereklilikleri 1 saatin üzerinde ayarladım max file size gibi değerleri 2 gb üzeri ayarladım ayrıca hod içeriğinde de bu değerleri maximum olacak şekilde set ediyorum ,ancak genede bazı işlemlerde time out a takılıyorum

Benim istediğim şey şu laravelde bu anı nasıl yalalayabilirim yani time outa düşeceği anda ben programımı bir yere yönlendirip devam etmesini sağlamak istiyorum

Bununla ilgili bakabileceğim örnekler yada bilgi sahibi olan arkadaşlardan örnek yada tavsiye rica ediyorum
Bu konuda her hangi bir kod yazamadığım için kod paylaşamadım ve hatası nedir gibi bir soru yöneltemedim

Sadece o anı nasıl yakalayabilirim ve programın kırılmasını sunucudan gelen 408 sayfasına düşmemeyi nasıl sağlarım

Laravel ile ilgili tüm pdf kitaplarını(Tr ve Eng olarak ) lienbupdan satın alıp araştırdım ancak bu konuda bir şeye ya rastlamadım ya gözümden kaçırdım

Soru şekli yeterince açık olsun diye uğraştım ancak açık olarak anlatamadıysam kusurumu mazur görünüz
şimdiden teşekkür ederim

Selam ve dua ile

Çevrimdışı

#2 30.10.2014 23:34:17

MURATSPLAT
Yönetici
Yer: Antalya
Kayıtlı: 06.05.2014
Mesajlar: 642
Website

Yanıt: 408 Connection Timeout Sorunu ?

Ben olsam, yüksek işlem gerekitiren ya da sürekli çalışması gerek işleri, node.js ya da php ile bir servis gibi yazarım. Laravel içinde bir isteğin(request) 3-4'dakika da tamamlanması beklenen bir davranış değildir.  Muhtemelen başka sorunlara neden olabilir.

Laravel'in çalıştığı ortam için  bahsettiğiniz gibi marjinal ayarları girmeyin bence. Kararlılık sorunları yaşarsınız.

Php ya da node.js ya da başka iyi bildiğiniz bir dille servis gibi yazın ve laravelle  paslaşmasını sağlayın.. Bu paslaşma da  muhtemelen veri tabanı ya da nosql bir veri tabanı aracılığıyla olabilir.

Senin bu sorunu bir kişisel projemde yaşadım. Kendimce zor ama uzun vadede verimli bir yol seçtim. Sırf bu tür işler için go dilini öğreniyorum. 2 ayım kafadan gitti. Daha önce php ile büyük boyutlu exel dosyaları yaratıyor ya da güncelliyordum. Bunu php'de yaparken canım çıktı. Çoğu zaman bellek sorunu yaşadım ya da zaman aşımına düştüm..

Çevrimdışı

#3 30.10.2014 23:55:38

betho
Üye
Kayıtlı: 15.05.2014
Mesajlar: 78

Yanıt: 408 Connection Timeout Sorunu ?

MURATSPLAT yazdı:

Ben olsam, yüksek işlem gerekitiren ya da sürekli çalışması gerek işleri, node.js ya da php ile bir servis gibi yazarım. Laravel içinde bir isteğin(request) 3-4'dakika da tamamlanması beklenen bir davranış değildir.  Muhtemelen başka sorunlara neden olabilir.

Laravel'in çalıştığı ortam için  bahsettiğiniz gibi marjinal ayarları girmeyin bence. Kararlılık sorunları yaşarsınız.

Php ya da node.js ya da başka iyi bildiğiniz bir dille servis gibi yazın ve laravelle  paslaşmasını sağlayın.. Bu paslaşma da  muhtemelen veri tabanı ya da nosql bir veri tabanı aracılığıyla olabilir.

Senin bu sorunu bir kişisel projemde yaşadım. Kendimce zor ama uzun vadede verimli bir yol seçtim. Sırf bu tür işler için go dilini öğreniyorum. 2 ayım kafadan gitti. Daha önce php ile büyük boyutlu exel dosyaları yaratıyor ya da güncelliyordum. Bunu php'de yaparken canım çıktı. Çoğu zaman bellek sorunu yaşadım ya da zaman aşımına düştüm..

@muratsplat kardeşim bilgilendirme için çok teşekkür ederim ancak ben proje teslim aşamasındayım dediğin gibi bir zaman üretme şansım yok acilen bir çözüm bulmam gerekiyor.
Bu nedenle bahsettiğin servis işlemlerini yapabileceğim örnek kaynaklar verebilir misin çünkü bahsettiğin tarzda bir şey daha önce PHP de yapmadım , mesela bu işi node,js +laravel +mysql+Eloquent kullanarak nasıl yapa bilirim ile ilgili kaynak var mıdır

C# ile kodlama yaparken PHP ye geçince sıkıntılar bitmiyor böyle smile Not:Kişinin kendisinden kaynaklanan sıkıntılar tabi , PHP nin bir suçu yok bence ...
Yada  daha başka bir şekilde .... nasıl yapabilirim

Kaynaklara ve örneklere ihtiyacım var ,eğer yeterli kaynak olursa mantığı çözebilirim

Tekrar teşekkürler kardeşim

Çevrimdışı

#4 31.10.2014 09:27:40

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 373
Website

Yanıt: 408 Connection Timeout Sorunu ?

Büyük boyutlu dosyaları ne için kullanıyorsunuz, nasıl bir işlem için gerekli açabilir misiniz? Database'den gelen büyük datalar mı bunlar yoksa tam anlayamadım.


Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#5 31.10.2014 12:01:19

MURATSPLAT
Yönetici
Yer: Antalya
Kayıtlı: 06.05.2014
Mesajlar: 642
Website

Yanıt: 408 Connection Timeout Sorunu ?

http://laravel.gen.tr/docs/queues#daemon-queue-worker
Şunu baktın mı?  Ben hiç kullanmadım. Muhtemelen en kestirme çözümü sunuyor.

php-cli için ayrı php ayarları giriliyor. Bu açıdan web servisi yapan php ile aynı ayarları kullanmak zorunda da kalmazsın. php terminalde farklı ayarlar kullanır..

Çevrimdışı

#6 31.10.2014 15:59:26

betho
Üye
Kayıtlı: 15.05.2014
Mesajlar: 78

Yanıt: 408 Connection Timeout Sorunu ?

evrend yazdı:

Büyük boyutlu dosyaları ne için kullanıyorsunuz, nasıl bir işlem için gerekli açabilir misiniz? Database'den gelen büyük datalar mı bunlar yoksa tam anlayamadım.

@evrend kardeşim bu datalar veri tabanından gelen datalar değil onları stored procedur e mysql fonksiyonları ile sunucuda derleyip daha küçük viewler oluşturarak istediğim gibi hızlandırabiliyorum ancak bu datalar csv dosyaları mesela siteme üye olacak olan bir sitede 250 bin den fazla ürün olan csv var ve benim bu csv yi otomasyon içerisinde okumam ve veri tabanına yazmama gerekiyor ,tabii ki bunu yapıyorum csv yi parse edip okuyup verileri gerkeli alanlara yazıyorum ancak bu yazma işlemi çok uzun sürüyor işte büyük datadan kasdım bu ,kısaca csv yada xml gibi dış kaynaklı dosyalar

http://pf.tradedoubler.com/export/expor … 6232443540
bu linkte yaklaşık 296900 adet ürün var ilk adım olarak ben bu linkdeki datanın boyutunu almama gerekiyor nedeni ise şu daha sonra güncelleme olup olmadığını anlayıp ona göre otomatik olarak benim de sistemde güncelleme yapamam için

Bunun için kullandığım kod şu :

$url="http://pf.tradedoubler.com/export/export?myFeed=14128976232443540&myFormat=14128976232443540";

Bu linki aşağıdaki static fonksiyonu çağıran fonksiyon gönderiyor
 public static function getSizeRemote($url ,$readable = true) {

<!--CURL Kullanarak dosya boyutunu aldığım kod bu çoğu zaman büyük dosyalarda  başarısız oluyor
Bu nednele bunu bıraktım-->


//   return Http::http_request('GET',$url);
//        $ch = curl_init($url);
//        curl_setopt($ch, CURLOPT_HEADER, TRUE);
//        curl_setopt($ch, CURLOPT_NOBODY, TRUE);
//        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
//        curl_exec($ch);
//        $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
//        curl_close($ch);
//        return $size;
        
// Url parse ederek dosya  boyutunu aldığım kod ///
        $parsed = parse_url($url);
        $host = $parsed["host"];
        $fp = fsockopen($host, 80, $errno, $errstr, 20);
        if (!$fp)
            return false;
        else {
            fputs($fp, "HEAD $url HTTP/1.1\r\n");
            fputs($fp, "HOST: $host\r\n");
            fputs($fp, "Connection: close\r\n\r\n");
            $headers = "";
            while (!feof($fp))
                $headers .= fgets($fp, 128);
        }
        fclose($fp);
        $return = false;
        $arr_headers = explode("\n", $headers);
        foreach ($arr_headers as $header) {
// follow redirect
            $s = 'Location: ';
            
            if (substr(strtolower($header), 0, strlen($s)) == strtolower($s)) {
                $url = trim(substr($header, strlen($s)));
                return get_remote_file_size($url, $readable);
            }

// parse for content length
            $s = "Content-Length: ";
            if (substr(strtolower($header), 0, strlen($s)) == strtolower($s)) {
                $return = trim(substr($header, strlen($s)));
                break;
            }
        }
        if ($return && $readable) {
            $size = $return;
        }
        $size = $return;
         return $size;
    }

Dosyayı okuyup veri tabanına gönderdiğim kod ise aşağıda bu da bu link için 2 saatten fazla sürüyor ve tabii ki connection time out oluyor :

$csvfile ="http://pf.tradedoubler.com/export/export?myFeed=14128976232443540&myFormat=14128976232443540";
$handle = fopen($csvfile, 'r');
$length=4096;
$delimeter = "|";
 while (($data = fgetcsv($handle, $length, $delimeter, '"', '\\')) !== FALSE) {
            ini_set("memory_limit", "7G");
            ini_set('max_execution_time', '0');
            ini_set('max_input_time', '0');
            ignore_user_abort(true);
            set_time_limit(0);
            DB::connection()->disableQueryLog();
            $gonder = [];

            for ($x = 0; $x <= count($array_param_csv) - 1; $x++) {
                $gonder['$paramCsv_' . $x] = $data[$data_arrayno[$x]];
                $gonder['$tCol_' . $x] = $input_get_tCol[$x];
            }

            $anahtar = array_search('prod_id', $gonder);
            $rakam = explode('_', $anahtar);
            if (count($rakam) < 2) {
                return 'Error Product ID column !!!! Please Select true Product Id column again !';
            } else {
                $productId = $gonder['$paramCsv_' . $rakam[1]];

                // CHECK IF PRODUCTS PRICE IS ALLREADY IN DATABASE
                  $mpDB =Merchantsproduct::where('m_id', '=', $m_id)->where('prod_id', '=', $productId)->where('feed_id', '=', $id)->first();
                $urun = 0;

                if ($mpDB) {
                     $merch_id=$m_id;
                     $prodact_id = $productId;
                     $feedd_id = $id;
                    $message = 1;
                    $updateProduct = Merchantsproduct::where('m_id',$m_id)->where('prod_id',$productId)->where('feed_id',$id)->first();
                    for ($x = 0; $x <= count($array_param_csv) - 1; $x++) {
                        

                        if ($updateProduct->not_found == 404) {
                            $column = $input_get_tCol[$x];
                            $datam = $data[$data_arrayno[$x]];
                            $updateProduct->$column = $datam;
                            $updateProduct->save();
                        }
                        if ($input_get_tCol[$x] != 'prod_image') {
                            $column = $input_get_tCol[$x];
                            $datam = $data[$data_arrayno[$x]];
                            $updateProduct->$column = $datam;
                            $updateProduct->save();
                        }
                        if ($input_get_tCol[$x] == 'prod_brand') {
                            $brands = Brand::where('name', '=', $data[$data_arrayno[$x]])->select('name')->first();
                            if (!$brands) {
                                $br = new Brand;
                                $br->name = $data[$data_arrayno[$x]];
                                $br->slug = Str::slug($data[$data_arrayno[$x]]);
                                $br->save();
                            }
                        }
                    }
                    $urun++;
                } else {
                    $message = 0;
                    $insertProduct = new Merchantsproduct;
                    for ($x = 0; $x <= count($array_tCol) - 1; $x++) {
                        $column = $input_get_tCol[$x];
                        $datam = $data[$data_arrayno[$x]];
                        $insertProduct->$column = $datam;
                        $insertProduct->feed_id = $id;
                        $insertProduct->m_id = $m_id;
                        $insertProduct->m_name = $merc_name;
                        $insertProduct->cat_id = -1;
                        $insertProduct->cat_map = 0;
                        $insertProduct->save();
                        if ($input_get_tCol[$x] == 'prod_brand') {
                            $brands = Brand::where('name', '=', $data[$data_arrayno[$x]])->select('name')->first();
                            if (!$brands) {
                                $br = new Brand;
                                $br->name = $data[$data_arrayno[$x]];
                                $br->slug = Str::slug($data[$data_arrayno[$x]]);
                                $br->save();
                            }
                        }
                    }
                }
            }
            $prods++;
            unset($data);
        }/* END WHILE  */
//Not::$array_param_csv gibi arraylar formdan gelen selectlerin içeriklerini tesbit edip dolduruyor ve sonra bunları While içinden gelen csv datasının kolonlarıo ile buluşturuyor bu nedenle o değişkenlerin anlaşılabilmesi için tüm csv motorunu komple yazmak gerekeceğinden ve burada çok fazla kod yazmaya gerek olmadığından onları vermiyorum   //

Bu şekilde yaptığımda bile bahsettiğim dosyanın sadece boyutunu öğrenmek 20 dakika sürdüğü oluyor



MURATSPLAT yazdı:

Queue olayından bahsediyorsun

Queue olayına baktım ama bu işi kuyruk olayına nasıl entegre edebileceğimi anlayamadım
Ben Laravel dokümentasyonda yeterli açıklamaların olmadığını sadece yüzeysel olarak açıklamalar yapıldığını düşünüyorum yada ben anlamakta zorluk çekiyorum  o nedenle bu yüzeysel açıklamalar bana pek fazla ip ucu vermiyor , neredeyse tamamı işi bilen laravel uzmanlarına ufak tiyolar tarzında yazılmış gibi geliyor bana, bu benim fikrim ,yanlış olabilir ancak böyle düşünüyorum

Son düzenleyen betho (31.10.2014 16:03:50)

Çevrimdışı

#7 01.11.2014 10:45:29

MURATSPLAT
Yönetici
Yer: Antalya
Kayıtlı: 06.05.2014
Mesajlar: 642
Website

Yanıt: 408 Connection Timeout Sorunu ?

Daha önce hiç kullanmadığımı söylemiştim. Dökümanı okuyup denemeler yapacaksınız. Oturup size nasıl çalıştığını anlatacak kadar zamanım yok. Muhtemelen kimsenin yoktur. Belki kuyruları projelerinde sık sık kullanan biri örnekler verebilir.

dökümanda bir örnek var : kuyruğa iş eklemek:

Örnekte kullanıcı siliniyor.

Queue::push(function($is) use ($id)
{
    Account::delete($id);

    $is->delete();
});

kuyruktaki işleri çalıştırmak için yani örnekteki gibi kuyruğa eklenen bir kullanıcının silinmesi için terminalden komut çalıştırılır. Tüm kuyruktaki işler çalışır.

php artisan queue:listen

laravel dökümanından

Kuyruk yapılandırma dosyası app/config/queue.php olarak saklanır. Bu dosyada framework'e dahil edilmiş kuyruk sürücülerinin her birisi için bağlantı yapılandırmaları bulacaksınız. Laravel'deki kuyruk sürücüleri arasında Beanstalkd, IronMQ, Amazon SQS, Redis ve senkronize (lokal kullanım için) sürücü yer almaktadır.

laravel dökümanları genel olarak çok iyi. Ama anlamak için çaba aharcamalısınız. Ben laravel dökümantasyonları kullanarak laravel kullanıyorum. Şuana kadar da hiç yolda bırakmadı. Genellikle tüm sorunlar için çözümler laravel'de ve dökümantasyonunda var.

Çevrimdışı

#8 01.11.2014 12:00:18

betho
Üye
Kayıtlı: 15.05.2014
Mesajlar: 78

Yanıt: 408 Connection Timeout Sorunu ?

MURATSPLAT yazdı:

Daha önce hiç kullanmadığımı söylemiştim. Dökümanı okuyup denemeler yapacaksınız. Oturup size nasıl çalıştığını anlatacak kadar zamanım yok. Muhtemelen kimsenin yoktur. Belki kuyruları projelerinde sık sık kullanan biri örnekler verebilir.

dökümanda bir örnek var : kuyruğa iş eklemek:

Örnekte kullanıcı siliniyor.

Queue::push(function($is) use ($id)
{
    Account::delete($id);

    $is->delete();
});

kuyruktaki işleri çalıştırmak için yani örnekteki gibi kuyruğa eklenen bir kullanıcının silinmesi için terminalden komut çalıştırılır. Tüm kuyruktaki işler çalışır.

php artisan queue:listen

laravel dökümanından

Kuyruk yapılandırma dosyası app/config/queue.php olarak saklanır. Bu dosyada framework'e dahil edilmiş kuyruk sürücülerinin her birisi için bağlantı yapılandırmaları bulacaksınız. Laravel'deki kuyruk sürücüleri arasında Beanstalkd, IronMQ, Amazon SQS, Redis ve senkronize (lokal kullanım için) sürücü yer almaktadır.

laravel dökümanları genel olarak çok iyi. Ama anlamak için çaba aharcamalısınız. Ben laravel dökümantasyonları kullanarak laravel kullanıyorum. Şuana kadar da hiç yolda bırakmadı. Genellikle tüm sorunlar için çözümler laravel'de ve dökümantasyonunda var.


İlgi ve alakanız için çok teşekkür ederim

Selam ve dua ile

Çevrimdışı

Forum alt kısmı