Скрипт импорта CSV в базу данных в формате JSON
Доброго времени суток!
Написал скрипт, который будет запускаться по крону, для обновления информации на страницах из
CSV файлов, которые располагаются на других сайтах.
Скрипт вроде работает, но хочется убедиться, что всё правильно с точки зрения безопасности/оптимизации и прочего. Поэтому обращаюсь к сообществу с целью исправления ошибок, если таковые имеются.
Написал скрипт, который будет запускаться по крону, для обновления информации на страницах из
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();
}
};
Комментарии: 7
if (!empty($rowss['csvlink'])) {Почему сразу в условие не прописать? $q->where(array('csvlink:!=' => ''));
Действительно, спасибо, Николай!
Не за что.
И $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($res as $rowss){ лучше заменить на
while($row = $s->fetch(PDO::FETCH_ASSOC)).
Так памяти меньше кушаться будет, потому что не все записи сразу в общим массив набьются, а за раз только одна запись будет обрабатываться.
И $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($res as $rowss){ лучше заменить на
while($row = $s->fetch(PDO::FETCH_ASSOC)).
Так памяти меньше кушаться будет, потому что не все записи сразу в общим массив набьются, а за раз только одна запись будет обрабатываться.
Внёс правки с твоими рекомендациями, спасибо ещё раз!
Еще раз не за что.
Николай, периодически отваливается с такими ошибками (перечислил три варианта):
Руками запускаю – всё хорошо. Через крон с ошибками) Не подскажешь, как обходить их?
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
Руками запускаю – всё хорошо. Через крон с ошибками) Не подскажешь, как обходить их?
Это настройки сервера надо смотреть. Причин много может быть: ограничение на количество запросов в единицу времени, перегруз сервера, не может определить ip по хостнейму и т.п.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.