1

大量のトラフィックを処理するときに、Apache サーバーに問題があります。私が行ったいくつかの最適化の後。私はまだ同じ問題を抱えています。ログファイルを確認したところ、大量の PHP 処理が行われていることがわかりました。次のコードは、1 分間に約 800 回処理され (トラフィックが多い場合)、サーバーがクラッシュします。

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');
        }

?>
4

2 に答える 2

3

重要な要素はFacebook APIへの呼び出しだと思います。そのようなものは常に高価で、簡単にキャッシュできます。そのコードを別のページに配置/インクルードして、好きなようにキャッシュします。

また、補足として、dbクエリの数を減らすことを検討する必要があり、dbドライバーを更新することをお勧めします...常に誰もが@Madara Uchihaを指摘しているように

于 2012-10-11T22:12:36.817 に答える
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'");

結果を1つだけ戻す必要がある場合は、最後に「LIMIT 1」を付けます(このフィールドにUNIQUEインデックスがある場合を除きます。この場合、これは重要ではありません)。また、このフィールドにインデックスが付けられていることを確認してください。できれば、TEXTやBLOBではなくVARCHARフィールドを使用してください。

次に、2つのクエリを実行して、前の画像と次の画像を取得します。これを次のように1つのクエリに結合します。

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

また、私が言及した最初の最適化をこれら2つのクエリに適用できます。

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を使用すると、多くのことを実行できない読み込み時間が追加されます。うまくいけば、これで正しい道を歩み始めることができます。

于 2012-10-11T22:14:29.000 に答える