Jump to content

Recommended Posts

Posted (edited)

Здравствуйте уважаемые форумчане. Прошу подсказки у тех кто имеет опыт настройки php для парсеров, демонов либо других "долгоиграющих"  скриптов. Суть такая пишу скрипт загрузки товаров в интернет магазин из xml прайса. Столкнулся с той проблемой что на моем сервере парсер отрабатывает нормально, однако на хостинге клиента прекращает работу спустя 20-60  минут после запуска. В итоге я решил проверить как долго вообще будет выполнятся php скрипт на клиентском хостинге, для проверки написал что то вроде демона:

<?php
ini_set('max_execution_time', 0);
set_time_limit(0);
ini_set("memory_limit", "128M");
ignore_user_abort(true);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

function shutdown()
{
    file_put_contents(__DIR__ . '/log/shutdown_log.txt', 'Выполнили функцию shutdown!'.PHP_EOL, FILE_APPEND);
    $err_arr = error_get_last();
    $err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line'];
    file_put_contents(__DIR__ . '/log/shutdown_log.txt', $err, FILE_APPEND);
    
}

function sig_handler($signo)
{
    $info = "\n" . 'received signal ' . $signo . "\n";
    $info .= "\n" . 'Выполнили функцию sig_handler! ' . $signo . "\n";
    file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $info.PHP_EOL, FILE_APPEND);
    $err_arr = error_get_last();
    $err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line'];
    file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $err, FILE_APPEND);
    exit;
}

register_shutdown_function('shutdown');
declare(ticks = 1);
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");


$time = date('H-i-s');
file_put_contents(__DIR__ . '/log/time_test_ON.txt', $time);

while(true){
    $time = date('H-i-s');
    file_put_contents(__DIR__ . '/log/time_test_log.txt', $time);
    sleep(1);
}

После запуска демона через консоль, он прекращает работу примерно через 20 минут, при этом shutdown() и sig_handler() - никаких логов не создают. Хотя если убить скрипт через консоль командой kill pid то обе функции отрабатывают нормально, то есть логи создаются.

В общем я в тупике, предполагаю что это некое ограничение на хостинге, однако не могу понять в чем именно оно состоит и как его пофиксить.

Вот phpinfo хостинга.

Сам хостинг расположен на twinservers.net панель управления Cpanel, судя по выделенной памяти похож на vps но точно я не уверен.

Edited by kairos

Share this post


Link to post
Share on other sites

Что показывает

uptime

 

Share this post


Link to post
Share on other sites
Posted (edited)

Думаю, данная особенность вызвана настройкой одного из лимитов FastCGI на веб-сервере LiteSpeed.
Попробуйте локально убрать данный лимит, добавив следующие строки в .htaccess:

 

RewriteEngine On
RewriteRule .* - [E=noconntimeout:1]

 

Либо для отдельных скриптов:

 

RewriteEngine On
RewriteRule (wp-cron|backupbuddy|importbuddy)\.php - [E=noconntimeout:1]

Edited by shelkunov

Share this post


Link to post
Share on other sites
1 hour ago, LTRay said:

Что показывает


uptime

 

[antrecom@uashared17 ~]$ uptime
 01:29:18 up 141 days, 17:47,  0 users,  load average: 4.78, 5.02, 5.62

Share this post


Link to post
Share on other sites
1 hour ago, shelkunov said:

Думаю, данная особенность вызвана настройкой одного из лимитов FastCGI на веб-сервере LiteSpeed.
Попробуйте локально убрать данный лимит, добавив следующие строки в .htaccess:

 

RewriteEngine On
RewriteRule .* - [E=noconntimeout:1]

 

Либо для отдельных скриптов:

 

RewriteEngine On
RewriteRule (wp-cron|backupbuddy|importbuddy)\.php - [E=noconntimeout:1]

Попробовал - результат тот же, скрипт падает ровно через 20 минут.

Share this post


Link to post
Share on other sites

kvm / openvz убивает его. Разговаривать тут надо с тех поддержкой

Share this post


Link to post
Share on other sites
Posted (edited)

-

Edited by shelkunov

Share this post


Link to post
Share on other sites
33 minutes ago, LTRay said:

