• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела wpt лично.

Помощь Поэтапное выполнение скрипта

Proxyr

Мой дом здесь!
Регистрация
17 Авг 2011
Сообщения
156
Реакции
247
Прошу помощи в решении. Задача состоит в том, что бы зациклить скрипт на самого себя.
Сейчас скрипт, по нажатию на кнопку, выполняет то что между /*начало*/ и /*конец*/
Но массив данных, с которым он работает ($myarrayecho) слишком большой и через 30 сек выполнение гасится. Я вот подумал обработать массив частями, сделал срез массива и подготовил данные для POST запроса ($urlpost если конечно надо).
Может кто поможет с решением, как зациклить этот промежуток между /*начало*/ и /*конец*/.
PHP:
<?
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/petrofstudio.fotoart/include.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/petrofstudio.fotoart/prolog.php");

IncludeModuleLangFile(__FILE__);
set_time_limit(0);
CModule::IncludeModule("iblock");
$IBLOCK_ID = intval($_REQUEST['IBLOCK_ID']);
$IBLOCK_TYPE_ID = $_REQUEST['IBLOCK_TYPE_ID'];
$CODE_PROP = $_REQUEST['IMG_CODE_PROP'];
$CODE_WHERE = $_REQUEST['IMG_CODE_WHERE'];
$new = $_REQUEST['NEW'];
$i = $_REQUEST['I'];
$l = $_REQUEST['L'];
$strError = "";
$io = CBXVirtualIo::GetInstance();
$file_pointer = $_SERVER["DOCUMENT_ROOT"]."/upload/tmp/petrof/serialize.txt";
$step = 200; // сколько позиций обработать за один проход

/*начало*/
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["backButton"]) && strlen($_POST["backButton"]) > 0) {

    if ($IBLOCK_ID=='')
        $strError.= GetMessage("FOTOART_NO_IBLOCK_ID")."<br>";
    if ($CODE_PROP=='')
        $strError.= GetMessage("FOTOART_NO_CODE_PROP")."<br>";
    if ($IBLOCK_ID!='' && $CODE_PROP!='') {
        $res = CIBlockProperty::GetByID($CODE_PROP, $IBLOCK_ID, $IBLOCK_TYPE_ID);
        if(!$ar_res = $res->GetNext())
            $strError.= GetMessage("FOTOART_NO_CODE_PROP_IBLOCK")."<br>";
    }
   
    if(strlen($strError) <= 0) {

/**/
if ( !$file_handle = fopen($file_pointer, 'rb') ) exit;
$myarrayecho = unserialize( fread($file_handle, filesize($file_pointer)) );
fclose($file_handle);

// срез массива
if (!isset($old)) {
    $i = 0;
    $l = 0;
    $old = 0;
    $new = $step;
} else {
    $old = $new;
    $new = $new + $step;
}
$myarrayecho = array_slice($myarrayecho, $old, $new);

        # обработка файлов
        if(!empty($myarrayecho)):
            foreach($myarrayecho as $key=>$item) {
                $prop_ar_val = explode(".",$item["name"]);
                $prop_val = $prop_ar_val[0];
                $temp_f = "temp.".$prop_ar_val[1];
                // закачивание файла

                # получение ID элемента по свойству
                $arSelectItem = Array("ID", "NAME");
                $arFilterItem = Array("IBLOCK_ID"=>$IBLOCK_ID, "PROPERTY_".$CODE_PROP=>$prop_val);
                $resItem = CIBlockElement::GetList(Array(), $arFilterItem, false, Array("nPageSize"=>1), $arSelectItem);
                if($obItem = $resItem->GetNextElement())
                {
                    $arFieldsItem = $obItem->GetFields();
                    # обновление картинки
                    $el = new CIBlockElement;
                    $arLoadProductArray = Array(
                      "MODIFIED_BY"    => $USER->GetID(),
                      $CODE_WHERE."_PICTURE" => CFile::MakeFileArray($local_file)
                    );
                    if($el->Update($arFieldsItem['ID'], $arLoadProductArray)) {
                        $i++;
                    }
                    else {
                        $l++;
                    }
                }
                else {
                    $l++;
                }
            }
        else:
            $strError.= GetMessage("FOTOART_ADM_ZIP_IS_EMPTY")."*<br>";
        endif;
        # заканчиваем загрузку фотографий
    }
/*
  $urlpost =
  'IBLOCK_TYPE_ID='.$IBLOCK_TYPE_ID.
  '&IBLOCK_ID='.$IBLOCK_ID.
  '&IMG_CODE_PROP='.$CODE_PROP.
  '&IMG_CODE_WHERE='.$CODE_WHERE.
  '&backButton='.$_POST["backButton"].
  '&NEW='.$new.
  '&I = '.$i.
  '&L = '.$l;
*/
}
/*конец*/

