İşleme sırasında sayfa güncellemeleri

Yapılması birkaç dakika sürebilen bir PHP betiği var. Bir grup regex komutunu çalıştıran ve sonuçları kullanıcıya alan bir arama motorudur.

Denetleyicimdeki büyük işleme yöntemine AJAX araması yapan bir "yükleme sayfası" görüntüleyerek başladım (hadi 'P' diyelim). Bu yöntem daha sonra kısmi bir görünüm döndürür ve sadece "yükleme sayfam" içeriğimi bu kısmi görünümle değiştiririm. İyi çalışıyor.

Şimdi yapmak istediğim, kullanıcıya işlem hakkında zaten bir kaç sonuç bulduğu gibi süreç hakkında biraz bilgi vermek (ve daha sonra da üzerinde bazı kontroller yapmak). Bunu başarmak için, her 5 saniyede bir, başka bir AJAX araması yapıyorum ki bu, mevcut sonuç sayısını alması ve basit bir html öğesinde göstermesi gerekiyor. Bu çağrı, 'P' yöntemi ile aynı kontrol cihazında 'R' yöntemini kullanır.

Şimdi yaşadığım sorun şu ki, doğru geçerli sonuç sayısını alamıyorum. 2 şey denedim:

  • Session variable ('file' driver) : in 'P' I first set a session variable 'v' to 0 and then update 'v' every time a new result is found. 'R' simply returns response()->json(session('v'))
  • Controller variable : same principle as above but I use a variable declared at the top of my controller.

AJAX 'P' çağrısı her iki durumda da çalışır, ancak her zaman ve her iki durumda da 0 değerini döndürür. 'P' betiğinin sonunda 'v' yi geri gönderirsem, doğru değere sahiptir.

Bana göre 'R', 'v' nin asıl güncel değerine erişemiyor, sadece 'önbelleğe alınmış' bir versiyonuna erişiyor.

Yapmak istediğim şeyi nasıl başarabileceğime dair bir fikri olan var mı? Başka bir "temizleyici" yaklaşım var mı ve/veya benim sorunum ne?

Teşekkür ederim, iyi günler!

__

Bazı sözde kod umarım biraz daha kesin hale getirmek için.

SearchController.php

function P() {
    $i = 0;
    session(['count' => $i]);//set session variable
    $results = sqlQuery();//get rows from DB

    foreach ($results as $result) {

        if (regexFunction($result))
            $i++

        session(['count' => $i]);//update session variable

    }

    return response()->json('a bunch of stuff');
}

