Nasıl uzun soluklu MySQL sorguları için beklerken PHP betikleri incelikle aşımı yapabilir?

3 Cevap php

Ben veritabanı sorguları oldukça çok çalışan bir PHP sitesi var. Parametrelerin belirli kombinasyonları ile, bu sorgular çirkin bir zaman aşımı tetikleyici mesaj, uzun süre çalışan sona erebilir. Ben benim site tarzı kalanına göre temalı güzel bir zaman aşımı mesajı ile değiştirmek istiyor.

Sorusuna bu tür olağan cevapları öngörmek:

  1. Ben uzun süre çalışan sorguları günlük ve onları optimize ediyorum, ancak bir kullanıcı etkilenen sonra ben sadece bu biliyorum - "bu kadar uzun süre koşmak kalmazsınız sorguları optimize".

  2. "Uzun süre çalışan sorgunun bitirmek böylece PHP zaman aşımı ayarı (örneğin set_time_limit, max_execution_time) artırın" - Bazen sorgu birkaç dakika çalıştırabilirsiniz. Ben (30 saniye sonra örneğin) daha önce bir sorun var kullanıcı söylemek istiyorum.

  3. "Uzun komut çalışan edilmiştir nasıl izlemek için register_tick_function kullanın" - Bu, yalnızca benim komut kod satırları arasında idam olur. Komut veritabanından bir yanıt beklerken, kene fonksiyon denir almaz.

Durumda sitesi (özelleştirme sürü) Drupal kullanılarak inşa edilmiş, yardımcı olur, ve MySQL 5 ile PHP 5.2 üzerinde bir sanal özel Linux sunucu üzerinde çalışıyor.

3 Cevap

Hiçbir asenkron mysql aramaları ve hafif konuları forking için kapsam vardır.

Eğer iki katman halinde PHP kod bölmek ve uyumsuz çağırabilirsiniz aralarında bir bağlantı kullanmak olsa da, bu yaklaşımla sorun, üst kademe geri sonuçlarını almaktan vazgeçtiğini sonra DB katman hala sorguyu çalıştırmayı deneyin olacaktır - potansiyel olarak diğer kullanıcılar için DBMS engelleme. (Eğer zaman aşımına sayfalarda daha sık isteklerini elde etmek için daha olasıdır).

Eğer web sunucusu önünde oturan bir ters proxy içine işleme aşımı itmek eğer aynı sorun olacak.

Zaman aşımı uygulamak için en mantıklı yer veritabanının kendisi - ama AFAIK, mysql bu desteklemiyor.

Yani bir sonraki seçenek PHP ve veritabanı arasında bir vekil inşa - bu kendi kendine yeten olabilir - her istek için 2 lighweight Konuları (çok uzun sürerse 1 ilk öldürmek için bir bekçi köpeği olarak 2 sorguyu çalıştırmak için) üreten - ama bu hafif konuları destekleyen bir lnaguage kod yazma, aynı zamanda PHP ile iletişim için bir protokol tanımlayan sadece gerektirir.

Ancak vekil modeline farklı bir yaklaşım Taking - Sen proc_open kullanarak ayrı bir PHP işlem spawn ve engellenmeyen olmak stdout akışı ayarlayabilirsiniz - bu şekilde PHP çalıştırmak ve devam vekil sorguyu çalıştırın olup olmadığını görmek için kontrol edebilirsiniz. Zaman aşımı, sonra vekil ebeveyn olarak, bu veritabanı üzerinde çalışan sorguyu durdurmak gerekir kapatma (proc_terminate ()) için sinyal edebilirsiniz.

Elbette, bu gelişme bir sürü iş demek oluyor.

Bu karşı yavaş sorguları çalıştırmak için bir veya daha fazla köle DBMS kurmak çok basit çıkabilir - potansiyel akıllı yük dengelemesi ile. Ön konsolidasyon gibi - ya da yavaş sorguları hızlı gitmek yapmanın başka yollarını aramalıyız.

HTH

C.

Sunucu APC ile ayarlanmış, Memcache, Boost ve Drupal Önbellek? Bu iş çok iyi alternatif yolları vardır.

Aksi takdirde, komut ne tür bu neden olacağını Drupal çalışan? Sadece meraktan soruyorum, sen Görüntüleme ve Panelleri yayınlanıyor?

connection handling docs neye ihtiyacınız vardır.

Temel olarak, register_shutdown_function() kullanarak bir kapatma işlevi kaydetmeniz gerekir. Bu fonksiyon, bir komut dosyası tamamlandığında her ne olursa olsun başarıyla tamamlandığını olsun, kullanıcı (ESC tuş) tarafından iptal edildi, adı verilecek, ya da zaman aşımına uğradı.

Bu kapatma işlevi sonra connection_status() işlevini çağırabilirsiniz. Connection_status () 2 (ZAMAN AŞIMI) döner ve önceki sayfa zahmetli sorgu çalışır biri olsaydı, "Sorry, but we're experiencing high server load right now." veya ne olursa olsun diyerek bir sayfaya kullanıcıyı yönlendirebilirsiniz.