2012-07-13 91 views
3

我必須每天運行PHP腳本,代碼是這樣的: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.danielepiccone.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(); 

?> 

基本上它是一個週期,對於在我的網站的每個畫面拍照並從Facebook FQL查詢和存儲導致我的MYSQL數據庫。我甚至會記錄完成的文件。

問題: - 如果我從瀏覽器調用它鎖定服務器和任何php文件,我嘗試加載等待永遠,並給出500服務器錯誤。 - 我不希望它超時,因爲我希望它循環數據庫中的所有圖片,並用新值刷新它們

決議 - cron作業運行(這應該允許腳本在「後臺」運行模式右 - 斯普利特的不同零件加工每單位時間(不好)10張圖片 腳本 - 使用proc_nice()的代碼之前低優先級分配給整個PHP指令

其實我有這個腳本超載服務器和任何東西無法使用,你怎麼看?

謝謝很多!

+0

什麼'回聲$ lastid'打印? – 2012-07-13 19:07:15

+0

在數據庫中記錄文件不容易嗎? – 2012-07-13 19:10:20

+0

服務器可能會做很多IO,運行'iotop'來確認。另一個可能是更新語法,如果沒有事務處理,這是很痛苦的。 – Pentium10 2012-07-13 19:10:31

回答

1

在您的服務器上運行任務管理器或頂部,查看它是否擊中了您的CPU或您的內存或兩者。

如果它正在擊中你的記憶,那麼使用取消設置並清理你的變量,並且不再需要它們,通過每個循環。 http://php.net/manual/en/function.unset.php

如果您遇到CPU使用率問題,您可以使用nice,如果您在unix或任務管理器,我相信在Windows中有類似的東西。 Can I throttle the max CPU usage of a php script?

另一個瓶頸可能是硬盤吞吐量,但我懷疑這是你的問題。

程序運行需要很長時間,但最終會結束。

您也可以嘗試優化您的代碼並儘可能重用,使用引用而不是僅僅指定,因爲這會使內存使用量翻倍。

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

請務必設置您的內存使用量高,是這樣的:

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

並設置您超時永遠像你有以上:

set_time_limit (0); 
+1

謝謝!真的很全面! – dpi 2012-07-14 06:34:34

+0

不客氣:) – Wolfe 2012-07-14 18:52:13

+0

你也可以將所有的變量外循環聲明的全局變量,所以內存是簡單地重複使用,這將節省CPU和內存時,未設置是昂貴的操作。 – Wolfe 2012-07-14 21:42:27