function R() {
    return response()->json(session('count'));//always returns 0
}
0
DB'nizdeki motor olarak innoDB kullanıyor musunuz?
katma yazar Daan, kaynak
DB'nizdeki motor olarak innoDB kullanıyor musunuz?
katma yazar Daan, kaynak
Bence, bulunan sonucu, şimdiye kadar bulunan toplam sonuçların sayısı ile birlikte geri vermelisiniz. Her ajax isteğinde bulunan toplam sonuçları tutabilir ve url ile geri gönderebilirsiniz; bu durumda denetleyiciniz daha önce bulunan toplam sonucu artı sonucu tekrar sayabilir ve tekrar birleştirilmiş sayıyı ajax ile iade olarak gönderebilirsiniz. Denetleyiciden dönen nesne, akım sayımının yanı sıra sonucu da tutmalıdır
katma yazar Anand G, kaynak
Bence, bulunan sonucu, şimdiye kadar bulunan toplam sonuçların sayısı ile birlikte geri vermelisiniz. Her ajax isteğinde bulunan toplam sonuçları tutabilir ve url ile geri gönderebilirsiniz; bu durumda denetleyiciniz daha önce bulunan toplam sonucu artı sonucu tekrar sayabilir ve tekrar birleştirilmiş sayıyı ajax ile iade olarak gönderebilirsiniz. Denetleyiciden dönen nesne, akım sayımının yanı sıra sonucu da tutmalıdır
katma yazar Anand G, kaynak
Bence, bulunan sonucu, şimdiye kadar bulunan toplam sonuçların sayısı ile birlikte geri vermelisiniz. Her ajax isteğinde bulunan toplam sonuçları tutabilir ve url ile geri gönderebilirsiniz; bu durumda denetleyiciniz daha önce bulunan toplam sonucu artı sonucu tekrar sayabilir ve tekrar birleştirilmiş sayıyı ajax ile iade olarak gönderebilirsiniz. Denetleyiciden dönen nesne, akım sayımının yanı sıra sonucu da tutmalıdır
katma yazar Anand G, kaynak
Sonuç sayısını kullanıcıya göstermek istiyorsanız, sadece dönüş satırlarını sayabilirsiniz ve ben de bunu kontrolörden dönüş parametrenizin bir parçası.
katma yazar Anand G, kaynak
Sonuç sayısını kullanıcıya göstermek istiyorsanız, sadece dönüş satırlarını sayabilirsiniz ve ben de bunu kontrolörden dönüş parametrenizin bir parçası.
katma yazar Anand G, kaynak
Sağol Anand, ama ne demek istediğini anlamadım. Yapmak istediğim senaryo hala işlenirken sonuç sayısını görüntülemek. Bunu bir çeşit ilerleme çubuğu olarak düşünebilirsiniz: komut dosyası tamamlanana kadar her x saniyede bir, kullanıcının zaten kaç sonuç bulunduğunu bilmesini istiyorum.
katma yazar SynRJ, kaynak
Sağol Anand, ama ne demek istediğini anlamadım. Yapmak istediğim senaryo hala işlenirken sonuç sayısını görüntülemek. Bunu bir çeşit ilerleme çubuğu olarak düşünebilirsiniz: komut dosyası tamamlanana kadar her x saniyede bir, kullanıcının zaten kaç sonuç bulunduğunu bilmesini istiyorum.
katma yazar SynRJ, kaynak
Sağol Anand, ama ne demek istediğini anlamadım. Yapmak istediğim senaryo hala işlenirken sonuç sayısını görüntülemek. Bunu bir çeşit ilerleme çubuğu olarak düşünebilirsiniz: komut dosyası tamamlanana kadar her x saniyede bir, kullanıcının zaten kaç sonuç bulunduğunu bilmesini istiyorum.
katma yazar SynRJ, kaynak
Doğru hatırlıyorsam, kendi depolama motoruna sahip olan PostgreSQL kullanıyorum.
katma yazar SynRJ, kaynak
Komut dosyası tamamen işlenene kadar gerçek sonuçları göndermek istemiyorum. Yapamadığım şey, güncellenmiş sayımı geri vermek. Büyük işlem betiğim, bir denetleyici değişkeni veya geçerli sayı ile bir oturum değişkeni güncelliyor ve ikinci betiğim (AJAX aracılığıyla her 5 saniyede bir) İle başlattım). Bu benim sorunum, 'her 5 saniyede bir' betiğim, 'büyük işlem komut dosyası' tarafından güncellenen değere nasıl erişebilir?
katma yazar SynRJ, kaynak
Komut dosyası tamamen işlenene kadar gerçek sonuçları göndermek istemiyorum. Yapamadığım şey, güncellenmiş sayımı geri vermek. Büyük işlem betiğim, bir denetleyici değişkeni veya geçerli sayı ile bir oturum değişkeni güncelliyor ve ikinci betiğim (AJAX aracılığıyla her 5 saniyede bir) İle başlattım). Bu benim sorunum, 'her 5 saniyede bir' betiğim, 'büyük işlem komut dosyası' tarafından güncellenen değere nasıl erişebilir?
katma yazar SynRJ, kaynak
Komut dosyası tamamen işlenene kadar gerçek sonuçları göndermek istemiyorum. Yapamadığım şey, güncellenmiş sayımı geri vermek. Büyük işlem betiğim, bir denetleyici değişkeni veya geçerli sayı ile bir oturum değişkeni güncelliyor ve ikinci betiğim (AJAX aracılığıyla her 5 saniyede bir) İle başlattım). Bu benim sorunum, 'her 5 saniyede bir' betiğim, 'büyük işlem komut dosyası' tarafından güncellenen değere nasıl erişebilir?
katma yazar SynRJ, kaynak

