Скрипт возобновляет выполнение через некоторое время - PullRequest
2 голосов
/ 26 августа 2010

Я занят проектом в cakePHP, где мне нужно проанализировать пару файлов XML и вставить соответствующие данные в мою базу данных mysql.Сценарий вставляет то, что он должен вставить, это не проблема.Например, если я анализирую один или два файла (около 7000-8000 записей), ничего не происходит неправильно.

Проблемы начинаются, когда я анализирую третий или четвертый файл XML.После минуты вставки записей я вижу, что в базу данных успешно вставлено 9000-10000 записей, но вдруг кажется, что скрипт перезапускается сам.Я заметил, что в таблице присутствуют 0 записей, и она возобновляет вставку всех записей.Таким образом, выполнение сценария занимает всего несколько лет.

Краткий фрагмент:

$content = simplexml_load_file($file);

/**
 * Process line per line 
 */              
foreach ($content->product as $line) {              
  // create new record in products database table
  $product = array();
  $product['Product']['productid'] = $line->attributes()->sku_number;
  $product['Product']['name'] = $line->attributes()->name;
  $product['Product']['description'] = empty($line->description->long) ? $line->description->short : $line->description->long;
  $product['Product']['link'] =  $line->URL->product;
  $product['Product']['affiliate'] = 'linkshare';
  $product['Product']['price'] = $line->price->retail;
  $product['Product']['brand'] = strtolower($line->brand);
  $product['Product']['image'] = $line->URL->productImage;

  // if not in rejectedproducts, save the new product to the database
  if (!$rejectedproductModel->findByProductid($product['Product']['productid'])) {
  $productModel->create();
  $productModel->save($product);        
}

Кто-нибудь имел опыт работы с этим?В чем может быть причина и многое другое, что может быть решением:)

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 августа 2010

Я думаю, что проблема заключается в этом разделе кода:

  # truncate table products before adding new records to avoid duplicate records
        $productModel->query('TRUNCATE TABLE products');

Это плохой способ избежать дублирования записей. Это должно быть сделано с ограничениями на БД. При этом, каким-то образом этот кусок кода снова запускается в середине процесса.

Это как CRON или как-то запускается автоматически? Если это так, то происходит то, что предыдущий файл не завершил синтаксический анализ при запуске следующего.

0 голосов
/ 26 августа 2010

Я покажу часть кода.Вызов каналов происходит следующим образом. Метод parseDirectory проверяет все xmls в указанной папке и анализирует их, вызывая действие linkshare и передавая имя файла.

function index() {
        set_time_limit(0);

        #$this->updateFeeds();

        App::import('Model', 'Product');        
        $productModel = new Product();      
        # truncate table products before adding new records to avoid duplicate records
        $productModel->query('TRUNCATE TABLE products');

        # parse all files from shareasale
        #$this->__parsedirectory('feeds/shareasale');   
        # parse all files from linkshare
        $this->__parsedirectory('feeds/linkshare'); 

        # send mails where necessary
        $this->redirect(array('controller' => 'subscriptions', 'action' => 'sendmails'));
    }

Частные функции

function __parsedirectory($dir) {   
    # retrieve name affiliate out of directory
    $affiliate = explode('/', $dir);
    $affiliate = $affiliate[1];     

    $dh = opendir($dir);
    while (($file = readdir($dh)) !== false) {
        if ($file != '.' && $file != '..' && !$this->__endswith($file, 'gz')) {
            $this->requestAction('/parse/' . $affiliate . '/file:' . $file);
            $this->Session->setFlash($affiliate . '/' . $file . ' parsed');
        }
    }
    closedir($dh);
    $this->autoRender = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...