Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Recommended Posts

После переноса с облачного сервера появилась проблема с синхронизацией 1С.

По сути синхронизацией не стало совсем.

 

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

Решение без кабинета в админке OC.

 

 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
*/2 * * * * root /usr/bin/links -source https://www.сайт.ru/wp-cron.php?10517f841dbb594cdbccc0c734ee41e2&action=wysija_cron&process=all
*/2 * * * * root wget -O /dev/null -q https://www.сайт.ru/s/cron.php > /dev/null
40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null
45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null
0 9 * * * root wget -O /dev/null -q https://www.сайт.ru/s/index.php?route=product/product/soldout > /dev/null
* * * * * root wget -O /dev/null --password=devcd --user=devcd -q http://test.сайт.ru/s/cron.php > /dev/null
#37 17 2 9 5 root /usr/bin/php -f /home/datasub/htdocs/backup.charmdis.ru/docs/static/cdmailer/index.php >> /home/datasub/htdocs/backup.charmdis.ru/docs/var/mailer.log
#5 16 * * * root /usr/bin/php -f /home/charmdis/docs/static/cdmailer/index.php >> /home/charmdis/docs/static/cdmailer/sending.log
0 3 * * * root /usr/bin/lynx -source -accept_all_cookies https://www.сайт.ru/s/index.php?route=api/ordercoupon/cron
0 4 * * * root /usr/bin/lynx -source -accept_all_cookies https://www.сайт.ru/s/index.php?route=api/instagram
0 1 * * * export APPLICATION_ENV="production" && cd /home/datasub/htdocs/hairbrand.ru/ && nice -n 15 php console.php -m site -c index -a upload-backups-to-drop-box >> /tmp/cron-upload-backups-to-dropbox.log


 

 

вот так выглядел файл крона на облачном сервере

 

Переносили только сайт на субдомене на другой, обычный хостинг.

Понятно дело доступа к файлам и папкам теперь нет, к которым был ранее. 

 

Получается из файла крона нас интересует только сайт на субдомене shop

К этому сайту относится запрос

 

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

 

и

 

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

 

так, как только он работал с 1С и обменивался. 

 

Как я понял, файл прилетал в директиву /home/1cftp/ftp/ из 1С - напрямую. Я так понимаю сам 1С отправлял и отправляет прямо сейчас через FTP туда файл

после чего он перемещался кроном в директорию /home/datasub/htdocs/storage/upload/ftp

Оттуда его OC через скрипт  45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null 

о котором я говорил ранее съедает.

 

Но, OC есть не хочет, пишет нет файла. Пока писал понял что это ведь логично - 1С выгружает файл по старому FTP подключению.

 

image.png.68a63ef81a1b0bd51282cfe4b9598280.png

 

Вот такие ошибки он выводит каждый час. Иногда чаще.

 

 

В связи с этим вопросы: 

Если я изменю в настройках 1С параметры FTP подключения, мне же нужно будет использовать какую то другую директорию. Понятно, что 1С будет выгружать прямо в корень папки которая будет указана в параметрах FTP доступа. Но какую и главное КАК указать директорию для скрипта который будет кроном пытаться съесть файл, которого нет в папке (директива где то указана старая, от прошлого сервака). 

 

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

 

Я так понимаю этот файл, исполняемый поможет внести хоть какую то ясность. 

Как можно этот файл открыть? Что это вообще такое? Где это находится, вообще? 

