LINUX.ORG.RU

Сообщения mongo

 

Посоветуйте БД технологии для оптимизации поиска по большому объёму данных

Форум — Web-development

В БД имеется таблица products содержащая более полутора миллионов записей. Данная таблица заполняется/обновляется через крон скрипты ежедневно из разных источников.

Посредством web UI администратор системы имеет возможность добавлять/удалять fields - колонки этой таблицы и конфигурировать какая колонка из CSV фида (источника данных) соответствует какой колонке в этой таблице. В настоящее время имеется 37 колонок таблицы данных таких как например Vendor Name, VPN, SKU, EANUPC, Dealer Price, Stock, Stock Backlog Quantity, Stock Backlog ETA, Warehouse, Description, Category, OEM Part Number, etc.

Таким образом администратор системы может для CSV-фида из источника http://sourceX/feed.csv установить через конфигуратор:
колонка CSV #1 -> VPN
колонка CSV #2 -> Dealer Price
колонка CSV #12 -> Stock
колонка CSV #13 -> EANUPC
колонка CSV #14 -> Stock Backlog Quantity
...........etc.............

Требуется организовать поиск по таблице products в котором администратор может искать по любой комбинации колонок, например:
- найти все продукты где $5.55 <= Dealer Price <= $7.50 и Stock > 10
- найти все продукты где Description содержит «keyboard» и EANUPC начинается с XXXXXXX
- найти все продукты в которых VPN содержит XXX или SKU содержит XXX
...................etc...............

Поиск осуществляется только персоналом, т.е. нет необходимости беспокоиться о большом количестве параллельных запросов

В настоящее время после запроса можно сходить покурить пока появятся результаты. Используется mongodb, индексы есть но не помогают либо расставлены неправильно. Количество записей ~1.6M.

Прошу посоветовать возможно ли как то оптимизировать скорость работы поиска (с добавлением записей проблем нет) возможно засчёт замедления крон-скриптов импортирующих/добавляющих записи.

Машина довольно мощная:
- восьмиядерный AMD Opteron(TM) Processor 6220
- 32 гигабайта памяти
- диск вроде SSD 120 гигабайт

Прежде всего хотелось бы спросить совета относительно оптимальной БД для таких нужд. Оптимально ли подходит mongodb или стоит копать в другую сторону? Слышал что то про Elastic Search. Время для изучения новых технологий есть. Однако хотелось бы быть уверенным что копаю в правильном направлении.

Также буду благодарен если посоветуете какую то литературу по теме.

 , , , ,

mongo
()

Как оптимизировать angularjs + php progress bar

Форум — Web-development

При прокрутке заметно притормаживает браузер.

'use strict';

angular.module('app').controller('RunController', ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) {
	
	$scope.run = function (feedId) {
		$http.post('ajax/run/run.php', {
			feeds:{feedId : true}
		}).then(function (response) {
			$scope.reload();
		});
	};
	
	var promise = null;
	$scope.$on('$destroy', function () {
		if (promise !== null) $timeout.cancel(promise);
	});
	$scope.reload = function () {
		$http.get('ajax/run/progress.php').then(function (response) {
			if (response.data.error === undefined) {
				
				$scope.feeds = response.data.feeds;
				
			}
			promise = $timeout($scope.reload, 3000);
		}, function (response) {
			promise = $timeout($scope.reload, 3000);
		});
	}
	$scope.reload();
	
}]);
<div class="container-fluid" style="text-align: center;">
	<h2>
		Run
		&nbsp;
		<a ng-if="!reloadInProgress" ng-click="reload()"><span class="glyphicon glyphicon-refresh" style="font-size:0.6em;"></span></a>
	</h2>
	
	<div id="run-table" style="width: 90%; display: inline-block; text-align: left; position: relative;">
		
		<ul style="list-style-type: none;">
			<li ng-repeat="feed in feeds | orderBy:'name'">
				<a ng-show="feed.status==='stopped'" ng-click="run(feed._id)"><span class="glyphicon glyphicon-play"></span></a>
				<a ng-show="feed.status==='running'" ng-click="stop(feed._id)"><span class="glyphicon glyphicon-stop"></span></a>
				<label>
					<input type="checkbox" />
					{{feed.name}}
				</label>
				<div class="progress" ng-show="feed.status==='running'"><div class="progress-bar" ng-style="{'width': feed.progress + '%'}">{{feed.progress}}%</div></div>
				<ul ng-show="feed.subfeeds" style="list-style-type: none;">
					<li ng-repeat="subfeed in feed.subfeeds | orderBy:'name'">
						<label>
							<input type="checkbox" />
							{{subfeed.name}}
						</label>
						<div class="progress" ng-show="subfeed.status==='running'"><div class="progress-bar" ng-style="{'width': subfeed.progress + '%'}">{{subfeed.progress}}%</div></div>
					</li>
				</ul>
			</li>
		</ul>
		
	</div>
		