6 cevap

Burada farklı bir yaklaşım öneriyorum. İçeriği kızarma hakkında biraz daha bilgi edinin http://php.net/manual/tr/ref .outcontrol.php ve sonra onu kullanın.

Uzun lafın kısası, kızarma ile işlenen satır sayısını görüntülemek için sadece bir döngü sonucu yapabilir ve zaman zaman akabilir ya da tam bir sayı ya da satırda, AJAX'ın 5 saniyeye olan ihtiyacı giderilir. Küçük denenmemiş örnek:

$cnt = 0;
foreach($result as $key => $val) {
     //do your processing here
     if ($cnt % 100 == 0) {
          //here echo smth for flushing, you can echo some javascript, tough not nice
          echo "<script>showProcess({$cnt});</script>";
          ob_flush();
     }
}
// now render the proccessed full result

Ve showProcess JavaScript işlevinde istediğinizi yapın ... bir metindeki bazı jQuery değişimleri veya bazı grafiksel şeyler ...

İnşallah fast_cgi kullanmıyorsunuz, beacause çıktı tamponlama işlemini aktif hale getirmek için bazı önemli özellikleri devre dışı bırakmanız gerekiyor.

0
katma
Hmm, belki de saçma sapan söylüyorum ama süreç başladığında belki de sürecin iadesini bulabilirsin, her kullanıcı için bir metin dosyasında saklayabilirsin ya da smth sonra o dosyadan pid okuyan ve iş parçacığını öldüren bir ajax çağrısı yap. aniden ...? Zor değil ve güvenlik sorunları orada ortaya çıkabilir ...
katma yazar Cosmin, kaynak
Sonunda floş çalışması yapmayı başarırsam (aşağıdaki cevaba bakınız), kullanıcının işlemi yarıda kesmesini istiyorum (büyük işlemi durduran bir tür değişkeni güncellemek için AJAX çağrısı gerekiyordu) ). Yine de beni AJAX aramaları ile çözüme ihtiyacım olabilir, eğer o kısımla ilgili doğru yöne işaret edebilirseniz.
katma yazar SynRJ, kaynak

Burada farklı bir yaklaşım öneriyorum. İçeriği kızarma hakkında biraz daha bilgi edinin http://php.net/manual/tr/ref .outcontrol.php ve sonra onu kullanın.

Uzun lafın kısası, kızarma ile işlenen satır sayısını görüntülemek için sadece bir döngü sonucu yapabilir ve zaman zaman akabilir ya da tam bir sayı ya da satırda, AJAX'ın 5 saniyeye olan ihtiyacı giderilir. Küçük denenmemiş örnek:

$cnt = 0;
foreach($result as $key => $val) {
     //do your processing here
     if ($cnt % 100 == 0) {
          //here echo smth for flushing, you can echo some javascript, tough not nice
          echo "<script>showProcess({$cnt});</script>";
          ob_flush();
     }
}
// now render the proccessed full result

Ve showProcess JavaScript işlevinde istediğinizi yapın ... bir metindeki bazı jQuery değişimleri veya bazı grafiksel şeyler ...

İnşallah fast_cgi kullanmıyorsunuz, beacause çıktı tamponlama işlemini aktif hale getirmek için bazı önemli özellikleri devre dışı bırakmanız gerekiyor.

0
katma
Hmm, belki de saçma sapan söylüyorum ama süreç başladığında belki de sürecin iadesini bulabilirsin, her kullanıcı için bir metin dosyasında saklayabilirsin ya da smth sonra o dosyadan pid okuyan ve iş parçacığını öldüren bir ajax çağrısı yap. aniden ...? Zor değil ve güvenlik sorunları orada ortaya çıkabilir ...
katma yazar Cosmin, kaynak
Sonunda floş çalışması yapmayı başarırsam (aşağıdaki cevaba bakınız), kullanıcının işlemi yarıda kesmesini istiyorum (büyük işlemi durduran bir tür değişkeni güncellemek için AJAX çağrısı gerekiyordu) ). Yine de beni AJAX aramaları ile çözüme ihtiyacım olabilir, eğer o kısımla ilgili doğru yöne işaret edebilirseniz.
katma yazar SynRJ, kaynak