В качестве дополнения добавлю код, который нашел по пути /www/shop.charmdis.ru/catalog/controller/product/product.php , относящийся к импорту

 

 

 

 

 

		/* Apr 9th 2020 new format
			сайт SKU
			1C ID
			Moscow qty
			SPb qty
			Price


		* 		Old schema:
		*	сайт SKU
		*	1C ID
		* 	Moscow Qty
		* 	Moscow Price
		* 	SPb Qty
		* 	SPb Price
		*/ 
	
		$this->log->write( 'Import from 1C FTP file start' );

		if( ! file_exists( $this->_1CfilePath )) {
			return 'Не найден путь к файлу импорта';
		}

		$ftpDir = opendir( $this->_1CfilePath );
		$itemsProcessed = $itemsUnprocessed = 0;

		while( $ftpFile = readdir( $ftpDir )) {
			if( preg_match( '@\.'. $this->_1CfileExtension .'[email protected]', $ftpFile )) {
				$aFileName = explode( '-', $ftpFile );

				if( count( $aFileName ) < 7 ) {
					$ftpFileNewName = preg_replace( '@\.'. $this->_1CfileExtension .'@', '-' . date('Y-m-d-H-i-s') . '$0', $ftpFile );

					$this->load->model('catalog/product');

					$this->log->write( 'Importing from file ' . $ftpFile );
					$source1CFile = $this->_1CfilePath . DIRECTORY_SEPARATOR . $ftpFile;

					$in1c = file( $source1CFile );

					foreach( $in1c as $inline ) {
						$inline = preg_replace( '@[^0-9а-яa-z;/\s-]@iu', '', $inline );
						$al = explode( ';', trim( $inline ));
						$model1c = $al[1];
						if( count( $al ) < 3 || count( $al ) > 5 ) {
							return 'Неправильное число колонок в файле, должно быть: артикул, ID из 1C, остатки, цена (опционально)';
						}

						$this->model_catalog_product->updateProduct1c( $al[0], $model1c );

						// Has SPB data
						if( count( $al ) == 6 ) {
							if( $this->model_catalog_product->setProductQuantity( $model1c, (int) $al[4], "Санкт-Петербург" )) {
								$itemsProcessed ++;
								// Ignore SPb price?
								/*if( $this->model_catalog_product->setProductPrice( $model1c, (float) $al[5] ) ) {
								}*/
							}
						} elseif( count( $al ) == 5 ) { // New format

							$this->model_catalog_product->setProductQuantity( $model1c, (int) $al[2], "Москва" );
							$this->model_catalog_product->setProductQuantity( $model1c, (int) $al[3], "Санкт-Петербург" );

							$product_status = $al[2] + $al[2] > 0 ? 7 : 5;
							$this->model_catalog_product->setProductStatus( $model1c, $product_status );
							 

							if( $this->model_catalog_product->setProductPrice( $model1c, (float) $al[4] ) ) {
								$itemsProcessed ++;
							} else {
								$itemsUnprocessed ++;
							}
						}
						
					}

					$this->log->write( 'Import from 1C FTP file finished: ' . $itemsProcessed . ' processed items, ' . $itemsUnprocessed . ' unprocessed items' );

					if( copy( $source1CFile, $this->_1CfilePath . DIRECTORY_SEPARATOR . $ftpFileNewName  )) {
						$this->log->write( 'Renaming file to ' . $ftpFileNewName );
						if( unlink( $source1CFile )) {
							$this->log->write( 'Deleting original file' );
						} else {
							$this->log->write( 'Failed to delete original file' );
						}
					} else {
						$this->log->write( 'Renaming file failed' );
					}

					return '';
				}
			}
		}

		return 'Не найдены файлы для импорта';
	}

	public function import1c()
	{

		ini_set('display_errors', '1' );
		$error = $this->process1cFile();
		$this->cache->delete('product.bestseller');
		$this->cache->delete('products');
		if( $error ) {
			$this->log->write( 'Import error: ' . $error );
			die( $error );
		}
	}

 

Что это может быть? Может кто то шарит в программировании? Если этот код не запускает тарелку в космос, что еще это может быть? 

Помогите пожалуйста по данному вопросу. 

 

 

 

 

 

 

 

 

Link to post
Share on other sites

Скорее всего дело в путях.

Посмотреть путь на linux-хостинге при доступе по ssh можно с помощью  команды pwd

Команда крона

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

каждый 45 мин запускает функцию import1c() контроллера catalog/controller/product/product.php, который Вы верно нашли.

Судя по логам, начинается выполнятся код

$this->log->write( 'Import from 1C FTP file start' );

		if( ! file_exists( $this->_1CfilePath )) {
			return 'Не найден путь к файлу импорта';
		}

не находится путь и выводится сообщение в лог.

Обратите внимание в коде как определяется переменная _1CfilePath в которой содержится путь к директории с файлами для дальнейшего их разбора.

Возможное направление для действий.

1. На новом хостинге

- определяете (создаете) директорию в которую будут записываться файлы по FTP  с правами на запись.

- определяете (создаете) директорию  из которой будут забираться файлы для импорта в OpenCart, этот путь должен быть указан для переменной  _1CfilePath (см. выше)

2. В кроне изменяете пути для команды перемещения

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

3. В 1с при импорте прописываете новый путь для экспорта по FTP (путь узнаем на хостинге с помощью команды pwd)

 

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

Edited by searchingman
  • +1 1
Link to post
Share on other sites

12 часов назад, searchingman сказал:

Скорее всего дело в путях.

Посмотреть путь на linux-хостинге при доступе по ssh можно с помощью  команды pwd

Команда крона

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

каждый 45 мин запускает функцию import1c() контроллера catalog/controller/product/product.php, который Вы верно нашли.

Судя по логам, начинается выполнятся код

$this->log->write( 'Import from 1C FTP file start' );

		if( ! file_exists( $this->_1CfilePath )) {
			return 'Не найден путь к файлу импорта';
		}

не находится путь и выводится сообщение в лог.

Обратите внимание в коде как определяется переменная _1CfilePath в которой содержится путь к директории с файлами для дальнейшего их разбора.

Возможное направление для действий.

1. На новом хостинге

- определяете (создаете) директорию в которую будут записываться файлы по FTP  с правами на запись.

- определяете (создаете) директорию  из которой будут забираться файлы для импорта в OpenCart, этот путь должен быть указан для переменной  _1CfilePath (см. выше)

2. В кроне изменяете пути для команды перемещения

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

3. В 1с при импорте прописываете новый путь для экспорта по FTP (путь узнаем на хостинге с помощью команды pwd)

 

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

 

Так, подскажите, а где я в теории могу посмотреть путь в переменной  _1CfilePath? 

Link to post
Share on other sites

7 минут назад, 7ochukwu сказал:

 

Так, подскажите, а где я в теории могу посмотреть путь в переменной  _1CfilePath? 

Н-р, в  контроллере поиском по _1CfilePath.

  • +1 1
Link to post
Share on other sites

15 минут назад, searchingman сказал:

Н-р, в  контроллере поиском по _1CfilePath.

catalog/controller/product/product.php ??

Link to post
Share on other sites

14 часов назад, searchingman сказал:

Н-р, в  контроллере поиском по _1CfilePath.

    private $_1CfilePath = DIR_UPLOAD . 'ftp'; 

вот такое значение нашел.

 

    private $error = array();
    private $_1CfilePath = DIR_UPLOAD . 'ftp';    
    private $_1CfileExtension = 'csv';

 

Как я могу заменить адрес директории, например интересует директория /catalog/1С_upload ?

Link to post
Share on other sites

Строка в коде

private $_1CfilePath = DIR_UPLOAD . 'ftp';  

ссылалась на старый путь /home/datasub/htdocs/storage/upload/ftp

 

Не стал бы ничего менять в коде контроллера.

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

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

Если после переноса сайт работает, значит, пути уже прописаны. 

Посмотреть их можно в конфигурационном файле \config.php

define('DIR_STORAGE', 'Какой-то ваш/путь/');

define('DIR_UPLOAD', DIR_STORAGE . 'upload/'); 

 

Edited by searchingman
  • +1 1
Link to post
Share on other sites

Posted (edited)
1 час назад, searchingman сказал:

Строка в коде

private $_1CfilePath = DIR_UPLOAD . 'ftp';  

ссылалась на старый путь /home/datasub/htdocs/storage/upload/ftp

 

Не стал бы ничего менять в коде контроллера.

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

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

Если после переноса сайт работает, значит, пути уже прописаны. 

Посмотреть их можно в конфигурационном файле \config.php

define('DIR_STORAGE', 'Какой-то ваш/путь/');

define('DIR_UPLOAD', DIR_STORAGE . 'upload/'); 

 

 

Понял о чем вы говорите.

Такой вопрос

Дело в том, что папка storage сейчас вынесена за пределы папки сайта.

Произошло это еще на облачном сервере. 

По каким причинам это было сделано не ясно.

 

image.png.0242d80c970e67f094b71c9129e6fb21.png

 