</div>

Возможно ли как то оптимизировать? Server-side написан на PHP так что с socket.io наверное не удастся сделать. Там много кода на PHP.

 , ,

mongo
()

Сделать таблицу bootstrap занимающей не всю ширину а только столько сколько требуется тексту

Форум — Web-development

Как сделать таблицу bootstrap занимающей не всю ширину а только столько сколько требуется тексту размещённому в ячейках таблицы. Так ведёт себя обычная таблица в HTML.

Например: http://freelance-desk.com/test.html

Первая таблица имеет аттрибуты class=«table table-bordered». Вторая таблица имеет аттрибуты border=«1» align=«center».

Вторая таблица занимает не всю ширину экрана (контейнера) а только столько сколько требуется для отображения содержащейся в ней информации.

Как бы сделать так что бы стиль таблицы был как у первой таблицы и выглядела она красиво но при этом была бы не во всю ширину а как вторая и располагалась по центру экрана? При небольшом количестве столбцов они растягиваются и в клетках таблицы очень много свободного места что не красиво.

Хотелось бы что бы ширина столбцов именно реагировала на количество текста а не была определена типа width: 100px т.к. неизвестно сколько текста будет добавлено для конкретной записи и как ведут себя экраны с разным разрешением.

 , , ,

mongo
()

Какие опции добавить в php/curl?

Форум — Web-development

wget -O file «url» --username=user --password=pass удачно скачивает zip файл размером 267478 байт. Файл нормально распаковывается с помощью unzip.

В то же время код на PHP/curl скачивает файл размером 402099 байт который не поддаётся распаковке. Чувствую тут какая то проблема с долбаным ftp binary/text transfer. Файл не распаковывается:

root@import:/var/www/lib/tmp/hui# unzip hui
Archive:  hui
error [hui]:  missing 68051554 bytes in zipfile
  (attempting to process anyway)
error [hui]:  start of central directory not found;
  zipfile corrupt.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)
root@import:/var/www/lib/tmp/hui#

Вот код на PHP/curl:

		while (true) {
			$fh = fopen($this->location, 'wb');
			if ($fh === false) {
				$this->errorType = '';
				$this->error = "Failed to create file {$this->location}";
				return false;
			}
			
			$ch = curl_init();
			
			if ($this->username !== '') {
				curl_setopt($ch, CURLOPT_USERPWD, urlencode($this->username).":".urlencode($this->password));
			}
			
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_FILE, $fh);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100);
			curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
			if (curl_exec($ch) === false) {
				$this->errorType = 'url';
				$this->error = "Failed to fetch file: ".curl_error($ch);
				return false;
			}
			if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 202) {
				fclose($fh);
				unlink($this->location);
				e("Received HTTP/202, waiting to retry...\n");
				sleep(5);
			} else {
				break;
			}
		}
		//e($url."\n");
		fclose($fh);

Подскажите какую опцию добавить что бы всё работало как надо?

PHP 5.4.41

 ,

mongo
()

Пришло время что то решать с браузерами

Форум — Talks

Как же задолбали эксперименты разработчиков двух основных браузеров (firefox, chromium). С каждой версией они становятся всё более неюзабельны. Всё больше и больше, не побоюсь этого слова, говна понапихано в каждую новую версию. Всё больше и больше тормозов. Всё неюзабельнее гуй - результат диких экспериментов сбежавших из психушки дизайнеров. Всё больше извращается изначальная идея веб браузера.

Хотелось бы найти браузер:

  • который не отсылает какие то report'ы разработчикам
  • который не показывает неотключаемые (или хер его знает где отключаемые) заставки с рекламой
  • который не тормозит по причинам захламлённости не нужной хернёй
  • который имеет адекватный классический или же настраиваемый интерфейс
  • и в то же время поддерживает современные стандарты

Если выяснится что такого не существует в природе значит надо писать его т.к. задолбали mozilla и google.

Перемещено leave из desktop

 

mongo
()

Не подключается фотоаппарат через USB

Форум — Desktop