Burada farklı bir yaklaşım öneriyorum. İçeriği kızarma hakkında biraz daha bilgi edinin http://php.net/manual/tr/ref .outcontrol.php ve sonra onu kullanın.

Uzun lafın kısası, kızarma ile işlenen satır sayısını görüntülemek için sadece bir döngü sonucu yapabilir ve zaman zaman akabilir ya da tam bir sayı ya da satırda, AJAX'ın 5 saniyeye olan ihtiyacı giderilir. Küçük denenmemiş örnek:

$cnt = 0;
foreach($result as $key => $val) {
     //do your processing here
     if ($cnt % 100 == 0) {
          //here echo smth for flushing, you can echo some javascript, tough not nice
          echo "<script>showProcess({$cnt});</script>";
          ob_flush();
     }
}
// now render the proccessed full result

Ve showProcess JavaScript işlevinde istediğinizi yapın ... bir metindeki bazı jQuery değişimleri veya bazı grafiksel şeyler ...

İnşallah fast_cgi kullanmıyorsunuz, beacause çıktı tamponlama işlemini aktif hale getirmek için bazı önemli özellikleri devre dışı bırakmanız gerekiyor.

0
katma
Hmm, belki de saçma sapan söylüyorum ama süreç başladığında belki de sürecin iadesini bulabilirsin, her kullanıcı için bir metin dosyasında saklayabilirsin ya da smth sonra o dosyadan pid okuyan ve iş parçacığını öldüren bir ajax çağrısı yap. aniden ...? Zor değil ve güvenlik sorunları orada ortaya çıkabilir ...
katma yazar Cosmin, kaynak
Sonunda floş çalışması yapmayı başarırsam (aşağıdaki cevaba bakınız), kullanıcının işlemi yarıda kesmesini istiyorum (büyük işlemi durduran bir tür değişkeni güncellemek için AJAX çağrısı gerekiyordu) ). Yine de beni AJAX aramaları ile çözüme ihtiyacım olabilir, eğer o kısımla ilgili doğru yöne işaret edebilirseniz.
katma yazar SynRJ, kaynak

PHP sınırlamaları olan bir duvara çarptığına inanıyorum. PHP çok okunmaz, pekala. Etkileşim düzeyini elde etmek için muhtemelen oturum dosyalarını doğrudan düzenlemeniz gerekir, bunun yolu session.save_path global'de php_info() aracılığıyla bulunabilir ve bu yolu session_save_path (String) . Bu kullanım tavsiye edilmese de, riski size aittir.

Alternatif olarak, bilgisayarınızda/sunucunuzda bir yerde depolanan ve bunları oturum dosyalarına benzer şekilde tanımlayan bir JSON TXT dosyası kullanın.

Sorgunun geçerli ilerlemesini bir dosyaya ve işlemin kullanıcı tarafından yarıda kesilmiş olup olmamasına da kaydetmelisiniz. Sonuç kümesi üzerinde yinelemeye devam etmeden önce kesme biti/boole durumunun kontrolü yapılmalıdır.

Eşzamanlılık dikkate alındığında sorun ortaya çıkar, ya boolean sayım dizisinden hemen önce veya aynı zamanda sayım dizisi olarak düzenlenirse? Belki de diğer script mesajı alana kadar dosyayı yarıda kesmeye devam edebilirsiniz. Ancak bu zarif bir çözüm değil.

Bu çözüm aynı anda aynı kullanıcı tarafından sorulan sorgulara da izin vermiyor. Buna karşı koymak için, bir şeylerin çalışıp çalışmadığını belirlemek için oturum dosyasında ek bir kontrol yapılmalıdır. Kullanıcıyı bilgilendirmek için bir hata işaretlenmelidir.