Иерархию сохранили и на новом обычном хостинге.

В конфиге уже на новом хостинге есть об этом информация.

 

image.png.868f54d5d75f43122a6576fc38285191.png

 

Вроде все модули работают как нужно. Да и вообще сайт работает как нужно, кроме импорта 1С и установки модулей.

При установкt через ocmod выдает ошибку о том, что папка не найдена. 

Я так понимаю из-за того, что дефолтно в модификаторах xml указан путь к storage внутри папки сайта, каким он и должен быть.

 

В связи с этим было желание перенести папку storage внутрь, как располагается  из коробки (в папку systems), чтобы не нарушать процесс дефолтной установки модулей.

Как быть в этой ситуации? стоит ли переносить папку?  и менять ее путь в конфиге

А в кроне указать просто путь к этой папке?

 

 

Edited by 7ochukwu
Link to post
Share on other sites

1 час назад, searchingman сказал:

Строка в коде

private $_1CfilePath = DIR_UPLOAD . 'ftp';  

ссылалась на старый путь /home/datasub/htdocs/storage/upload/ftp

 

Не стал бы ничего менять в коде контроллера.

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

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

Если после переноса сайт работает, значит, пути уже прописаны. 

Посмотреть их можно в конфигурационном файле \config.php

define('DIR_STORAGE', 'Какой-то ваш/путь/');

define('DIR_UPLOAD', DIR_STORAGE . 'upload/'); 

 

 

Поменял пути, создал папки!

 

image.thumb.png.1685cf774558750241bbb57ce48c504e.png

Link to post
Share on other sites

13 минут назад, 7ochukwu сказал:

 

Понял о чем вы говорите.

Такой вопрос

Дело в том, что папка storage сейчас вынесена за пределы папки.

Произошло это еще на облачном сервере. 

По каким причинам это было сделано не ясно.

 

image.png.0242d80c970e67f094b71c9129e6fb21.png

 

Иерархию сохранили и на новом обычном хостинге.

В конфиге уже на новом хостинге есть об этом информация.

 

image.png.868f54d5d75f43122a6576fc38285191.png

 

В связи с этим было желание перенести папку storage внутрь, как располагается  из коробки (в папку systems), чтобы не нарушать процесс дефолтной установки модулей.

Как быть в этой ситуации? стоит ли переносить папку?  и менять ее путь в конфиге

А в кроне указать просто путь к этой папке?

 

 

Для OC 3.x папка storage вынесена для безопасности и возвращать ее не нужно. При установке OC 3 при входе в админку запрашивается разрешение на перенос этой папки.

Если в путях содержится кириллица ( сайт.ru),  то очень желательно от нее избавиться, т.е. в путях должна быть латиница без пробелов.

Путь назначения файлов импорта будет /var/www/u1352512/data/www/storage/upload/ftp Для теста можете вручную положить в нее файл импорта  и сделать импорт командой, как в кроне. По идее должно сработать.

Надеюсь у Вас есть актуальный бэкап перед любыми экспериментами.

  • +1 1
Link to post
Share on other sites

31 минуту назад, searchingman сказал:

Для OC 3.x папка storage вынесена для безопасности и возвращать ее не нужно. При установке OC 3 при входе в админку запрашивается разрешение на перенос этой папки.

Если в путях содержится кириллица ( сайт.ru),  то очень желательно от нее избавиться, т.е. в путях должна быть латиница без пробелов.

Путь назначения файлов импорта будет /var/www/u1352512/data/www/storage/upload/ftp Для теста можете вручную положить в нее файл импорта  и сделать импорт командой, как в кроне. По идее должно сработать.

Надеюсь у Вас есть актуальный бэкап перед любыми экспериментами.

 

Пути поменял 

image.thumb.png.bb8ab4df4332009d8ad0edbaadd03c6b.png

 

Вроде импорт закончился успешно.

 

Правильно понимаю, что папка storage в OC 3 всегда и была вынесена в отдельную директиву за папку сайта? 

Link to post
Share on other sites

Только что, 7ochukwu сказал:

Правильно понимаю, что папка storage в OC 3 всегда и была вынесена в отдельную директиву за папку сайта? 

Да, правильно. 

  • +1 1
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.