2

私は毎日phpスクリプトを実行する必要があります。コードは次のとおりです。

<?php
// SET PROCESS PRIORITY

// SETTING UP THE LOG FILE
$ob_file = fopen('sync.log','w');

function ob_file_callback($buffer)
{
  global $ob_file;
  fwrite($ob_file,$buffer);
}


ob_start('ob_file_callback');

// GET PARAMETERS
$lastid=$_GET['lastid'];
    if ($lastid && !is_numeric($lastid)){
        die("Loser");
    }

// SERVER ROOT CONFIGURATION
$serverpath = 'http://dev.xxx.com/ops/';

// FACEBOOK SDK
require '../classes/facebook.php';
require '../classes/fbconfig.php';


// MYSQL CONFIG
include('../dbconfig.php');

// OPEN DATABASE CONNECTION $CON


$con = mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname, $con);


// GET LAST ID FROM DATABASE AND COUNT TO ZERO
// ONLY 10 PER TIMES
$sql = "SELECT * FROM ops_pictures
ORDER BY id DESC
LIMIT 10;";

$query = mysql_query($sql,$con);

while($row = mysql_fetch_array($query)) {

    if (!$lastid){  
        $lastid = $row['id'];
    }
}

//START COUNTING
for ($i = $lastid; $i >= 0 ; $i --)
    {

// set_time_limit(); // RESET TIMEOUT TO GO FOREVER

echo $i .' - ';

// LOAD RECORDS FROM FACEBOOK AND DISPLAY THE PHOTO URL

// Get User ID
$user = $facebook->getUser();

// Login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
  $loginUrl = $facebook->getLoginUrl(
   array(
    'scope'      => 'email,offline_access,user_likes,read_stream,publish_stream,user_about_me,user_photos'
    )
 );
};

// FQL QUERY FOR THE PICTURE
$actualurl = $serverpath . 'photo.php?pid=' . $i;
//echo $actualurl;

try {
        $fql = 'SELECT url, normalized_url, share_count, like_count, comment_count, total_count,
commentsbox_count, comments_fbid, click_count FROM link_stat WHERE url="'.$actualurl.'"';
        $ret_obj = $facebook->api(array(
                                   'method' => 'fql.query',
                                   'query' => $fql,
                                 ));

        // FQL queries return the results in an array, so we have
        //  to get the user's name from the first element in the array.
        $linkstat = $ret_obj[0];

        $theurl = $linkstat['url'];
        $sharecount = $linkstat['share_count'];
        $likecount = $linkstat['like_count'];
        $commentcount = $linkstat['comment_count'];
        $totalcount = $linkstat['total_count'];

      } catch(FacebookApiException $e) {
        // If the user is logged out, you can have a 
        // user ID even though the access token is invalid.
        // In this case, we'll get an exception, so we'll
        // just ask the user to login again here.
        $login_url = $facebook->getLoginUrl(); 
        echo 'Please <a href="' . $login_url . '">login.</a>';
        error_log($e->getType());
        error_log($e->getMessage());
      }   




// PUT THE RECORDS IN
$sql = "UPDATE ops_pictures SET likecount='$likecount', sharecount='$sharecount', totalcount ='$totalcount'
 WHERE id='$i'";

mysql_query($sql,$con);


//END COUNT
}

// CLOSE DATABASE
mysql_close($con);
ob_end_flush();

?>

基本的には、私のWebサイトのすべての写真について、FacebookからFQLクエリを取得し、その結果をMYSQLデータベースに保存するサイクルです。完了したファイルのログも作成します。

問題:-ブラウザから呼び出すと、サーバーがロックされ、ロードしようとしたphpファイルは永久に待機し、500サーバーエラーが発生します。-データベース内のすべての画像を循環させ、新しい値で更新したいので、タイムアウトにしたくありません

解決策-cronジョブ(これにより、スクリプトを「バックグラウンド」モードで実行できるようになりますか?-スクリプトを異なる部分に分割して、1回に10枚の画像を処理します(良くありません)-コードの前にproc_nice()を使用して、より低い優先度を割り当てます。 php命令全体。

実際、私はこのスクリプトでサーバーをオーバーロードしていて、何かが使用できなくなっていますが、それについてどう思いますか?

どうもありがとう !!

4

1 に答える 1

1

サーバー上でタスクマネージャーまたはトップを実行し、CPUまたはメモリ、あるいはその両方に影響がないかどうかを確認します。

それがあなたの記憶にぶつかっているなら、あなたが行くにつれて変数を設定解除してクリーンアップし、各ループを通してそれらをもはや必要としないようにしてください。 http://php.net/manual/en/function.unset.php

CPU使用率の問題が発生している場合は、UNIXを使用している場合や、Windowsに似たようなものがあると私が信じているタスクマネージャーを使用している場合は、niceを使用できます。 PHPスクリプトの最大CPU使用率を調整できますか?

もう1つのボトルネックは、ハードドライブのスループットですが、それがあなたの問題ではないかと思います。

プログラムの実行には長い時間がかかりますが、最終的には終了します。

また、コードを最適化して可能な限り再利用することもできます。割り当てだけでなく参照を使用すると、コピーのメモリ使用量が2倍になります。

$myvar = &$other_var['var'];

次のように、メモリ使用量を高く設定してください。

ini_set('memory_limit', '700M');

そして、上記のようにタイムアウトを永久に設定するには、次のようにします。

set_time_limit (0);
于 2012-07-13T19:47:37.483 に答える