Seçenek göz önüne alındığında, şahsen ben JSP veya ASP.NET kodu yeniden yazmak istiyorum

Sonuçta bu, güvenilmez bir özellik için çok fazla iş.

0
katma

PHP sınırlamaları olan bir duvara çarptığına inanıyorum. PHP çok okunmaz, pekala. Etkileşim düzeyini elde etmek için muhtemelen oturum dosyalarını doğrudan düzenlemeniz gerekir, bunun yolu session.save_path global'de php_info() aracılığıyla bulunabilir ve bu yolu session_save_path (String) . Bu kullanım tavsiye edilmese de, riski size aittir.

Alternatif olarak, bilgisayarınızda/sunucunuzda bir yerde depolanan ve bunları oturum dosyalarına benzer şekilde tanımlayan bir JSON TXT dosyası kullanın.

Sorgunun geçerli ilerlemesini bir dosyaya ve işlemin kullanıcı tarafından yarıda kesilmiş olup olmamasına da kaydetmelisiniz. Sonuç kümesi üzerinde yinelemeye devam etmeden önce kesme biti/boole durumunun kontrolü yapılmalıdır.

Eşzamanlılık dikkate alındığında sorun ortaya çıkar, ya boolean sayım dizisinden hemen önce veya aynı zamanda sayım dizisi olarak düzenlenirse? Belki de diğer script mesajı alana kadar dosyayı yarıda kesmeye devam edebilirsiniz. Ancak bu zarif bir çözüm değil.

Bu çözüm aynı anda aynı kullanıcı tarafından sorulan sorgulara da izin vermiyor. Buna karşı koymak için, bir şeylerin çalışıp çalışmadığını belirlemek için oturum dosyasında ek bir kontrol yapılmalıdır. Kullanıcıyı bilgilendirmek için bir hata işaretlenmelidir.

Seçenek göz önüne alındığında, şahsen ben JSP veya ASP.NET kodu yeniden yazmak istiyorum

Sonuçta bu, güvenilmez bir özellik için çok fazla iş.

0
katma

PHP sınırlamaları olan bir duvara çarptığına inanıyorum. PHP çok okunmaz, pekala. Etkileşim düzeyini elde etmek için muhtemelen oturum dosyalarını doğrudan düzenlemeniz gerekir, bunun yolu session.save_path global'de php_info() aracılığıyla bulunabilir ve bu yolu session_save_path (String) . Bu kullanım tavsiye edilmese de, riski size aittir.

Alternatif olarak, bilgisayarınızda/sunucunuzda bir yerde depolanan ve bunları oturum dosyalarına benzer şekilde tanımlayan bir JSON TXT dosyası kullanın.

Sorgunun geçerli ilerlemesini bir dosyaya ve işlemin kullanıcı tarafından yarıda kesilmiş olup olmamasına da kaydetmelisiniz. Sonuç kümesi üzerinde yinelemeye devam etmeden önce kesme biti/boole durumunun kontrolü yapılmalıdır.

Eşzamanlılık dikkate alındığında sorun ortaya çıkar, ya boolean sayım dizisinden hemen önce veya aynı zamanda sayım dizisi olarak düzenlenirse? Belki de diğer script mesajı alana kadar dosyayı yarıda kesmeye devam edebilirsiniz. Ancak bu zarif bir çözüm değil.

Bu çözüm aynı anda aynı kullanıcı tarafından sorulan sorgulara da izin vermiyor. Buna karşı koymak için, bir şeylerin çalışıp çalışmadığını belirlemek için oturum dosyasında ek bir kontrol yapılmalıdır. Kullanıcıyı bilgilendirmek için bir hata işaretlenmelidir.

Seçenek göz önüne alındığında, şahsen ben JSP veya ASP.NET kodu yeniden yazmak istiyorum

Sonuçta bu, güvenilmez bir özellik için çok fazla iş.

0
katma