0

ウェブサイトから情報を取得してデータベースに挿入するために、頻繁にその中にcurlを含むphpを実行しようとしています。私は cronjob を機能させることができ、実行するたびにメールを送信する必要があるため、php は機能します。ただし、機能していないのは、CURL スクリプトまたは MySQL スクリプトです。

クロンジョブ:

* * * * * /usr/bin/php -q  /var/www/rstracker/cronjobs.php

cronjobs.php:

<?php 
$to      = '';
$subject = 'RSTracker Cronjob Ran!';
$message = 'Successful cronjob!';
$headers = 'From: ' . "\r\n" .
    'Reply-To: ' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>

<?php 
include("connect.php");

$query = mysql_query("SELECT id FROM users");
while($row = mysql_fetch_array($query))
{

    $userID = $row['id'];
    $date = mktime();

    // create a new cURL resource
    $ch = curl_init();

    // set URL options
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
    curl_setopt($ch, CURLOPT_URL, "http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=".$username);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    // grab HTML
    $data = curl_exec($ch);

    // close cURL resource, and free up system resources
    curl_close($ch);

    //echo "<textarea>$data</textarea><br />";


    $hs = explode("\n",$data);
    $skills = array("Overall","Attack","Defence","Strength","Constitution","Ranged","Prayer","Magic","Cooking","Woodcutting","Fletching","Fishing","Firemaking","Crafting","Smithing","Mining","Herblore","Agility","Thieving","Slayer","Farming","Runecrafting","Hunter","Construction");
    $i = 0;
    for($i = 0; $i<count($skills);$i++) {
     // Explode each skill into 3 values - rank, level, exp
     $stat = explode(',', $hs[$i]);
     $out[$skills[$i]] = Array();
     $out[$skills[$i]]['rank'] = $stat[0];
     $out[$skills[$i]]['level'] = $stat[1];
     $out[$skills[$i]]['xp'] = $stat[2];
    }




    foreach($out as $key => $value)
    {
        if($value['level']>0||$value['xp']>0||$value['rank']>0)
        {
            mysql_query("INSERT INTO skills SET userID='$userID', skill='$key', level='".$value["level"]."', xp='".$value["xp"]."', rank='".$value["rank"]."', date='$date'");
        }
    }

}


?>
4

2 に答える 2

1

問題の原因は次の行にあると思います。

include("connect.php");

php スクリプトが crond によって実行されるときの作業ディレクトリは、/php スクリプトが保存されているディレクトリではなく、ファイル システムのルートであることに注意してください。

パスを次のように変更します。

include(__DIR__ . '/connect.php');
于 2013-07-10T19:38:18.717 に答える
1

ほとんどconnect.phpの場合、適切なディレクトリにありません。CRON ジョブとして実行する場合、php スクリプトの「作業ディレクトリ」は、実行中のアカウントのホーム ディレクトリです。「connect.php」が include_path のどこかにあるか、同じディレクトリにない限り、ほぼ確実に見つかりません。

ロードされていないため、データベースに接続できません。

すべてのデータベースと curl コードは、人生が完璧であると単純に想定しているため、DB 接続がない場合の障害を処理するように設定されていません。

同様に、この他のすべてが正常に機能していたとしても、コードのどこにも を設定$usernameしていないため、runescape サイトからスクレイピングしている URL は単に

http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=

とにかく無効なデータをスクレイピングすることになります。

一般的なヒント: 毎回新しい curl オブジェクトを作成する必要はありません。ループの外側で 1 つの curl オブジェクトを作成してから、ループの内側で URL をリセットできます。

于 2013-07-10T19:39:00.027 に答える