Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Пошаговая работа PHP скрипта / 23 сообщений из 23, страница 1 из 1
07.09.2015, 10:00
    #39044633
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
Есть скрипт, краткая суть его работы это "Чтение файла по строчкам, сравнение информации строки с БД, и выполнение нужных действий"

Дело в том что он не укладывается в тайм_ лимит на хостинге, Cron и SSH не вариант так как пользователь хочет "ему так надо" запускать через веб интерфейс.

Подскажите как можно запустить скрипт поэтапно?
...
Рейтинг: 0 / 0
07.09.2015, 10:24
    #39044655
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
Делайте скрипт таким, чтоб за один запуск он успешно переваривал некоторую часть данных и отмечал где-то (в базе, например) на каком месте он остановился. При следующем запуске с этого места пусть и начинает. Скрипт дёргать аяксом с веб-странички. Ответ от сервера будет сигналом для следующего запуска. Попутно можно прогресс-бар вывести. Разумеется, если закрыть браузер (отрубить инет, выключить комп), то выполнение задачи приостановится.
...
Рейтинг: 0 / 0
07.09.2015, 16:43
    #39045149
morewind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
Пусть скрипт вызывает сам себя с передачей новому экземпляру параметра "откуда продолжать".
...
Рейтинг: 0 / 0
07.09.2015, 16:48
    #39045154
morewind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
Добавлю.

Однажды, делал через браузер пользователя, высылал ему после порции обработки страницу с
<meta http-equiv="refresh" content="10;URL=http://url?param=...">
после чего браузер обновлял страницу благодаря чему снова вызывался скрипт с передачей ему параметра откуда продолжать обработку.
...
Рейтинг: 0 / 0
07.09.2015, 18:16
    #39045249
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
morewindДобавлю.

Однажды, делал через браузер пользователя, высылал ему после порции обработки страницу с
<meta http-equiv="refresh" content="10;URL=http://url?param=...">
после чего браузер обновлял страницу благодаря чему снова вызывался скрипт с передачей ему параметра откуда продолжать обработку.

Спасибо, взял Ваш вариант на вооружение
...
Рейтинг: 0 / 0
07.09.2015, 19:23
    #39045278
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
morewind<meta http-equiv="refresh" content="10;URL=http://url?param=...">
после чего браузер обновлял страницу благодаря чему снова вызывался скрипт с передачей ему параметра откуда продолжать обработку.Вполне рабочий вариант при некоторых оговорках. А именно, если повторная обработка данных (после обрыва/восстановления связи, например, или при вызове скрипта из закладок) не принесёт проблем, кроме попусту потраченного времени.
...
Рейтинг: 0 / 0
08.09.2015, 08:52
    #39045450
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
все равно время от времени получаю

Fatal error: Maximum execution time of 120 seconds exceeded in E:\home\magaz\www\load2.php on line 48

если обрабатываю построчно и передаю по ссылке смещение от куда начинать читать файл , то все работает , но неимоверно долго
...
Рейтинг: 0 / 0
08.09.2015, 09:13
    #39045467
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ssaich,
тогда надо подходить с другой стороны... Что за файл,каков его размер и что вы конкретно сравниваете.
...
Рейтинг: 0 / 0
08.09.2015, 09:20
    #39045471
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
kunaksergeyssaich,
тогда надо подходить с другой стороны... Что за файл,каков его размер и что вы конкретно сравниваете.

Есть вот такой код
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
<?php
include_once("./config.php");
function meta_page_refresh($url,$time=0){
        if($time<0)$time=0;
        echo '
        <meta http-equiv="refresh" content="'.$time.';url='.$url.'">';
}
      $handle = @fopen($_SERVER['DOCUMENT_ROOT']."/import.tmp", "r");

      $Offset=(int)$_GET['num'];
       $Cnt=(int)$_GET['count'];
      if (isset($Offset))
      {
    fseek($handle,$Offset,SEEK_SET);
    }
     else
     {
       fseek($handle,0) ;
       }


        $link = mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD)
        or die(" : " . mysql_error());
    print " <br/>";
            mysql_query("SET NAMES 'utf8'");
           mysql_query("SET CHARACTER SET utf8");
           mysql_query("SET CHARACTER_SET_CONNECTION=utf8");
          mysql_select_db(DB_DATABASE) or die("!!");

    $query = "SELECT MAX(product_id) FROM oc_product";
    $result = mysql_query($query) or die("! : " . mysql_error());
    $SetStatus="UPDATE oc_product SET `status` = '0'";
    if ($Offset==0)
    mysql_query($SetStatus);
    //**********************
while (($buffer = fgets($handle)) !== false)
{
$buffer = str_replace(array("\r\n", "\r", "\n"), '', $buffer);
         $ex=explode("@@@",$buffer);
         $model=explode(" ",$ex[1]);
 // что то делаем
if ($num_rows==0)

{
 // что то делаем

if ($id_manufacturer)
     {
     // что то делаем
      }

      else
      {
       // что то делаем
         if ($id_manufacturer)
             {
    // что то делаем
             }
               else
               {
     // что то делаем
             if ($id_manufacturer)
                 {
              // что то делаем
                   }
                    else
                    {
                    // что то делаем
                      }
                        }
      }
  //-----------------------
 // что то делаем
 }
  else if ($num_rows==1)
   {
        // что то делаем
   }
   meta_page_refresh('load2.php?num='.ftell($handle)."?count=".$i,0);
    }
 if (ftell($handle)==$Offset) die ("DONE");
// }



fclose($handle);

?>
...
Рейтинг: 0 / 0
08.09.2015, 09:33
    #39045484
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ssaich,
какой формат и размер имеет файл import.tmp? Вы сами его генерируете?
...
Рейтинг: 0 / 0
08.09.2015, 10:14
    #39045528
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
kunaksergeyssaich,
какой формат и размер имеет файл import.tmp? Вы сами его генерируете?
Да там просто строки с разделителем @@@ обычный текстовый файл
...
Рейтинг: 0 / 0
08.09.2015, 11:45
    #39045622
morewind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ssaichвсе равно время от времени получаю

Fatal error: Maximum execution time of 120 seconds exceeded in E:\home\magaz\www\load2.php on line 48

если обрабатываю построчно и передаю по ссылке смещение от куда начинать читать файл , то все работает , но неимоверно долго

Как вариант, ловить самому время выполнения скрипта и при приближении к 120сек вызывать meta_page_refresh
для этого в самом начале написать
$currTime = time();
и в цикле обработки проверять
if ($currTime + 100 < time())
и при истине вызывать meta_page_refresh и завершать работу.
...
Рейтинг: 0 / 0
08.09.2015, 12:02
    #39045647
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
если размер файла это слабое место, то нужно разбирать его с помощью системы или писать код на пример на СИ и запускать его через
system()
...
Рейтинг: 0 / 0
08.09.2015, 12:27
    #39045683
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
morewind,

Залил на хостинг, работает без проблем, у меня же на локальном хосте нет нет, да подглючит (настройки пхп сделал почти такие же как у хостера)
...
Рейтинг: 0 / 0
08.09.2015, 12:46
    #39045718
morewind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
quot ssaich

Возможно, общая производительность сервера у хостера существенно выше чем локального хоста, поэтому скрипт успевает отработать до таймлимита.
...
Рейтинг: 0 / 0
08.09.2015, 13:07
    #39045743
morewind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
kunaksergeyесли размер файла это слабое место, то нужно разбирать его с помощью системы или писать код на пример на СИ и запускать его через
system()

Для бинарников, и прочих пользовательских программ, тоже могут стоять ограничения на время выполнения, и тот же "код на СИ" будет прибиваться по таймлимиту. И менее универсальнее, хостер может поменять архитектуру сервера и "код на СИ" перестанет работать.
...
Рейтинг: 0 / 0
08.09.2015, 13:08
    #39045744
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ssaichЗалил на хостинг, работает без проблемПротестируйте в часы наибольшей нагрузки на сервер, во время выполнения бекапов. Результаты иногда могут оказаться иными.
...
Рейтинг: 0 / 0
09.09.2015, 00:30
    #39046316
ShkrylAndrei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
А можно узнать суть задачи? что за файл, почему сравнивается именно с базой данных, какая задача решается вашим скриптом?
И откуда такой большой объем данных, если он не укладывается в тайм_лимит? Может просто брать информацию из базы, сохранять в обычный файл на сервере, и потом уже работать как с отдельной структурой информации.
...
Рейтинг: 0 / 0
09.09.2015, 09:30
    #39046442
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ShkrylAndreiА можно узнать суть задачи? что за файл, почему сравнивается именно с базой данных, какая задача решается вашим скриптом?
И откуда такой большой объем данных, если он не укладывается в тайм_лимит? Может просто брать информацию из базы, сохранять в обычный файл на сервере, и потом уже работать как с отдельной структурой информации.

Ну проблема уже скажем так решена , ради интереса алгоритм его работы кратко опишу

1) Открываем и читаем файл построчно
2) Отключаем весь товар что есть в БД (то есть не показываем его покупателю)

879441@@@HUAWEI ASCEND G630 BLACK@@@1@@@8040.00@@@HUAWEI ASCEND G630 BLACK@@@278
886991@@@Автомобильный FM-модулятор ROLSEN RFA-340@@@1@@@440.00@@@Автомобильный FM-модулятор ROLSEN RFA-340@@@297

и так далее

3) Разбиваем строку сначала
$ex=explode("@@@",$buffer);

Проверяем по коду 879441 в базе- есть ли такой товар в базе ?

Если нет, то
Разбиваем по пробелу для того что бы выбрать фирму(производителя), для примера в первой строке фирма HUAWEI, но есть строки такого вида
для фирма (производитель ) по порядку первое либо второе и тд например Автомобильный FM-модулятор ROLSEN RFA-340
$model=explode(" ",$ex[1]);

Далее спрашиваем у базы есть ли такой производитель ? $model[0] если нет то спрашиваем , а такой ? $model[1] если нет то спрашиваем еще раз , а такой ? $model[2]

Если нашли производителя получаем его код и пишем в базу сам товар с кодом производителя
Далее пишем информацию (к какой категории товара его отнести и тд)в другие таблички

Если товар есть , то

Обновляем у товара только цену, и включаем его (товар отображается на витрине)
...
Рейтинг: 0 / 0
09.09.2015, 09:51
    #39046461
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ssaich,
авторАвтомобильный FM-модулятор ROLSEN RFA-340
$model=explode(" ",$ex[1]);
Я так понимаю, что в $model[0] у вас попадет Автомобильный и это станет вашим производителем и вы будете искать его в списке производителей?
Сколько ж у вас запросов к базе при обработке файлов?
...
Рейтинг: 0 / 0
09.09.2015, 10:00
    #39046476
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
kunaksergeyssaich,
авторАвтомобильный FM-модулятор ROLSEN RFA-340
$model=explode(" ",$ex[1]);
Я так понимаю, что в $model[0] у вас попадет Автомобильный и это станет вашим производителем и вы будете искать его в списке производителей?
Сколько ж у вас запросов к базе при обработке файлов?
В данном случае , если по производителю - то три запроса

Автомобильный соответственно производителем не может быть, третий запрос по слову ROLSEN будет верным

Сам файл выгружается из 1С в таком вот виде, а "конфигураст 1с" не сделал почему то, что при загрузке прайса в 1с производитель попадал туда куда надо
...
Рейтинг: 0 / 0
09.09.2015, 11:05
    #39046600
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
ssaich,
Если у вас производитель гарантировано только из больших букв, то можно c помощью регулярки выдернуть только такие слова или например сформировать запрос из нескольких условий и брать первую строку результата... Уже получится -2 запроса при итерации...
А лучше взять 1С-ника, пусть выгружает вам данные в xml, далее xslt получаешь своих производителей и одним запросом получаешь свои данные.
...
Рейтинг: 0 / 0
14.09.2015, 15:13
    #39050926
ssaich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пошаговая работа PHP скрипта
kunaksergeyssaich,
Если у вас производитель гарантировано только из больших букв, то можно c помощью регулярки выдернуть только такие слова или например сформировать запрос из нескольких условий и брать первую строку результата... Уже получится -2 запроса при итерации...
А лучше взять 1С-ника, пусть выгружает вам данные в xml, далее xslt получаешь своих производителей и одним запросом получаешь свои данные.

мммм... например ? можно кусочек кода ?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Пошаговая работа PHP скрипта / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]