2012-10-11 38 views
1

我在處理大量流量時遇到了與我的apache服務器有關的問題。經過一些優化我做到了。我仍然有同樣的問題。我檢查我的日誌文件,結果證明我有很多的PHP處理。下面的代碼每分鐘處理大約800次(當我有很高的流量時),並封鎖我的服務器崩潰。優化php代碼以減少php處理

1)是否有我需要重寫的代碼的任何部分,這將使其處理更少的PHP? 2)在html開始之前將所有這些代碼都設置好是個好主意嗎?

<?php 
$ip = $_SERVER['REMOTE_ADDR']; 
mysql_connect('', '', ''); 
mysql_select_db(''); 

if(empty($_GET['i']) == false){ 
    $get_image = mysql_real_escape_string($_GET['i']); 
    $check_if_image = mysql_query("SELECT `id`, `image_name`, `image_type`, `image_caption`, `image_voteup`, `image_votedown`, `image_views`, `fb_userid` FROM images_new WHERE image_name = '$get_image'"); 
    if(mysql_num_rows($check_if_image) == 1){ 
     $result = mysql_fetch_assoc($check_if_image); 
     $image_id = $result['id']; 
     $image_name = $result['image_name']; 
     $image_type = $result['image_type']; 
     $image_caption = stripslashes($result['image_caption']); 
     $image_voteup = $result['image_voteup']; 
     $image_votedown = $result['image_votedown']; 
     //$image_date = $result['image_date']; 
     $image_views = $result['image_views']; 
     $fb_username = $result['fb_username']; 
     $fb_userid = $result['fb_userid']; 

     //next image 
     $next_image_id = $image_id + 1; 
     $check_next_image = mysql_query("SELECT `image_name` FROM images_new WHERE id = '$next_image_id'"); 
     if(mysql_num_rows($check_next_image) == 1){ 
      $next_image_result = mysql_fetch_assoc($check_next_image); 
      $next_image_name = $next_image_result['image_name']; 
      } 
     // pre image 
     $pre_image_id = $image_id - 1; 
     $check_pre_image = mysql_query("SELECT `image_name` FROM images_new WHERE id = '$pre_image_id'"); 
     if(mysql_num_rows($check_pre_image) == 1){ 
      $pre_image_result = mysql_fetch_assoc($check_pre_image); 
      $pre_image_name = $pre_image_result['image_name']; 
      } 
     //shares, comments, and likes 
     $fb_page_url = "http://www.xxx.com/images.php?i=".$get_image; 
     $fb_url = "http://api.facebook.com/restserver.php?method=links.getStats&urls=".urlencode($fb_page_url); 
     $fb_xml = file_get_contents($fb_url); 
     $fb_xml = simplexml_load_string($fb_xml); 
     $fb_shares = $fb_xml->link_stat->share_count; 
     $fb_likes = $fb_xml->link_stat->like_count; 
     $fb_likes_and_shares = $fb_likes + $fb_shares; 
     $fb_comments = $fb_xml->link_stat->commentsbox_count; 


     //facebook 
     require_once('scripts/facebook.php'); 
     $config = array('appId' => '','secret' => ''); 
     $params = array('scope'=>'user_likes,publish_actions,email,offline_access,user_birthday'); 
     $facebook = new Facebook($config); 
     $user = $facebook->getUser(); 

     if($user){ 
      try{ 
      $user_profile = $facebook->api('/me','GET'); 
      $user_id = $user_profile['username']; 
      $expire_time = time() + 30758400; 


      //insert cookie id 
      if (!isset($_COOKIE['id'])){ 
       $cookie_id = $user_profile['username']; 
       setcookie("id", $cookie_id, $expire_time, '/'); 
       } 
      //insert cookie name 
      if (!isset($_COOKIE['name'])){ 
       $user_name = $user_profile['first_name']; 
       setcookie("name", $user_name, $expire_time, '/'); 
       } 

      //check if the user like the fan page 
      $isFan = $facebook->api(array(
      "method" => "pages.isFan", 
      "page_id" => '' 
      )); 


      }catch(FacebookApiException $e) { 
         error_log($e->getType()); 
         error_log($e->getMessage()); 
     } 
      }else{//if no user 
       if(isset($_COOKIE['name'])){ 
       $user_name = $user_profile['first_name']; 
       setcookie("name", $user_name, time() - 30758400, '/'); 
        } 
       } 

      //increase views 
      if($facebook->getUser()){ 
      mysql_query("UPDATE images_main SET image_views = image_views + 1 WHERE image_name='$image_name'"); 
      mysql_query("UPDATE images_new SET image_views = image_views + 1 WHERE image_name='$image_name'"); 
      } 


}else{//image was not found in the database. 
      header('Location: index.php'); 
      } 
    }else{//redirect if get is empty 
     header('Location: index.php'); 
     } 

?> 
+0

該數據多久改變一次?它可以被緩存嗎? –

+0

雖然並不是所有的東西 - 我會說你會從memcached等某種形式的緩存中獲益。你如何運行PHP作爲一個Apache模塊或CGI二進制文件與自己的過程? – exussum

+0

我不更改代碼本身。但是頁面的內容會根據網址動態變化。 – user1481850

回答

3

我想說的關鍵因素是你的Facebook的API調用,這樣的事情總是昂貴且容易緩存,把這些代碼在一個單獨的頁/包括和緩存它,只要你喜歡。

另外,作爲一個側面說明,您應考慮減少數據庫查詢的數量,你可能希望更新您的DB驅動程序......爲大家不約而同地指出@Madara宇智波

2

我看到的幾個項目馬上球棒。

首先查詢:

$check_if_image = mysql_query("SELECT `id`, `image_name`, `image_type`, `image_caption`, `image_voteup`, `image_votedown`, `image_views`, `fb_userid` FROM images_new WHERE image_name = '$get_image'"); 

如果你只需要一個結果返回,把「LIMIT 1」,然後在結束(除非該領域具有獨特的指數,在這種情況下,這不應該的問題)。還要確保此字段已編入索引,最好是VARCHAR字段而不是TEXT或BLOB。

接下來,您正在運行2個查詢以獲取上一張和下一張圖像。我將結合這爲1次這樣的查詢:

SELECT `image_name` FROM images_new WHERE id IN ('$next_image_id', '$pre_image_id') 

此外,您還可以申請第一個優化我提到的這兩個疑問:

if($facebook->getUser()){ 
     mysql_query("UPDATE images_main SET image_views = image_views + 1 WHERE image_name='$image_name'"); 
     mysql_query("UPDATE images_new SET image_views = image_views + 1 WHERE image_name='$image_name'"); 
} 

最後,會通過Facebook的API將會增加加載時間,你不能做太多。希望這能讓你開始走上正確的道路。

+0

你是對的。我的方式不如預期:-) –