Скрипт импорта CSV в базу данных в формате JSON

Доброго времени суток!
Написал скрипт, который будет запускаться по крону, для обновления информации на страницах из
CSV файлов, которые располагаются на других сайтах.

Скрипт вроде работает, но хочется убедиться, что всё правильно с точки зрения безопасности/оптимизации и прочего. Поэтому обращаюсь к сообществу с целью исправления ошибок, если таковые имеются.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)).'/core/config/config.inc.php';
require_once MODX_BASE_PATH . 'index.php';

$q = $modx->newQuery('modResource');
$q->where(array('parent' => 6,'published'=>1,'csvlink:!=' => ''));
$q->select('id,csvlink');
if ($q->prepare() && $q->stmt->execute()) {
    while ($rowss = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
        $array = array($rowss['id'] => $rowss['csvlink']);
	    if (($handle = fopen($rowss['csvlink'], 'r')) === false) {
		    die('Error opening file');
    	}
	$headers = fgetcsv($handle, 0, ';');
    	$promo = array();
	    while ($row = fgetcsv($handle, 0, ';')) {
		    $promo[] = array_combine($headers, $row); // $promo[$row['0']] для выноса ID в Индекс массива
    	}
	fclose($handle);
    	$promo_json = json_encode($promo);

	$resource = $modx->getObject('modResource', $rowss['id']);
    	$resource->set('promo_json', $promo_json);
	$resource->save();
	$modx->cacheManager->refresh();
    }
};
Klike
02 февраля 2016, 13:35
modx.pro
4
1 232
0

Комментарии: 7

Fi1osof
03 февраля 2016, 09:27
1
+3
if (!empty($rowss['csvlink'])) {
Почему сразу в условие не прописать? $q->where(array('csvlink:!=' => ''));
    Klike
    03 февраля 2016, 09:30
    0
    Действительно, спасибо, Николай!
      Fi1osof
      03 февраля 2016, 09:38
      1
      +4
      Не за что.

      И $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($res as $rowss){ лучше заменить на
      while($row = $s->fetch(PDO::FETCH_ASSOC)).
      Так памяти меньше кушаться будет, потому что не все записи сразу в общим массив набьются, а за раз только одна запись будет обрабатываться.
        Klike
        04 февраля 2016, 08:28
        0
        Внёс правки с твоими рекомендациями, спасибо ещё раз!
          Fi1osof
          04 февраля 2016, 09:16
          0
          Еще раз не за что.
            Klike
            16 февраля 2016, 08:52
            0
            Николай, периодически отваливается с такими ошибками (перечислил три варианта):
            PHP warning: fopen(http://site.ru/file.csv):
            – failed to open stream: HTTP request failed!
            – failed to open stream: Connection timed out
            – PHP warning: fopen(): php_network_getaddresses: getaddrinfo failed: No address associated with hostname


            Руками запускаю – всё хорошо. Через крон с ошибками) Не подскажешь, как обходить их?
              Fi1osof
              16 февраля 2016, 12:33
              0
              Это настройки сервера надо смотреть. Причин много может быть: ограничение на количество запросов в единицу времени, перегруз сервера, не может определить ip по хостнейму и т.п.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7