Çıktı tamponlama ve PHP 5 büyük MySQL sonuç kümeleri

3 Cevap php

Ben, koskocaman bir tablo ile neredeyse 4k kayıtları bir veritabanından bir XML besleme oluşturmak çalışıyorum. Ben XML tükürmek almak için çıktı tamponlama kullanmak istiyorum ama senaryo yine aşımından devam ediyor.

ob_start();
$what = 'j.*, (select description from tb_job_type as jt WHERE jt.jobtype_id =  j.job_type_id) as job_type,';
$what .= '(select description from tb_location as l WHERE l.location_id = j.location_id) as location,';
$what .= '(select description from tb_industry as i WHERE i.industry_id = j.industry_id) as industry';
$where = ('' != $SelectedType) ?  'j.job_ad_type="' . $SelectedType .'"' : '';
$process = $db->executeQuery('SELECT ' . $what . ' FROM tb_job_ad as j' . $where);

while($result = mysql_fetch_array($process))
{
    $result['job_title_url']        = $form->urlString($result['job_title']);
    $result['job_title']            = htmlspecialchars($result['job_title'], ENT_QUOTES, 'UTF-8');
    $result['short_description']    = htmlspecialchars($result['short_description'], ENT_QUOTES, 'UTF-8');
    $result['full_description']     = htmlspecialchars($result['full_description'], ENT_QUOTES, 'UTF-8');
    $result['company_name']         = ucwords(strtolower($result['company_name']));
    $tpl->assignToBlock('ITEMS', $result);
}
$cheese = ob_get_contents();    
$actualize = $tpl->actualize('FEED');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" );
header("Cache-Control: no-cache, must-revalidate" );
header("Pragma: no-cache" );
header("Content-type: text/xml");
echo $actualize;
ob_flush();
print $cheese;
ob_end_clean();

Bu komut jikleyi yapan çizgi gibi görünüyor:

$tpl->assignToBlock('ITEMS', $result);

Lütfen yardım?

Teşekkürler

Midiane.

3 Cevap

Could it be that you have a rather slow query?
Compare the output of

set_time_limit(60);
$process = $db->executeQuery('EXPLAIN SELECT ' . $what . ' FROM tb_job_ad as j' . $where);
while($result = mysql_fetch_array($process, MYSQL_ASSOC)) {
  echo join(' | ', $result), "<br />\n";
}

ile Optimizing Queries with EXPLAIN.

Sen (0) script herhangi bir zaman aşımı olmadan sonsuza kadar çalıştırmak ve yürütme tamamlanana kadar beklemek için izin set_time_limit kullanabilirsiniz.

Sorgu yavaş olduğu için zaman aşımı kesinlikle oluyor - ve neredeyse kesinlikle endeksli sağ sütunlar var emin, ve bazı Joın yaparak performansınız artırabilirsiniz.

Eğer yeniden yazdım eğer böyle inşaat sorgulamak Ne:

$q = 'SELECT 
  j.*, 
  jt.description as job_type, 
  l.description as location, 
  i.description as industry
FROM tb_jobs AS j
INNER JOIN tb_job_type AS jt ON j.job_type_id = jt.jobtype_id 
INNER JOIN tb_location AS l ON j.location_id = l.location_id
INNER JOIN tb_industry AS i ON j.indsutry_id = i.industry_id';

if (! empty($SelectedType)){
  $where = "WHERE j.job_ad_type = '$SelectedType'";
}else{
  $where = '';
}

$q .= $where;

Tüm yabancı anahtarlar sütunlar (j.location_id, vb) endeksli olduğundan emin olun.

If you want output to start sooner, you'll want to - Query the database - Output all your headers, etc. - write you while loop like:

ob_end_flush();flush();
while($row = mysql_fetch_assoc($process)
{
  ob_start();
  //build your ITEM and echo it here
  ob_end_flush(); flush();
}

PS: Ben de burada SO senin başka bir SQL-İlgili soruyu fark ettim. Ben çok iyi bir SQL nasıl çalıştığını daha iyi bir anlayış kazanarak hizmet olacağını düşünüyorum. Ben son derece "SLQ Clearly Explained" bir kopyasını almak tavsiye - bu başlık vaat tam olarak ne sunuyor - SQL net bir açıklama (genel olarak, çeşitli uygulamaları tartışırken saplanmadan)