1

Magento の cron ジョブを登録する単純な拡張機能を作成しようとしていますが、ここで見逃しているものがあるようです。cron ジョブがスケジュールされることはなく、cron_schedule テーブルにエントリがありません。そこに入力しようとしても、ジョブは実行されませんでした。デフォルトの magento cron ジョブは正常に実行されています。/var/log/syslog を見ると、cron.sh が実行されていることがわかります。拡張機能は非常に簡単です。cron ジョブを設定するモデル (Observer.php) と config.xml だけです。私はばかのように感じます。私がオンラインで読んだことから、これはセットアップがかなり簡単なはずですが、それでも私はそれをどこにも持っていません.

config.xml の内容は次のとおりです。

<?xml version="1.0"?>
<config>
    <modules>
        <Twobuy_Import>
            <version>1.0</version>
        </Twobuy_Import>
    </modules>
    <global>
        <models>
            <twobuy_import>
                <class>Twobuy_Import_Model</class>
            </twobuy_import>
        </models>
    </global>
    <crontab>
        <jobs>
            <twobuy_import>
                <schedule>
                    <cron_expr>50 13 * * *</cron_expr>  <!-- I set this value to say 10-20-30 minutes in the future, and wait, nothing ever happens -->
                </schedule>
                <run>
                    <model>twobuy_import/observer::parse</model>
                </run>
            </twobuy_import>
        </jobs>
    </crontab>
</config>

app/etc/modules の Twobuy_Import.xml は次のとおりです (拡張子は、システム -> 構成 -> 詳細の下に表示されます)。

<?xml version="1.0"?>
<config>
    <modules>
        <Twobuy_Import>
            <active>true</active>
            <codePool>local</codePool>
        </Twobuy_Import>
    </modules>
</config>

そして Observer.php

class Twobuy_Import_Model_Observer
{
    public function parse()
    {
        $row = 1;
        if (($handle = fopen(Mage::getBaseDir('var')."/orders/Stock/webstock.csv", "r")) !== FALSE)
        {
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
            {
                if($row++ > 1)
                {
                    if($product = Mage::getModel('catalog/product')->loadByAttribute('sku',$data[1]))
                    {
                        $product = Mage::getModel('catalog/product')->load($product->getEntityId());
                        $product->setPrice($data['3']);
                        $product->setAnalysiscode($data['4']);
                        if($data[5] == 'Y')
                            $stockData['is_in_stock'] = 0;
                        else
                            $stockData['is_in_stock'] = 1;
                        $product->setStockData($stockData);
                        try
                        {
                            $product->save();
                        }
                        catch (Exception $e)
                        {
                           Mage::log('Saving error with the following message: '.$e->getMessage());
                           Mage::log('Saving product:');
                           Mage::log($product->getData);
                           Mage::log('CSV line:');
                           Mage::log($data);
                        }
                    }
                    else
                    {
                        Mage::log('Import error, sku not found: '.$data[1]);
                        Mage::log('CSV line:');
                        Mage::log($data);
                    }
                }
            }
            fclose($handle);
        }
        else
        {
            Mage::log('Import, no csv file found!')
        }
    }
}

また、システム->構成->システムからの私のcronジョブ構成は次のとおりです。

Generate Schedules Every 1
Schedule Ahead for 5
Missed if Not Run Within 20
History Cleanup Every 30
Success History Lifetime 60
Failure History Lifetime 600
4

1 に答える 1

2

次のように cron を実行すると、エラー ログが表示されます。

* * * * * /usr/bin/php /home/magento/public_html/cron.php >> /home/magento/public_html/var/log/cron.log 2>&1

また、この拡張機能をオンにします: http://connect20.magentocommerce.com/community/Aoe_Schedulerこれにより、必要なときにいつでも cron ジョブを実行し、スケジュールをクリアして再構築できます。

いいえ、拡張機能が機能しない理由を説明することはできませんが、拡張機能をログに記録して制御することで、簡単に作業を進めることができます。

これも必要かもしれません:

config.xml:

<events>
  <mymodule_update_stuff>
    <observers>
      <mymodule_update_stuff_handler>
        <type>model</type>
        <class>mymodule/observer</class>
        <method>updateStuff</method>
        <args/>
      </mymodule_update_stuff_handler>
    </observers>
  </mymodule_update_stuff>
</events>
....
<crontab>
<jobs>
  <mymodule_updatestuff>
    <schedule>
      <!--<cron_expr>*/15 * * * *</cron_expr> -->
      <config_path>mymodule/misc/frequency</config_path>
    </schedule>
    <run>
      <model>mymodule/observer::updateStuff</model>
    </run>
  </mymodule_updatestuff>
</jobs>
</crontab>

今 system.xml で:

<config>
<sections>
<mymodule translate="label" module="mymodule">
  <label>Whatever</label>
  <tab>catalog</tab>
  <frontend_type>text</frontend_type>
  <sort_order>200</sort_order>
  <show_in_default>1</show_in_default>
  <show_in_website>1</show_in_website>
  <show_in_store>0</show_in_store>
  <groups>
    <misc translate="label">
      <label>Import Options</label>
      <frontend_type>text</frontend_type>
      <sort_order>0</sort_order>
      <show_in_default>1</show_in_default>
      <show_in_website>1</show_in_website>
      <show_in_store>0</show_in_store>
      <fields>
        <frequency translate="label">
          <label>Update Frequency</label>
          <frontend_type>text</frontend_type>
          <sort_order>100</sort_order>
          <show_in_default>1</show_in_default>
          <show_in_website>0</show_in_website>
          <show_in_store>0</show_in_store>
        </frequency>

これで、cron スケジュールを config.xml に配線するのではなく、モジュールの管理構成に入れることができるようになります。これにより、cron スタイルのモジュールの開発が容易になります。

于 2012-09-05T14:02:52.743 に答える