0

スケジュールされたインポートに使用されるかなり大きなxmlファイルがいくつかあります。私はそれらを解析するためにcronを使用します。問題は、処理に時間がかかりすぎて、常にphp"max_execution_time"を超えることです。私はXMLReaderを使用しているので、xmlを「行ごとに」読み取ることができます。これは、現在動作している「ノード」を追跡し、それを記憶して、次のcron実行時にノードオフセットを設定するという唯一の解決策です。

今私が持っています

  $xml = new XMLReader;
  $xml->open($file);
  $pointer = 0;

  while($xml->read()) {

    if ($xml->nodeType == XMLReader::ELEMENT && $xml->localName == 'Product') {
      $chunk = array();
      $chunk['ProductID'] = $xml->getAttribute('ProductID');
      $chunk['ProductName'] = $xml->getAttribute('ProductName');
      process_import($chunk); // Process received date
      save_current_node_in_BD($pointer++); // insert current position in BD
    }
  }
  $xml->close();
}

処理されたノードをカウントするために$pointer++を使用するのは良い考えですか? 次のcron実行のオフセットを設定するにはどうすればよいですか?

4

1 に答える 1

2

まず、cronからphpを実行するときは、通常、デフォルトのmax_execution_timeが0(無効)のcliバージョンを使用します。それを変更できない場合は、読み続けてください。

XMLを時間内に解析できる場合(解析のみ、処理なし)、2つのcronを使用できます。

  1. 最初のcronはXMLを解析し、新しいタスクを山にダンプします。
  2. 2番目のcronは、パイルから作業を取得し、処理してから、パイルから削除します。

パイルはいくつかの方法で実装できますが、その中には次のものがあります。

  • データベーステーブル
  • 作業項目のディレクトリ(各作業項目は1つのファイルです)

編集

実行時間制限を無効にできない場合は、ファイル名と位置を含む小さなファイルを保持できます。各反復で、このファイルを開いて、まだ実行する必要のある作業があるかどうかを判断できます。時間がなくなったときにそのファイルを確実に保存するには、シャットダウン機能を登録する必要があります。

于 2012-05-14T03:56:33.783 に答える