$APPLICATION->SetTitle(GetMessage("PAGE_TITLE"));
$aTabs = array();
$aTabs[] = array("DIV" => "edit", "TAB" => GetMessage('TITLE'), "ICON"=>"iblock_type", "TITLE"=>GetMessage('TITLE'));
$tabControl = new CAdminTabControl("tabControl", $aTabs);
$bVarsFromForm = false;
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
CJSCore::Init(array("jquery"));

$aContext = array(
    array(
        "ICON" => "btn_list",
        "TEXT"=>GetMessage("MAIN_ADMIN_MENU_LIST"),
        "LINK"=>$back_url,
        "TITLE"=>GetMessage("MAIN_ADMIN_MENU_LIST")
    ),
);

$context = new CAdminContextMenu($aContext);
$context->Show();
CAdminMessage::ShowMessage($strError);
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["backButton"]) && strlen($_POST["backButton"]) > 0 && $strError=='') {
        $str_success_detail = str_replace("#COL_SUCCESS#",$i,GetMessage("FOTOART_ADM_EXP_LINES_EXPORTED"));
        $str_success_detail = str_replace("#COL_ERROR#",$l,$str_success_detail);
        echo CAdminMessage::ShowMessage(array(
            "TYPE" => "PROGRESS",
            "MESSAGE" => GetMessage("FOTOART_ADM_EXP_SUCCESS"),
            "DETAILS" => $str_success_detail,
            "HTML" => true,
        ));
}
?>

<form method="post" action="<?echo $APPLICATION->GetCurPage()?>" enctype="multipart/form-data" name="post_form" id="post_form">
    <?$aTabs = array(
        array(
            "DIV" => "edit1",
            "TAB" => GetMessage("FOTOART_ADM_IMP_TAB1") ,
            "ICON" => "iblock",
            "TITLE" => GetMessage("FOTOART_ADM_IMP_TAB1_ALT"),
        ) ,
    );
    $tabControl = new CAdminTabControl("tabControl", $aTabs, false, true);
    $tabControl->Begin();
    $tabControl->BeginNextTab();
    ?>
    <tr>
        <td><?echo GetMessage("FOTOART_ADM_IMP_INFOBLOCK"); ?></td>
        <td>
            <?echo GetIBlockDropDownList($IBLOCK_ID, 'IBLOCK_TYPE_ID', 'IBLOCK_ID', false, 'class="adm-detail-iblock-types"', 'class="adm-detail-iblock-list"'); ?>
        </td>
    </tr>
    <tr>
        <td class="adm-detail-valign-top"><?echo GetMessage("FOTOART_ADM_IMG_CODE_PROP"); ?>:</td>
        <td>
            <input type="text" name="IMG_CODE_PROP" size="40" value="ARTNUMBER<?//echo htmlspecialcharsbx($CODE_PROP); ?>">
        </td>
    </tr>
    <tr>
        <td width="40%"><?echo GetMessage("FOTOART_ADM_IMG_CODE_WHERE"); ?>:</td>
        <td width="60%">
            <select name="IMG_CODE_WHERE">
                <option value="DETAIL"><?echo GetMessage("FOTOART_ADM_IMG_CODE_WHERE_DETAIL"); ?></option>
                <option value="PREVIEW"><?echo GetMessage("FOTOART_ADM_IMG_CODE_WHERE_PREVIEW"); ?></option>
            </select>
        </td>
    </tr>
    <tr>
                <td>&nbsp;</td>
        <td><input type="submit" name="backButton" value="<?echo GetMessage("FOTOART_ADM_IMG_LOAD"); ?>" class="adm-btn-save"></td>
    </tr>
<?
$tabControl->End();
?>
</form>

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
?>
 
Используйте jQuery. Ну или BX.ajax
 
Используйте jQuery. Ну или BX.ajax
Пытался адаптировать под мои цели скрипт от А.Долганина "Скрипт для выполнения работы по шагам", но мои ничтожные знания не позволяют разобраться в нём.
Пример был построен на работе с циклом "while" и всё работало нормально. А вот с "foreach" никак не выходит.
Посмотри одним глазком, может подскажешь что не так )
PHP:
<?
if (isset($_REQUEST['work_start']))
{
    define("NO_AGENT_STATISTIC", true);
    define("NO_KEEP_STATISTIC", true);
}
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/petrofstudio.fotoart/include.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/petrofstudio.fotoart/prolog.php");
include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/petrofstudio.fotoart/ftpcrawler.php");
$file_pointer = $_SERVER["DOCUMENT_ROOT"]."/upload/tmp/petrof/serialize.txt";
 

IncludeModuleLangFile(__FILE__);
set_time_limit(0);
CModule::IncludeModule("iblock");

$IBLOCK_TYPE_ID = "catalog";
$IBLOCK_ID = "7";
$CODE_PROP = "ARTNUMBER";
$CODE_WHERE = "DETAIL";

$strError = "";
$io = CBXVirtualIo::GetInstance();

$POST_RIGHT = $APPLICATION->GetGroupRight("main");
if ($POST_RIGHT == "D")
    $APPLICATION->AuthForm("Доступ запрещен");

// $BID = 7;
// $limit = 100;


if($_REQUEST['work_start'] && check_bitrix_sessid())
{
/**/
if ( !$file_handle = fopen($file_pointer, 'rb') ) exit;
$myarrayecho = unserialize( fread($file_handle, filesize($file_pointer)) );
fclose($file_handle);

        # обработка файлов из архива
        if(!empty($myarrayecho)):
            $i = 0;
            $l = 0;
            foreach($myarrayecho as $key=>$item) {
                $prop_ar_val = explode(".",$item["name"]);
                $prop_val = $prop_ar_val[0];
                $temp_f = "temp.".$prop_ar_val[1];
                // закачивание файла
              $local_file = $_SERVER["DOCUMENT_ROOT"]."/upload/tmp/petrof/".$temp_f;

                # получение ID элемента по свойству
                $arSelectItem = Array("ID", "NAME");
                $arFilterItem = Array("IBLOCK_ID"=>$IBLOCK_ID, "PROPERTY_".$CODE_PROP=>$prop_val);
                $resItem = CIBlockElement::GetList(Array(), $arFilterItem, false, Array("nPageSize"=>1), $arSelectItem);
                if($obItem = $resItem->GetNextElement())
                {
                    $arFieldsItem = $obItem->GetFields();
                    # обновление картинки
                    $el = new CIBlockElement;
                    $arLoadProductArray = Array(
                      "MODIFIED_BY"    => $USER->GetID(),
                      $CODE_WHERE."_PICTURE" => CFile::MakeFileArray($local_file)
                    );
                    if($el->Update($arFieldsItem['ID'], $arLoadProductArray)) {
                        $i++;
                    }
                    else {
                        $l++;
                    }
                }
                else {
                    $l++;
                }
    $lastID = intval($arFieldsItem["ID"]);
            }
        else:
            $strError.= GetMessage("FOTOART_ADM_ZIP_IS_EMPTY")."*<br>";
        endif;
        # заканчиваем загрузку фотографий
    // закрытие соединения   

    $rsAll = CIBlockElement::GetList(Array(), $arFilterItem, false, Array("nPageSize"=>1), $arSelectItem);
    $allCnt = $rsAll->SelectedRowsCount();

    $p = round(100*$leftBorderCnt/$allCnt, 2);

    echo 'CurrentStatus = Array('.$p.',"'.($p < 100 ? '&lastid='.$lastID : '').'","Обрабатываю запись с ID #'.$lastID.'");';

    die();
}

