Accelerarea încărcării imaginilor de la DB

Încărc 9 imagini dintr-o bază de date și sintaxa mea arată cam așa:


PHP-ul meu pentru image_loader.php arata astfel:

<?php
    /* I set up my connection using mysql_connect and mysql_select_db */

    $query = sprintf("SELECT ... FROM ... WHERE id='".$_GET["id"]."'");
    $result = mysql_query($query, $con);
    mysql_close($con);

    if (!$result) {
       //no result
    }
    else {
        $row = mysql_fetch_row($result); 
        header('Content-type: image/png');
        echo $row[0];
        mysql_free_result($result);
        }
?>

Fiecare imagine este de aproximativ 10-13k, dar banda pare să se încarce foarte lent. Îmi dau seama că există un număr de cereri pe care un browser le poate executa la un moment dat, dar timpul de așteptare pare să fie gratuit.

Orice sugestii despre cum să obțineți imagini încărcate dintr-o bază de date rapid?

De asemenea, aceasta este aproape o întrebare separată, însă este posibil să instruiți un browser (sau un server) să cacheze imagini cu acum .gif/.png/.jpg srcs? Se pare că Firefox face și Chrome nu, dar nu sunt sigur de asta.

enter image description here

0
Dacă antetul cache este setat corect și adresa URL nu se modifică, imaginile ar trebui să fie stocate în cache. Dacă problema dvs. se referă la lățimea de bandă și trimiteți frecvent aceleași imagini, luați în considerare combinarea acestora astfel încât să existe o singură interogare pe server (într-adevăr depinde de imagini, deși plătește pentru o duzină de imagini mici, de exemplu).
adăugat autor Denys Séguret, sursa
Asta este adevărat, dar acest lucru nu ar trebui să fie măcar într-un astfel de caz (pentru o bază de date normală).
adăugat autor Denys Séguret, sursa
@ unitate ar trebui să adăugați eu sunt de operare pe o mașină partajată pe DreamHost. Ceea ce codific mai mult sau mai puțin necesită stocarea imaginilor într-o bază de date, presupun că, în cele din urmă, dacă nu pot obține această tăiere de întârziere, ar putea fi necesar să ia în considerare salvarea fișierelor, dar aș vrea să o evit dacă deloc posibil. Creează un alt nivel de complexitate.
adăugat autor vpiTriumph, sursa
Mă întreb dacă aceasta este rădăcina problemei mele. DreamHost își păstrează serverele MySQL separate de serverele lor web pe help .
adăugat autor vpiTriumph, sursa
@jedward ceea ce am determinat în cele din urmă este că DreamHost este lent pentru MySQL (multe dintre acestea se datorează faptului că db nu este pe același server ca hostingul) și rezultatul este că multe cadre, de exemplu Drupal, că executa o multime de interogari ruleaza lent ... lent ... lent ... am putut sa rezolv problema mea prin salvarea imaginilor intr-un folder in loc de in baza mea de date. Dacă doriți să introduceți un răspuns care să atingă unele dintre sugestiile dvs., vă voi oferi punctele pentru aceasta!
adăugat autor vpiTriumph, sursa
Este posibil ca browserul dvs. să nu cacheze imaginile, deoarece acestea au șiruri de interogare, ar putea lua în considerare conectarea la ceva precum image_loader \ 4.jpg și utilizarea rescrierii URL-ului. Ați putea, de asemenea, să "dați" imaginile așa cum sugerează dystroy folosind o tehnică similară celei pe care o schițează aici .
adăugat autor jedwards, sursa
De asemenea, aș lua în considerare dacă stocarea imaginilor într-o bază de date face cel mai mult sens. Este posibil ca, dar ar trebui să fie serios considerat ca oferind fiecărei imagini un nume unic de fișier în sistemul de fișiere și stocarea în baza de date va fi adesea mai rapidă. Veți câștiga viteză suplimentară dacă ați putea solicita fișierul direct de la client, spre deosebire de solicitarea unui script generic PHP care face un
adăugat autor jedwards, sursa
Pentru o bază de date locală, sunt de acord, diferența ar fi probabil foarte mică. Dar pentru o bază de date pe o mașină separată, în special un server de baze de date partajate (acest aranjament este comun cu unele gazde acum, GoDaddy, etc), am putut observa diferitele întârzieri în asociere.
adăugat autor jedwards, sursa
@vpiTriumph, este numele de gazdă în funcția mysql_connect() localhost sau altceva? (Dacă altceva, ce anume nu contează). Dacă nu este localhost, aș sugera instrumentarea codului image_loader.php cu timestamps pentru a găsi întârzierea? Cred că va fi în interogatoriu.
adăugat autor jedwards, sursa
Fericit ai fost în măsură să găsească o muncă în jur și fericit că a ajutat. :-)
adăugat autor jedwards, sursa

1 răspunsuri

Mai întâi am să văd dacă stocarea imaginilor într-o bază de date are cel mai mult sens. Este posibil ca, dar ar trebui să fie serios considerat ca oferind fiecărei imagini un nume unic de fișier în sistemul de fișiere și stocarea care în baza de date va fi adesea mai rapidă.

Veți câștiga viteză suplimentară dacă ați putea solicita acel fișier direct de la client, spre deosebire de solicitarea unui script generic PHP care face un fel de fopen() code> -style abstraction.

Pentru a restrânge sursa întârzierii, este mai întâi util să verificați dacă baza de date este găzduită pe același server ca serverul dvs. Web. O indicație că nu este găzduită local, dar pe un server de baze de date la distanță este de a verifica șirul gazdă pe care îl furnizați în apelul mysql_connect() . localhost i-ar sugera locală, altceva ar sugera că nu este. Ca o notă, multe servicii găzduite partajate (de exemplu, GoDaddy) și-au împărțit serverul de baze de date de la serverul de web.

Pentru o idee mai bună despre sursa întârzierii, vă sugerăm să instrumentați codul image_loader.php cu marcajele de timp pentru a găsi întârzierea? Cred că va fi în interogatoriu.

Dacă întârzierea este în interogarea dvs., veți dori să limitați numărul de interogări pe care le faceți. O strategie care vă permite să efectuați o interogare în loc de 9 ar limita impactul întârzierii oricărui server web-server la baza de date.

0
adăugat
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT