1

一部のユーザーがアプリケーションから追い出されたかどうかを検出するCronスクリプトがあります。特定の値が1の場合、これを検出できますが、ストリームでは、新しいエントリは設定されません。スクリプトは1時間ごとに実行されます。ほとんど非検出されます。しかし、2012-10-31 23:59:03以降、すべてのユーザーが検出されました。ローカルマシンで、またはcronが実行するのと同じマシンでスクリプトを実行した場合。すべてが適切に処理されました。まず最初に、スクリプト:

require_once ('cron_init.php');
ini_set('date.timezone', 'Europe/Berlin');
ini_set('max_execution_time', 30);
ini_set('memory_limit', -1);
error_reporting(E_ALL);
ini_set("display_errors", 1);

Zend_Date::setOptions(array('fix_dst' => true));

    $userinfos = new Repricing_Dbservices_Userinfos();
    $users = $userinfos->getUsersForRepricing();

    $repricingstream = new Repricing_Dbservices_Repricingstream();
    $error = new Repricing_Dbservices_Error();

if($users!==false AND count($users)>0){

    $counter = 0;
    $errCounter = 0;
    $jetzt = new Zend_Date();
    $jetzt->setTimezone('Europe/Berlin');
    $jetzt = $jetzt->get(Zend_Date::TIMESTAMP);

    foreach($users as $user){
        $stream = $repricingstream->getStreamLimit($user);

        $last = new Zend_Date($stream);
        $last->setTimezone('Europe/Berlin');
        $last = $last->get(Zend_Date::TIMESTAMP);

        $diff = (($jetzt-$last)/60);

        $error->setError(1, 'DIED', $diff, $user);

        if($diff > 50 ){
            $errCounter++;
            $userinfos->setUserFree($user);
            $error->setError(1, 'DIED', 'ANSTOSSEN', $user);
        }

        $counter++;
    }
    $error->setError(1, $errCounter, 'ANSTOSSEN_ALL', 'ALL');
}

通常$diff >= 0 AND $diff <= 4ですが、検出されましたが、それ$diffは常に約381595です。cron$diffが不足している場合は、当然のことです。また、それ$jetztは今(そうあるべき$lastですが)ずっと後のことであることがわかりました。381595後で。しかし、そうすべきではありません。最後のストリーム日付は完全に正常です。のこの動作を理解することはできません。cronを使用したZend_Date。2012-10-21 23:59:03スクリプトを2週間実行することをお勧めします。どうして説明できない。あなたはできる?

4

1 に答える 1

1

このことを考慮:

$right = new Zend_Date('2012-11-01 12:12:12', Zend_Date::ISO_8601);
var_dump( $right->getIso() );        // 2012-11-01T12:12:12+00:00
var_dump( $right->getTimestamp() );  // 1351771932

$wrong = new Zend_Date('2012-11-01 12:12:12', null, 'en_US');
var_dump( $wrong->getIso() );        // 2012-01-11T12:12:12+00:00
var_dump( $wrong->getTimestamp() );  // 1326283932

さて、本当に気紛れな部分です。私のPCでは、デフォルトの2番目の動作です。つまり、Zend_Dateコンストラクターに追加のパラメーターが指定されていない場合です。

重要なのは、Zend_Dateは少し...日時文字列を解析しようとするときにあまりにも役立つということです。たとえば、ロケールを考慮に入れていますが、サーバーとクライアントの両方のロケールです。そして、文字列がこのロケールのルール内で解析できない場合、それは黙って諦め、別のルールを使用しようとします。

そのため、 (29か月目がないため、ロケールが提案したにもかかわらず2012-10-29)として解析され、スクリプトが台無しになりました。)。October, 292012-11-01January, 11

于 2012-11-02T16:14:11.973 に答える