$clean_test_table = '<table id="result_table" cellpadding="0" cellspacing="0" border="0" width="100%" class="internal">'.
                        '<tr class="heading">'.
                            '<td>Текущее действие</td>'.
                            '<td width="1%">&nbsp;</td>'.
                        '</tr>'.
                    '</table>';

$aTabs = array(array("DIV" => "edit1", "TAB" => "Обработка"));
$tabControl = new CAdminTabControl("tabControl", $aTabs);

$APPLICATION->SetTitle($MESS["PAGE_TITLE"]);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");

?>
<script type="text/javascript">

    var bWorkFinished = false;
    var bSubmit;

    function set_start(val)
    {
        document.getElementById('work_start').disabled = val ? 'disabled' : '';
        document.getElementById('work_stop').disabled = val ? '' : 'disabled';
        document.getElementById('progress').style.display = val ? 'block' : 'none';

        if (val)
        {
            ShowWaitWindow();
            document.getElementById('result').innerHTML = '<?=$clean_test_table?>';
            document.getElementById('status').innerHTML = 'Работаю...';

            document.getElementById('percent').innerHTML = '0%';
            document.getElementById('indicator').style.width = '0%';

            CHttpRequest.Action = work_onload;
            CHttpRequest.Send('<?= $_SERVER["PHP_SELF"]?>?work_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>');
        }
        else
            CloseWaitWindow();
    }

    function work_onload(result)
    {
        try
        {
            eval(result);

            iPercent = CurrentStatus[0];
            strNextRequest = CurrentStatus[1];
            strCurrentAction = CurrentStatus[2];

            document.getElementById('percent').innerHTML = iPercent + '%';
            document.getElementById('indicator').style.width = iPercent + '%';

            document.getElementById('status').innerHTML = 'Работаю...';

            if (strCurrentAction != 'null')
            {
                oTable = document.getElementById('result_table');
                oRow = oTable.insertRow(-1);
                oCell = oRow.insertCell(-1);
                oCell.innerHTML = strCurrentAction;
                oCell = oRow.insertCell(-1);
                oCell.innerHTML = '';
            }

            if (strNextRequest && document.getElementById('work_start').disabled)
                CHttpRequest.Send('<?= $_SERVER["PHP_SELF"]?>?work_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>' + strNextRequest);
            else
            {
                set_start(0);
                bWorkFinished = true;
            }

        }
        catch(e)
        {
            CloseWaitWindow();
            document.getElementById('work_start').disabled = '';
            alert('Сбой в получении данных');
        }
    }

</script>

<form method="post" action="<?echo $APPLICATION->GetCurPage()?>" enctype="multipart/form-data" name="post_form" id="post_form">
<?
echo bitrix_sessid_post();
   
$tabControl->Begin();
$tabControl->BeginNextTab();
?>
    <tr>
        <td colspan="2">

            <input type=button value="<?echo GetMessage("FOTOART_ADM_IMG_LOAD"); ?>" id="work_start" onclick="set_start(1)" />
            <input type=button value="Стоп" disabled id="work_stop" onclick="bSubmit=false;set_start(0)" />
            <div id="progress" style="display:none;" width="100%">
            <br />
                <div id="status"></div>
                <table border="0" cellspacing="0" cellpadding="2" width="100%">
                    <tr>
                        <td height="10">
                            <div style="border:1px solid #B9CBDF">
                                <div id="indicator" style="height:10px; width:0%; background-color:#B9CBDF"></div>
                            </div>
                        </td>
                        <td width=30>&nbsp;<span id="percent">0%</span></td>
                    </tr>
                </table>
            </div>
            <div id="result" style="padding-top:10px"></div>

        </td>
    </tr>
