服务器负载问题

时间:2011-06-24 20:30:01

标签: php mysql

我在我的服务器中遇到了一个高负载,我检查了所有代码,所有这些都没问题,但我不确定它是(多列)代码。

我用这个

$getpics = mysql_query("select id,image_thumb from pics order by id desc limit 0,10");  

while ($result = mysql_fetch_assoc($getpics)) {         
$data1[] = $result;        
}        
$data1 = array_chunk($data1, 5);        
echo '<table width="100%"  border="0" cellpadding="5">';
foreach ($data1 as $row1) {         
echo '<tr>';        
foreach ($row1 as $column1) {

echo  '
<td align="center">
<div class="imagepic">
'.$column1[image_thumb].'
</div>
</td>
';
}        
echo  '</tr>';
}        
echo '</table>'; 

mysql_free_result($getpics);  

所以现在让我感到困惑的是代码在我的网站上加载。

问候

4 个答案:

答案 0 :(得分:1)

您可以缓冲输出,而不是写出每一行。

$buf = "<table width="100%"  border="0" cellpadding="5">";
foreach ($data1 as $row1) {         
 $buf .= "<tr>";        
 foreach ($row1 as $column1) {
  $buf .= "<td align='center'>";
  $buf .= "<div class='imagepic'>";
  $buf .= $column1[image_thumb];
  $buf .= "</div></td>";
 }        
 $buf .= "</tr>";
}     
$buf .= "</table>";   
echo  $buf;

嵌套for循环可能也无济于事。按名称或索引直接访问列可能会更快。

答案 1 :(得分:1)

我冒昧地做了一些修改。我删除了一个循环,摆脱了array_chunk和其他一些循环。我真的没有看到太多错误,所以问题很可能出现在其他问题上,但请告诉我。

$getpics = mysql_query("select id,image_thumb from pics order by id desc limit 0,10"); 

$out = '<table width="100%"  border="0" cellpadding="5">'; // Use a string and concat
$i = 0;
while ($row = mysql_fetch_assoc($getpics)) { // No need to loop twice. Once is fine,
    if(!($i%5))$out .= '<tr>';
    $out .= '<td align="center">
            <div class="imagepic">
            '.$row['id']. /*Do you REALLY want ID? That's what foreach will give you*/ '
            </div>
        </td>
        <td align="center">
            <div class="imagepic">
            '.$row['image_thumb'].'
            </div>
        </td>';
    $i++;
    if(!($i%5))$out .= '</tr>'; // Inner loop removed. You're only selecting two columns!
}       
if(($i%5))$out .= '</tr>'; // close the last row.
echo $out.'</table>'; 

mysql_free_result($getpics);  

显然在使用之前检查错误。

答案 2 :(得分:0)

您可以缓冲输出,但PHP脚本不是此处的阻止程序。 MySQL可能也不应该,因为你有一个LIMIT设置。

您可以在该查询上运行DESCRIBE SELECT并报告加载时间吗?其他页面也在主机上加载不好吗?

答案 3 :(得分:0)

php本身不会导致任何负载问题,除非你在这里展示的代码之外发生了巨大的事情。

通常你的查询是瓶颈,尝试在你的查询上运行解释,例如。在phpmyadmin或mysql命令行等工具中EXPLAIN SELECT ...,然后在此处发布输出。

你的查询非常简单,因为你在id(主键,我假设自动增量)上订购,问题不太可能是mysql索引。

如果查询导致问题,请检查索引(可以在id,image_thumb上创建索引),请参阅http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html,或使用memcached作为结果集的临时缓存引擎。