• Почему cron запускается 2 раза?

    @makar04 Автор вопроса
    Подскажите, как запустить не из под root-а и чем это грозит?
  • Почему cron запускается 2 раза?

    @makar04 Автор вопроса
    Да, по логам моего приложения видно что запросы от крона 2 раза приходят. Причём если я выполняю скрипт через браузер, отрабатывет корректно, если запускаю задание на выполнение, тоже корректно. А если задание наступает по времени, то дублируются данные.

    Вот код который выполняется, заменил только название таблиц и данных.

    public function doSome() {
    		$str = date('Y-m-d H:i:s') . " - pid " . getmypid() . " - Start Cron\n";
    		
    		$query = $this->db->query("SELECT some_data FROM " . DB_PREFIX . "some_table WHERE DATE(date_cancel) = CURDATE()");
    		
    		if ($query->num_rows) {
    			foreach($query->rows as $result) {
    				$this->db->query("INSERT INTO " . DB_PREFIX . "some_table2 SET data = '" . (int)$result['data'] . "'");
    				
    				$this->db->query("UPDATE " . DB_PREFIX . "some_table3 SET data = '" . (int)$result['data']  . "' WHERE data_id = '" . (int)$result['data_id'] . "'");
    			}
    		}
    		
    		$str .= date('Y-m-d H:i:s') . " - pid " . getmypid() . " - End cron\n\n\n";
    		
    		file_put_contents('/var/www/www-root/data/www/my-site,ru/system/logs/return.log', $str . "\r\n", FILE_APPEND | LOCK_EX);
    	}
  • Поможете наставить на верный путь начинающего программиста?

    @makar04 Автор вопроса
    alex-1917, кто троля выпустил из клетки? Тебя не до конца пронесло в одном ответе, так ты решил везде обгадится?) Не позорься)
  • Как оптимизировать страницу с большим количеством записей получаемых по API или в результате парсинга?

    @makar04 Автор вопроса
    alex-1917, как я писал в описании, данные кешируются, поэтому запросы к АПИ конкретного поставщика отправляются редко, а если брать в целом систему, то каждый раз когда пользователь грузит какрточку товара, идёт запрос к поставщику. Т. е. для одного поставщика в день может быть от 1 до 50 запросов, а для другого 1 - 5 запросов.
  • Как оптимизировать страницу с большим количеством записей получаемых по API или в результате парсинга?

    @makar04 Автор вопроса
    Исрапил Ахмедов, вы имеете ввиду не загружать одним массивом, а сделать загрузку иттерациями для каждой компании?
  • Как оптимизировать страницу с большим количеством записей получаемых по API или в результате парсинга?

    @makar04 Автор вопроса
    Тоже думал над асинхронной загрузкой данных, но увы прийдётся так же вываливать на пользователя все 1500 косаря товаров
  • Как оптимизировать страницу с большим количеством записей получаемых по API или в результате парсинга?

    @makar04 Автор вопроса
    sim3x, ну 1 из поставщиков довольно крупный гипермаркет, поэтому договорится с ними о чем либо не получится, а вносят изменения они как раз довольно часто да и сотрудников у них на это хватает, вот как раз этот крупный гипермаркет и сделал апи для того что бы мы всегда имели свежую инфу на случай изменения, но проблема в том, что хоть он и крупный гипермаркет для 1го пользователя он не даёт большой объем товара, поэтому у 1го пользователя и может быть 10 поставщиков и не у всех есть апи. Ну в целом я понял, искать вариант как не грузить 1,5к товаров.
  • Как оптимизировать страницу с большим количеством записей получаемых по API или в результате парсинга?

    @makar04 Автор вопроса
    sim3x, так в том то и дело, что все 1500 косаря они могут осилить, а статистика есть только по 5 из 10 компаний, остальные 5 могут в любой момент внести изменения не кого из партнёров при этом не уведомляя об изменениях
  • Как получить печатный документ PDF из массива байт?

    @makar04 Автор вопроса
    Вроде ничего сложного) Спасибо за разъяснение! Попробую.
  • Как учитывать разницу во времени при работе с часовыми поясами в php и sql?

    @makar04 Автор вопроса
    Точно, разобрался, спасибо! Нужно было работать не просто с датой, а с датой и временем и делать SELECT с учётом разницы между часовым поясом клиента и сервера.
  • Оправдано ли увеличение и дублирование кода для разбиения логических процессов?

    @makar04 Автор вопроса
    LaRN, как хорошо, что именно вы мне написали ответ. Спасибо большое! Я sql изучал читая чужой код и время от времени заглядывая в google и не знал о существовании транзакций, точнее догадывался, что должен быть какой-то похожий механизм, но отыскать как то не смог, приходилось изворачиваться всякими JOINами и подзапросами в некоторых местах, что очень сильно мучало мою совесть.
    На счёт архивных таблиц тоже задумывался, только думал, что неправильно будет создавать аналогичные таблицы, но похоже, что я ошибался и в некоторых случаях похоже дублирование неизбежно.
    Если вас не затруднит, сможете, пожалуйста, написать пример какого нибудь моего запроса с транзакциями.
    И хотелось бы подробней разузнать про:

    добавление транзакции может привести к блокировкам и дедлокам при многопользовательской работе

    Т. е. получается, что при большом количестве пользователей будет происходить, что то типа постановка запросов в очередь для каждого пользователя?
  • Оправдано ли увеличение и дублирование кода для разбиения логических процессов?

    @makar04 Автор вопроса
    Те процессы которые уже существуют скорее всего изменятся не будут. В дальнейшем скорее всего будет несколько новых процессов которые практически не будут связаны с уже существующими, а значит и логика работы у них будет своя. Так как я самоучка то про транзакции только что первый раз услышал. Правильно ли я понял, что транзакция не даст произойти запросу в БД если не выполнен предыдущий запрос? Скорее всего транзакции не нужны, так как в каждой таблице имеются определённые признаки позволяющие точно определять нужно ли внести изменения. Приведу пример функции и её запросов на отгрузку посылки и приём посылок на складе, думаю станет более понятно.

    Отгрузка посылок:
    public function addShipment($company_id, $point_id, $parcels) {
    		$this->db->query("INSERT INTO " . DB_PREFIX . "shipment SET company_id = '" . (int)$company_id . "', point_id = '" . (int)$point_id . "', quantity = '" . (int)count($parcels) . "', user = '" . $this->db->escape($this->admin->getFullname()) . "', date_added = NOW()");
    	
    		$shipment_id = $this->db->getLastId();
    
    		// На момент этого запроса дынные о посылке уже присутствуют в базе данных и остаётся её только отгрузить присвоив номер перевозки shipment_id
    		$this->db->query("UPDATE " . DB_PREFIX . "shipment_parcel SET shipment_id = '" . (int)$shipment_id . "', date_modified = NOW() WHERE parcel_id IN (" . implode(',', $parcels) . ")");
    //Изменяем состояние посылки
    		$this->db->query("UPDATE " . DB_PREFIX . "parcel SET shipment_id = '" . (int)$shipment_id . "', date_modified = NOW() WHERE parcel_id IN (" . implode(',', $parcels) . ")");
    		// Записываем статус в историю
    		foreach($parcels as $parcel_id) {
    			$this->db->query("INSERT INTO " . DB_PREFIX . "parcel_history SET parcel_id = '" . (int)$parcel_id . "', parcel_status_id = '" . (int)$this->config->get('config_expected_status')  . "', user = '" . $this->db->escape($this->admin->getFullname()) . "', date_added =  NOW()");
    		}
    	}


    Приём посылок на складе:
    public function updateShipment($parcels) {
    		$this->db->query("UPDATE " . DB_PREFIX . "shipment_parcel SET date_delivery = NOW() WHERE point_id = '" . (int)$this->session->data['point_id'] . "' AND parcel_id IN (" . implode(',', $parcels) . ")");
    
    		$this->db->query("UPDATE " . DB_PREFIX . "parcel SET date_return = '" . $this->db->escape(date('Y-m-d', strtotime('+' . $this->config->get('config_parcel_deadline') .' days'))) . "', date_modified = NOW() WHERE point_id = '" . (int)$this->session->data['point_id'] . "' AND parcel_id IN (" . implode(',', $parcels) . ")");
    		
    		foreach($parcels as $parcel_id) {
    			$this->db->query("INSERT INTO " . DB_PREFIX . "parcel_history SET parcel_id = '" . (int)$parcel_id . "', parcel_status_id = '" . (int)$this->config->get('config_recieved_status')  . "', user = '" . $this->db->escape($this->operator->getFullname()) . "', date_added =  NOW(), date_modified =  NOW()");
    		}
    	}


    Я разбил все процессы на 5 этапов, Отгрузка, Приёмка, Исполнение, Отмена, Возврат. Все процессы зависимы от предыдущего процесса, то-есть пока не произойдёт например Отгрузка, принимать нечего будет, так как выборка будет пуста.
    Таким образом для каждого процесса создаются практически идентичные функции и запросы, в которых только изменяется название функций, таблиц и статусов. Вот я и хочу понять, насколько логично использование такого подхода и оправдывает ли это увеличение моего кода, ведь по сути я мог использовать 1 таблицу для изменения статуса посылки и на основании этого принимать решение о дальнейшей её судьбе, но в таком случае нарушить работу логики достаточно было бы изменив например в конфигурации статусов статус Получена на статус Ожидает отгрузки.
    По поводу нагрузки сам ещё не имею представления так как всё будет зависеть от количества клиентов и количества посылок которые они будут отправлять. Процесс будет происходить следующим образом, клиенты регистрируют посылки, после чего их отгружают на склад, на складе, повторно обрабатывают посылки, тоесть принимают, дальше либо выдают получателю, либо отменяют и формируют возвраты.
  • Оправдано ли увеличение и дублирование кода для разбиения логических процессов?

    @makar04 Автор вопроса
    sim3x, за основу я взял ядро одной из cms, ядро очень похоже на codeignitier.
    По поводу тестов не совсем понятен вопрос. Как можно писать приложение не тестируя его, или вы имеете ввиду какие то определённые тесты? В рефакторинге я совсем профан, поэтому и обратился с таким вопросом к сообществу.
  • Как реализовать проверку прав пользователя на сайте, для изменения определённой страницы?

    @makar04 Автор вопроса
    Авторизация на сессиях у меня реализована, также есть группы для пользователей, но эти группы предназначены для более глобальных вопросов, типа только определённая группа пользователей может создавать блоги, а теперь собственно и осталось реализовать права на определённую запись. Только что наткнулся на модель системы разграничения прав доступа на основе ролей (RBAC) правда еще не до конца вкурил то ли это что нужно, но бегло пробежав глазами показалось что как раз то. Что скажете? И насчет кеширования вы правы лишние запросы в базу не к чему.
  • Поможете наставить на верный путь начинающего программиста?

    @makar04 Автор вопроса
    А почему именно с java? Я к примеру начал изучать js, php и mysql (тоесть я определился для себя с языками) и хотелось бы их доучить, собственно сам мой вопрос подразумевал "правильный ли у меня подход к изучению языка или нет", а вы мне рекомендуете изучать java хотя я даже не закончил изучать эти языки. Я конечно не собираюсь останавливаться на них и следующим языком хотел бы изучить как раз java, но суть вопроса уплыла.
  • Поможете наставить на верный путь начинающего программиста?

    @makar04 Автор вопроса
    Спасибо за советы. Аж воспрянуо духом. Буду двигаться дальше.
  • Поможете наставить на верный путь начинающего программиста?

    @makar04 Автор вопроса
    Да я готов в принципе попервой и на безвозмездной основе взяться за что-то, только где найти человека который даст работу програмисту недоучке без опыта. Кроме того со временем у меня напряг, учусь по ночам пока жена спит) Может на фрилансере попробовать?
  • Поможете наставить на верный путь начинающего программиста?

    @makar04 Автор вопроса
    Спасибо за ответ, а то я уже начал сомневаться в своих силах. Значит буду держать темп. Подскажите еще кое-что пожалуйста, когда лучше попробовать взять какую нибудь более менее ответственную работу по програмированию или вёрстке, когда набью руку или можно сейчас попытаться? А то сложно самому себе выдумывать задания, кроме того некому подсказать как выполненно то или иное задание, а так будет цель.