PHP + SESSION + REXX

Quidle

Полноценный новичок
PHP + SESSION + REXX

И ещё раз добрый день!
У меня возникла одна интересная проблема:
Мне надо было связать PHP с неким DOS-овским языком REXX.
Справился я с ней следующим образом:
создавал в PHP динамический rexx-файл, записывал туда строки кода, а затем exec-ом запускал, получал результаты и их обрабатывал.
Собственно, с помощью rexx обрабатывались только запросы к БД.
И всё бы ничего - всё замечательно работает...
До тех пор, пока мы не открываем сессию...
Далее следует интересная вещь:
если нажать на ссылку два или более раз (пока браузер не успел догрузить страницу) - весь проект вешается.
При разборе выяснилось, что вешается либо на session_start, либо на вызове функции, создающей и запускающей rexx-файл.
А вот причина этого для меня до сих пор остаётся загадкой.
Вот пример работы с сессией
PHP:
session_start ();
    if ($user_id && $user_pass)
    {
       $arr = rexx (...)); //здесь передаю параметры функции, возвращаются результаты запроса.

        if (md5 ($user_pass) == $arr[0][0])
        {
            $_SESSION['user_id'] = $user_id;
            $_SESSION['user_pass'] = $user_pass;
            $_SESSION['user_mode'] = 1;
        }
        else
            echo '<font color=#FF0000>incorrect login or password</font><br>';
    }
-~{}~ 19.04.04 12:38:

Ах да, совсем забыл добавить:
В списке процессов остаётся висеть cmd.exe.
 

SiMM

Новичок
Re: PHP + SESSION + REXX

Автор оригинала: Quidle
При разборе выяснилось, что вешается ... на вызове функции, создающей и запускающей rexx-файл.
...
В списке процессов остаётся висеть cmd.exe.
Вот её (функцию) и копай.
 

Quidle

Полноценный новичок
Вот код функции:
PHP:
<?php
    function rexx ($arry, $mode = 'select', $err_out = 0, $del = 1, $out_log = 0)
    {
        switch ($mode)
        {
            case 'insert':
                $file = 'c:\www\lib\insert.rex';
                break;
            case 'select':
                $file = 'c:\www\lib\select.rex';
                break;
            default:
                die ('Incorrect mode for rexx!');
        }

#-- открываем управляющий файл и считываем данные в массив --#

        $fc = 0;
        while (is_file ("c:\\magazin\\tmp$fc.rex"))
            $fc++;

        $fptmp = fopen ($file, 'r');
        while (!feof ($fptmp))
            $arr[] = fgets ($fptmp);
        fclose ($fptmp);

#-- Создаём динамический rexx-файл --#

        $fp = fopen ("c:\\magazin\\tmp$fc.rex", 'w');

#-- Вставляем в файл переданные функции значения --#

        for ($i = 0; $i < count ($arry); $i++)
            fputs ($fp, $arry[$i]. "\r\n");

#-- Открываем общий файл, считываем данные, записываем в rexx-файл --#

        $fptmp = fopen ('c:\www\lib\order.rex', 'r');
        while (!feof ($fptmp))
        {
            $temp_string = fgets ($fptmp);
            fputs ($fp, $temp_string);
        }
        fclose ($fptmp);

#-- Вставляем в файл значения из управляющего файла --#

        for ($i = 0; $i < count ($arr) - 1; $i++)
            fputs ($fp, $arr[$i]);

#-- Закрываем rexx-файл --#

        fclose ($fp);

#-- Исполняем --#

        chdir ('c:/magazin');
        exec ("rexx tmp$fc.rex", $out, $error);

#-- Если надо - удаляем (по умолчанию) --#

        if ($del != 0)
            unlink ("c:\\magazin\\tmp$fc.rex");

#-- Формируем возвращаемый массив --#

        if ($out_log)
            $log = fopen ('c:\www\log.txt', 'w');

        for ($i = 0; $i < count ($out); $i++)
        {
            $j = 0;
            $ts = $out[$i];
            if ($out_log)
            {
                fputs ($log, 'Incoming string: '. $ts. "\r\n");
                fputs ($log, 'Operation '. $i. "\r\n");
            }
            while (strstr ($ts, '_|==|_'))
            {
                if ($out_log)
                    fputs ($log, 'String in: '. $ts. "\r\n");
                if (strpos ($ts, '_|==|_', 1))
                {
                    $resy[$i][$j] = substr ($ts, strpos ($ts, '_|==|_') + 6, strpos ($ts, '_|==|_', 1) - 6);
                    if (trim ($resy[$i][$j]) == '')
                        $resy[$i][$j] = 'No data';
                    $ts = substr ($ts, strpos ($ts, '_|==|_', 1));
                    if ($out_log)
                    {
                        fputs ($log, "First income:\r\n");
                        fputs ($log, 'Value: '. $resy[$i][$j]. "\r\n");
                        fputs ($log, 'Left string: '. $ts. "\r\n");
                    }
                }
                else
                {
                    $resy[$i][$j] = substr ($ts, strpos ($ts, '_|==|_') + 6);
                    if (trim ($resy[$i][$j]) == '')
                        $resy[$i][$j] = 'No data';
                    $ts = '';
                    if ($out_log)
                    {
                        fputs ($log, "Last income:\r\n");
                        fputs ($log, 'Value: '. $resy[$i][$j]. "\r\n");
                        fputs ($log, 'Left string: '. $ts. "\r\n");
                    }
                }
                $j++;
            }
        }

        if ($out_log)
            fclose ($log);

#--Если надо - записываем код ошибки, с которой вылетел rexx в конец массива --#

        if ($err_out)
            $resy['error'] = $error;

#-- И, наконец, возвращаем массив --#

        return $resy;
    }
?>
Я пока не нашёл здесь причины возникновения вышеописанной проблемы...
 

IntenT

SkyDiver
может не париться с рексом, а попытаться все-таки написать тоже самое на пхп??

кстати,что за БД?
 

Quidle

Полноценный новичок
БД - DB2.
Я бы с радостью всё на Пэхе сделал, но начальство требует, чтобы запросы были на рексе.
Правда, я уже вышел из положения :))
PHP:
<?php
    set_time_limit (180);
    include ('c:\lib\const.php');
    include ('lib.php');
    include ('rexx.php');

    if (is_file ('c:\magazin\tmp0.rex'))
    {
        unlink ('c:\magazin\tmp0.rex');
        die ('<font color=#FF0000>Please wait for the end of last session</font>');
    }
-~{}~ 21.04.04 11:13:

Криво, но работает :)
 
Сверху