Не подключается фотоаппарат через USB. Вроде недавно только работало. Теперь втыкаю в него USB и в фотоаппарате пишется «Connecting Computer» и всё, ничего не происходит, только лампочка мигает.

 

mongo
()

Браузер без анальных зондов

Форум — Desktop

Как пропатчить браузер что бы удалить из него всю гадость типа открытия google search, предложений войти в гугл аккаунт, показа рекламы каких то пожертвований при открытии мозиллы, шпионские сервисы подсказок при наборе URL и прочее говно? Если open source значит можно. Существуют ли уже готовые решения? Задолбали изготовители браузеров пихающие новое и новое говно с каждым новым релизом!!!!

 

mongo
()

debian apache игнорирует сессию для каталога с определённым названием

Форум — Web-development

На веб сайте идёт проверка залогинен юзер или нет:

if (!isset($_SESSION['user'])) go("/login.php");

Всё отлично работает кроме некоторых каталогов. В прошлый раз это был каталог /cats/ и проблема была решена его переименованием в /c/. Однако теперь проблема повторилась с каталогом /suppliers/ совершенно внезапно. При доступе к нему apache упорно отказывается использовать сессию и браузер переходит на login.php хотя все остальные страницы из других каталогов открываются корректно. Кроме того в /var/www/ иногда появляется (а иногда и не появляется) откуда то файл list.txt с таким содержанием:

./suppliers
./suppliers/_start.php
./suppliers/index.php
./suppliers/plants
./suppliers/plants/index.php
./suppliers/plants/edit.php
./suppliers/plants/del.php
./suppliers/subfeeds
./suppliers/subfeeds/_start.php
./suppliers/subfeeds/index.php
./suppliers/subfeeds/progress.php
./suppliers/subfeeds/edit
./suppliers/subfeeds/edit/index.php
./suppliers/subfeeds/edit/_save.php
./suppliers/subfeeds/new
./suppliers/subfeeds/new/index.php
./suppliers/subfeeds/new/_stage1.php
./suppliers/subfeeds/new/_save.php
./suppliers/subfeeds/run.php
./suppliers/subfeeds/_stop.php
./suppliers/subfeeds/del.php
./suppliers/progress.php
./suppliers/edit
./suppliers/edit/index.php
./suppliers/edit/_save.php
./suppliers/new
./suppliers/new/index.php
./suppliers/new/_stage1.php
./suppliers/new/_save.php
./suppliers/run.php
./suppliers/_stop.php
./suppliers/log.php
./suppliers/del.php

Файл был удалён мной но после доступа к каталогу через веб он возник снова. А вот сейчас посмотрел его уже и нет хотя каталог по прежнему не юзабелен.

Так что же за гадость там работает? Как выяснить что за мерзостный говнософт это делает?

 , , ,

mongo
()

Одновременное залогивание в разных браузерах для php

Форум — Web-development

Написал webgui на php. Для залогивания в него используется такой код:

<?php

require_once dirname(__FILE__)."/lib/config.php";

$f = array();
$errors = array();

$f['username'] = (isset($_POST['username']) && is_string($_POST['username'])) ? mb_trim($_POST['username']) : "";
$f['password'] = (isset($_POST['password']) && is_string($_POST['password'])) ? $_POST['password'] : "";

if (isset($_POST['submitted'])) {
	require_once FILE_BASE."/db.php";
	$user = $db->users->findOne(array('username' => $f['username'], 'password' => $f['password']));
	//exit("here");
	if (is_null($user)) {
		$errors[] = "Access Denied!";
	} else {
		$_SESSION['user'] = $user;
		$_SESSION['timezone'] = (isset($user['timezone'])) ? $user['timezone'] : DEFAULT_TIMEZONE;
		go((isset($_GET['ret']) && is_string($_GET['ret'])) ? $_GET['ret'] : "{$www_base}/");
	}
}

На моём компе с gentoo всё работает отлично. Однако на компе заказчика с дебианом возникла такая странная проблема:

если пользователь уже залогинен например в mozilla когда он заходит в другом браухере например chromium он попадает на страницу login.php, вводит корректные данные (username/password) и всё равно не может залогиниться. Как было выяснено код внутри else {} выполняется и $user сохраняется в $_SESSION['user'] однако после редиректа оказывается что этих данных нет в сессии. Вот код из /lib/config.php:

<?php

error_reporting(E_ALL ^ E_DEPRECATED);

define('IS_WEB', !(php_sapi_name() == 'cli'));

require_once dirname(__FILE__)."/conf.php";
require_once FILE_BASE."/func.php";