<?
$tabControl->End();
?>
</form>

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
?>
 
может стоит попробовать set_time_limit?
 
Я когда нужно пошагово что то делать использую самую простую конструкцию - обычно это парсеры, но в вашей ситуации тоже пойдет
Внизу ставите
PHP:
<?if(count(что мучаем) > $шаг):?>
<?
$шаг+=тут свой шаг;
?>
<script>
$(document).ready(function () {
       location.replace("/ваш урл/?шаг=".$шаг.);
});
</script>
<?endif?>
Когда пхп скрипт отработает загрузиться полностью страница и сработает событие готовности документа и сразу перекинет на следующий шаг пока не переберете весь массив или файл или не распарсите что либо.
 
Я когда нужно пошагово что то делать использую самую простую конструкцию - обычно это парсеры, но в вашей ситуации тоже пойдет
Подскажите пожалуйста, как мне вставить вот этот "$шаг": location.replace("/ваш урл/?шаг=".$шаг.);
Попытался сделать вот такую фигуру: location.replace("ps.fotoart.php?<?$urlpost?>");
Ничего не вышло )
 
Подскажите пожалуйста, как мне вставить вот этот "$шаг": location.replace("/ваш урл/?шаг=".$шаг.);
Попытался сделать вот такую фигуру: location.replace("ps.fotoart.php?<?$urlpost?>");
Ничего не вышло )

Ну как бы вам объяснить, попробую чуть по другому показать! :D
Еще раз, есть скрипт обработки массива
В начале
PHP:
<?
if(!$_REQUEST["STEP"]) $step=0;
else $step=$_REQUEST["STEP"];

// Далее выполняем какую то работу с массивом $massiv с индексом 0 до 50 и после уже

$step+=50;
if(count($massiv) > $step):
?>
$(document).ready(function () {
location.replace("ps.fotoart.php?STEP=<?$=step?>");
});
<?
endif;
?>
 
Установить параметры получилось, спасибо.
Но не редиректит и всё тут )
структура вот такая
PHP:
<?
if ($_SERVER["REQUEST_METHOD"] == "POST" || isset($_REQUEST['NEW'])) {
   foreach($myarrayecho as $key=>$item) {
   /***********/
   // Далее выполняем какую то работу с массивом
   /***********/
   }
  $urlpost =
  'NEW='.$new.
  '&I='.$i.
  '&L='.$l;
?>
<script type="text/javascript">
$(document).ready(function () {
  location.replace("ps.fotoart.php?<?=$urlpost?>");
});
</script>
<? } ?>
 
Установить параметры получилось, спасибо.
Но не редиректит и всё тут )
структура вот такая

А вы первый раз параметр NEW передаете и почему POST если передаете в строке и должно быть GET?
А вообще смотрите подробней сами, есть ли вывод javascript в коде страницы, если есть то какие ошибки в консоли. Это все уже нюансы, конструкцию вам дали. Следите за ошибками.
 
Первый раз данные отправляются из формы, где выбираются инфоблоки, по.тому с начала POST
Параметр "NEW" устанавливается при первом проходе:
PHP:
if (!isset($new)) {
    $old = 0;
    $new = $step;
} else {
    $old = $new;
    $new = $new + $step;
}
Где $step число шагов устанавливаемое в начале.
В коде страницы вижу скрипт:
PHP:
<script type="text/javascript">
$(document).ready(function () {
       location.replace("ps.fotoart.php?NEW=1&I=0&L=1");
});
</script>
Должен выполнятся, а не выполняется )
 
Последнее редактирование:
Назад
Сверху