0

毎月 5 日に以下の php スクリプトを自動実行するようにお願いします。現在、これを手動で実行しています。これはスケジュールタスクを使用して可能ですか? また、Web サーバーへの管理者アクセス権がありません。したがって、サードパーティの自動化ツールは使用できません。

PS: Windows 7 xampp 環境のローカル マシンでこれをスケジュールし、後でリモート データベースを更新することは可能ですか?

session_start();

if($_SESSION['log'] != "log" || $_SESSION['type'] != "***"){
    header("Location: ***.php");
}

require_once('conf.php');

date_default_timezone_set('Asia/Kolkata');
$date = date("j"); //get current date
$today = date("d-m-Y");  
$now = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm

if ($date === 5){
    //get interest rate
    $sql = mysql_query("SELECT Rate FROM Interest WHERE Ref = 'Loan' ORDER BY Date DESC LIMIT 1");
    $r = mysql_fetch_assoc($sql);
    $rate = $r['Rate'];

    //check for not settled loans
    $check = mysql_query("SELECT LID FROM Registry WHERE Status = 0");
    if (mysql_num_rows($check) > 0){
        while ($list = mysql_fetch_assoc($check)) {     // while there are rows to be fetched...
        //*** Start Transaction ***//  
            mysql_query("BEGIN");  

            $loanID = $list['LID'];

            //get loan data
            $sql = mysql_query("SELECT Registry.Amount, SUM(Account.Total) AS Paid, SUM(Account.Interest) AS intPaid FROM Registry LEFT JOIN Account ON Registry.LID = Account.LID WHERE Registry.Status = 0 AND Account.Auto = 0 AND (Account.LID = '$loanID') GROUP BY Account.LID");
            $r = mysql_fetch_assoc($sql);
            $amount = $r['Amount']; //loan amount
            $paid = $r['Paid'];     //sum of paid
            $intPaid = $r['intPaid'];   //sum of interest paid

            //get sum of monthly automatically updated interest
            $sql = mysql_query("SELECT SUM(Interest) AS Interest FROM Account WHERE Payment = 0 AND Auto = 1 AND LID = '$loanID'");
            $r = mysql_fetch_assoc($sql);
            $autoInt = $r['Interest'];  

            $total = ($amount + $autoInt);  //total to be paid
            $balance = ($total - $paid);    //with no interest

            if ($paid >= $balance){
//              echo "Loan completed <br/>";
            }else{
                $int = ($balance * $rate) / 100;
                $update = mysql_query("INSERT INTO Account (LID, Date, Interest, Total, Auto) VALUES ('$loanID', NOW(), '$int', '$int', 1)") or die(mysql_error());

                if (! $update){
                //*** RollBack Transaction ***//  
                mysql_query("ROLLBACK");  
//                  $_SESSION['error'] = "Interest saving failed.!";
                    echo "Loan ID: " . $loanID . ", Interest: Rs. " . $int . "/= - Update Failed.!<br>";
                }else{
                //*** Commit Transaction ***//  
                    mysql_query("COMMIT");  
//                  $_SESSION['error'] = "Interest saved successfully";
                    echo "Loan ID: " . $loanID . ", Interest: Rs. " . $int . "/= - Update Succeeded.!<br>";
                }
            }
        }
    }
}else{
    echo "Monthly Interest can be update only by 05th day of the month.!";
}
4

4 に答える 4

2

公的にアクセス可能な Web サーバーである場合は、 https: //www.cronjobservice.net/ のような cronjob サービスを使用できます。登録後、URL と呼び出し時刻を入力します。1 つが失敗した場合に備えて、これらのサービスを複数使用することをお勧めします。(スクリプトは最初の呼び出しで実行し、他のサービスからの後続の呼び出しで終了する必要があります。)

.htaccess を適切に処理し、セキュリティ関連の出力がないことを確認してください。

于 2013-05-31T10:59:09.773 に答える
2

あなたのサイトをホストしている人々に解決策があるか尋ねましたか? ほとんどのホスティング会社には、これに対するソリューションがあります (Windows サーバーでも)。

ホスティング会社がこれに対する解決策を持っていない場合 (私は真剣に疑っています)、cron の可能性がある別のサーバーからスクリプトを外部から呼び出すか、その日の最初の訪問者にスクリプトを呼び出させることができます。

いずれにせよ、スクリプトが設定された日付にのみ実行されることをスクリプトに含めて (すでにそれを持っています)、その日にスクリプトを複数回呼び出しても問題ないことを確認する必要があります。

PS : スクリプトが最初の訪問者によって呼び出された場合、その特定の日に訪問者がいないという事実を考慮する必要があるため、次の訪問者が来るたびにスクリプトを実行する必要があります。

于 2013-05-31T11:03:06.563 に答える
0

Windows への管理アクセス権がない場合、スケジュールされたタスクを作成することはできません。唯一の代替手段は、スクリプトが最後に実行された時間をチェック/保存する、アプリケーション内にある種のカスタム タスク コンポーネントを作成することです。これに関する問題は、ユーザーのアクティビティに依存しているため、希望する正確な日付に実行されない可能性があることです.

もう 1 つの方法は、Cron を利用できるように Linux ホスティングを見つけることです。

于 2013-05-31T10:55:14.473 に答える