date_default_timezone_set("UTC");
mb_internal_encoding("UTF-8");

if (IS_WEB) {
	$www_proto = (
		isset($_SERVER['HTTPS']) && is_string($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on"
	) ? "https" : "http";
	$www_base = "{$www_proto}://{$_SERVER['HTTP_HOST']}{$conf['www_path']}";
	
	if (get_magic_quotes_runtime()) set_magic_quotes_runtime(0);
	if (get_magic_quotes_gpc()) {
		function removeMagic($a) {
			if (is_array($a)) {
				foreach ($a as $key => $val) $a[$key] = removeMagic($a);
			} else {
				$a = stripslashes($a);
			}
			return $a;
		}
		$_GET = removeMagic($_GET);
		$_POST = removeMagic($_POST);
		$_COOKIE = removeMagic($_COOKIE);
	}
	
	session_set_cookie_params(
		0, // unlimited lifetime
		"{$conf['www_path']}",
		$_SERVER['HTTP_HOST'],
		false, // secure connections (httpS) only
		true // HTTP only, no JavaScript allowed to modify cookies
	);
	session_start();
	
	// Protection against CSRF attacks
	if (!isset($_SESSION['csrf'])) $_SESSION['csrf'] = randStr();
	if ($_SERVER['REQUEST_METHOD'] != 'GET') {
		if (!( isset($_POST['csrf']) && is_string($_POST['csrf']) && $_POST['csrf'] == $_SESSION['csrf'] )) {
			exit("CSRF attack!");
		}
	}
	
	if (!(
		preg_match('#/login\\.php$#', $_SERVER['PHP_SELF']) ||
		preg_match('#/logout\\.php$#', $_SERVER['PHP_SELF']) ||
		preg_match('#/users/index\\.php$#', $_SERVER['PHP_SELF']) ||
		preg_match('#/users/passwd\\.php$#', $_SERVER['PHP_SELF'])
	)) session_write_close();
}

Т.к. на моём компе всё работает подохреваю что дело в каких то настройках внутри php.ini.

 ,

mongo
()

debian install newer version of libxml2 for use with php

Форум — Web-development

Как в этом говне мамонта установить более новую версию libxml2 причём таким способом что бы PHP её использовало из за

http://se2.php.net/manual/en/domnode.getlineno.php

The 65535 line number limit is no longer a problem when you use libxml 2.9 or higher, but you have to explicitly enable support for big line numbers:

Удалось скачать libxml2-2.7.2, и сделать ./configure && make && make install но в PHP всё равно не работает define('XML_PARSE_BIG_LINES', 4194304). Возникает устойчивое желание подвергнуть стредневековым пыткам программистов допустивших столь идиотский баг в библиотеке для работы с большими файлами а также всех дебианщиков за их старьёвщичество.

 , , ,

mongo
()

Что почитать по теории баз данных?

Форум — Development

Посоветуйте что почитать что бы детально познакомиться с теорией баз данных, научиться понимать принципы их работы, алгоритмы, исходники, научиться корректно выбирать сервер базы данных для конкретной задачи и научиться оценивать какую нагрузку он сможет выдержать. Потомучто, как выяснилось, знания простейших CRUD операций не достаточно за исключением простейших случаев с небольшой нагрузкой.

 

mongo
()

MongoDB error

Форум — Web-development

Fatal error: Uncaught exception 'MongoCursorException' with message 'localhost:27017: Runner error: Overflow sort stage buffered data usage of 33555743 bytes exceeds internal limit of 33554432 bytes' in /var/www/localhost/htdocs/feeds/products/index.php:186 Stack trace: #0 /var/www/localhost/htdocs/feeds/products/index.php(186): MongoCursor->rewind() #1 {main} thrown in /var/www/localhost/htdocs/feeds/products/index.php on line 186

$products = $db->products->find($search)->sort($sort)->limit($itemsPerPage)->skip(($page - 1) * $itemsPerPage);
foreach ($products as $product) {  // line 186
  //...
}

 ,

mongo
()

mongodb pagination

Форум — Web-development

Имеется таблица содержащая 912,842 записей. При обращении к первым страницам всё ok. Однако при обращении к последней странице виснет весь комп на несколько минут. Вопрос - что делать? Заказчик требует доступа к произвольной странице.

$products = $db->products->find()->limit($itemsPerPage)->skip(($page - 1) * $itemsPerPage);

 , , ,

mongo
()

RSS подписка на новые темы