kvm / openvz убивает его. Разговаривать тут надо с тех поддержкой

Спасибо. Написал заказчику, пусть долбит саппорт, будет весело если там еще и хостинг забугорный.)

Share this post


Link to post
Share on other sites
6 часов назад, kairos сказал:

Спасибо. Написал заказчику, пусть долбит саппорт, будет весело если там еще и хостинг забугорный.)

 

это hostiq

Share this post


Link to post
Share on other sites

Получил ответ от хостинга:
"Здравствуйте, на наших серверах виртуального хостинга есть ограничение в 1200 секунд на время работы пользовательского процесса. Запущенные Вами процессы были остановлены при превышении данного лимита:" - так что таки да на их стороне была проблема.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By MaxD
      Скачать/Купить дополнение


      LiveImport - импорт Excel и сайтов
      Новинка! Мое новое дополнение Тестовый сайт создаст копию вашего магазина для тестов в один клик.
       
      Модуль для импорта таблиц (XLS, XLSX, CSV) и сайтов

      поддерживает импорт действительно больших файлов можно дописывать логику импорта в виде небольшого PHP-скрипта предустановленные настройки для AliExpress и eBay для любых сайтов можно настраивать через Мастер, как в ParseMX Язык - английский. Есть версии для OpenCart 1.5+, OpenCart 2.0 и самостоятельная.
      Работает с PHP 5.3 ... 7.0
      Это бета, поэтому имейте в виду, что все синтаксисы и разметки могут измениться в будущем без предупреждения и соблюдения обратной совместимости.
       
      Как настраивать парсинг одиночных товаров с сайта - https://youtu.be/W_yPVZsj62E
      Как настраивать авторизацию на доноре - http://liveimport.devs.mx/service/auth.html
       
      Для массового парсинга товаров с сайта необходимо приобрести лицензию.
       
      Также есть лицензия для массового импорта прайсов, c ней LiveImport сможет:
      хранить отдельно настройки для разных прайсов по кнопке удалять товары, импортированные из определенного прайса автоматически загружать прайсы с внешних серверов по расписанию, если надо - вытаскивать их из ZIP-архива удалять/отключать товары, которые были в прайсе, но пропали проверять, изменился ли файл с последнего обращения, чтобы не обрабатывать повторно старый материал  
      Установка для ocStore/OpenCart 2+
      Установка для ocStore/OpenCart 1.5+
      Установка самостоятельной версии
      Добавил MaxD Добавлено 22.02.2016 Категория Парсеры Системные требования Сайт разработчика http://liveimport.devs.mx/ Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0
      1.5.6.4
      1.5.6.3
      1.5.6.2
      1.5.6.1
      1.5.6
      1.5.5.1
      1.5.5
      1.5.4.1
      1.5.3.1 ocStore 2.3
      2.2
      2.1
      1.5.5.1.2
      1.5.5.1.1
      1.5.5.1
      1.5.4.1.2
      1.5.4.1.1
      1.5.4.1
      1.5.3.1
      1.5.2.1
      1.5.1.3 OpenCart.Pro, ocShop Обращение к серверу разработчика Да Старая цена 0  
    • By MaxD
      Новинка! Мое новое дополнение Тестовый сайт создаст копию вашего магазина для тестов в один клик.
       
      Модуль для импорта таблиц (XLS, XLSX, CSV) и сайтов

      поддерживает импорт действительно больших файлов можно дописывать логику импорта в виде небольшого PHP-скрипта предустановленные настройки для AliExpress и eBay для любых сайтов можно настраивать через Мастер, как в ParseMX Язык - английский. Есть версии для OpenCart 1.5+, OpenCart 2.0 и самостоятельная.
      Работает с PHP 5.3 ... 7.0
      Это бета, поэтому имейте в виду, что все синтаксисы и разметки могут измениться в будущем без предупреждения и соблюдения обратной совместимости.
       
      Как настраивать парсинг одиночных товаров с сайта - https://youtu.be/W_yPVZsj62E
      Как настраивать авторизацию на доноре - http://liveimport.devs.mx/service/auth.html
       
      Для массового парсинга товаров с сайта необходимо приобрести лицензию.
       
      Также есть лицензия для массового импорта прайсов, c ней LiveImport сможет:
      хранить отдельно настройки для разных прайсов по кнопке удалять товары, импортированные из определенного прайса автоматически загружать прайсы с внешних серверов по расписанию, если надо - вытаскивать их из ZIP-архива удалять/отключать товары, которые были в прайсе, но пропали проверять, изменился ли файл с последнего обращения, чтобы не обрабатывать повторно старый материал  
      Установка для ocStore/OpenCart 2+
      Установка для ocStore/OpenCart 1.5+
      Установка самостоятельной версии
    • By Rustamchyk
      Добрый день.
      В корне сайта есть у меня скрипт, в котором мне нужно получить имя текущего пользователя OC, который вошел на сайт. Прописываю в нем следующее:
      require($_SERVER['DOCUMENT_ROOT'].'/system/library/cart/customer.php'); ... if ($this->customer->isLogged()) { return $this->customer->getFirstName(); } ... но имя пользователя не получаю.  Что делаю не так? Правильный ли файл выбрал для require?
      Возможно, файл моего скрипта лучше переместить в какой-либо другой каталог (чтобы не пришлось использовать require), но для примера выбрал корневой каталог сайта.
      И вообще... Где можно почитать документацию по OpenCart для разработчиков на русском?
    • By Juniordev
      Добрый день всем! У меня такой вопрос, в общем закончил я свой проект.
      Такой простенький интернет магазин роллов, все уже готово, типа мобилки и тд. И я хочу понять как теперь, с чего начать натяжку на опенкарт, то есть можно ли просто взять дефолтный шаблон и изменить его под свой макет?
    • By VladSiy
      Нужна помощь, не могу разобраться в sql запросе. 

      в /catalog/model/catalog/product.php есть функция:
      public function getProduct($product_id) { $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,(SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND pr.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'"); if ($query->num_rows) { return array( 'product_id' => $query->row['product_id'], 'name' => $query->row['name'], 'description' => $query->row['description'], 'meta_title' => $query->row['meta_title'], 'meta_description' => $query->row['meta_description'], 'meta_keyword' => $query->row['meta_keyword'], 'tag' => $query->row['tag'], 'model' => $query->row['model'], 'sku' => $query->row['sku'], 'upc' => $query->row['upc'], 'ean' => $query->row['ean'], 'jan' => $query->row['jan'], 'isbn' => $query->row['isbn'], 'mpn' => $query->row['mpn'], 'location' => $query->row['location'], 'quantity' => $query->row['quantity'], 'stock_status' => $query->row['stock_status'], 'image' => $query->row['image'], 'manufacturer_id' => $query->row['manufacturer_id'], 'manufacturer' => $query->row['manufacturer'], 'price' => ($query->row['discount'] ? $query->row['discount'] : $query->row['price']), 'special' => $query->row['special'], 'reward' => $query->row['reward'], 'points' => $query->row['points'], 'tax_class_id' => $query->row['tax_class_id'], 'date_available' => $query->row['date_available'], 'weight' => $query->row['weight'], 'weight_class_id' => $query->row['weight_class_id'], 'length' => $query->row['length'], 'width' => $query->row['width'], 'height' => $query->row['height'], 'length_class_id' => $query->row['length_class_id'], 'subtract' => $query->row['subtract'], 'rating' => round($query->row['rating']), 'reviews' => $query->row['reviews'] ? $query->row['reviews'] : 0, 'minimum' => $query->row['minimum'], 'sort_order' => $query->row['sort_order'], 'status' => $query->row['status'], 'date_added' => $query->row['date_added'], 'date_modified' => $query->row['date_modified'], 'viewed' => $query->row['viewed'] ); } else { return false; } } В ней есть sql запрос, в котором я не могу разобраться. На примере акционного товара, подскажите, пожалуйста, как изменить этот запрос так, чтобы он вывел не 1 цену, как сейчас, а все цены, которые установлены во вкладке Акция, например 5 записей. В итоге хотел бы по определенному условию показывать нужную мне цену. Изменение/удаление LIMIT приводит к ошибке.
  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.