Как AJAX влияет на переменные и функции в PHP?


Ajax - это, по определению, асинхронный запрос к серверу. Но что это означает в отношении переменных в файле PHP?

Допустим, у нас есть запрос Ajax в цикле for. Запрос для каждой итерации идентичен, за исключением ввода, который немного отличается (в данном случае someField).

for (var iOuter = 0; iOuter < 3; iOuter++) {
  (function(i) {
    myArrayVariable['someField'] = i;
    $.ajax({
        type: 'POST',
        url: 'someurl.php',
        data: myArrayVariable
      })
      .done(function() {
        console.log("Finished " + i);
      })
      .fail(function(jqXHR, textStatus, error) {
        console.error(error + ": " + textStatus);
      });
  })(iOuter);
}

Тогда в PHP мы могли бы иметь следующее:

$val = $_POST['someField'];
$values = array();

for ($i = 0; $i < 10; $i++) {
  push($values, ($val+$i));
}

Мой вопрос: поскольку это асинхронный запрос, означает ли это, что область действия переменных является общей по разным запросам? Другими словами, будет ли $values содержать все значения для всех запросов (когда цикл завершится в каждом запросе), или он уникален для каждого запроса?

В расширении, как насчет изменения переменных СЕАНСА? Я полагаю, ими следует поделиться? Итак, если бы мы заменили приведенный выше фрагмент на что-то вроде приведенного ниже, имел бы массив $values все значения?

$val = $_POST['someField'];
$_SESSION['values'] = array();

for ($i = 0; $i < 10; $i++) {
  push($_SESSION['values'], ($val+$i));
}

ИЛИ возможно ли, что из-за небольшой разницы во времени, даже если первый инициализированный запрос уже записал значение в массив, второй запрос повторно инициализирует переменную сеанса как пустой массив? Значит, ценности, возможно, потеряны?

Подводя итог: являются ли переменные общими для нескольких ajax-запросов к одному и тому же PHP-файлу или они уникальны для каждого запроса? А как насчет переменных СЕАНСА и их инициализации? Когда вам следует быть осторожным при использовании переменных/функций в PHP, если вы знаете, что используете этот файл в запросе ajax? Или, как правило: может асинхронные запросы к одному и тому же файлу влияют друг на друга?

Author: Bram Vanroy, 2016-07-03

3 answers

Являются переменными, общими для нескольких ajax-запросов к одному и тому же PHP файл, или они уникальны для каждого запроса?

Переменные PHP сбрасываются с каждым запросом, поэтому вам не нужно беспокоиться о том, что один запрос перепутает значения из другого запроса.

А как насчет переменных СЕАНСА и их инициализации?

$_SESSION данные разные. Он находится где-то на диске или в памяти вне процесса PHP, точно так же, как данные базы данных. Поэтому, как и база данных, она сохраняется по всем запросам, асинхронным или иным образом, и будет изменяться в порядке поступления.

В вашем примере, однако, вы устанавливаете $_SESSION['values'] = array(); для каждого запроса, поэтому он будет сброшен в пустой массив. Если бы вы только что ввели в него новые значения, значения из предыдущих запросов сохранились бы (по крайней мере, до тех пор, пока сеанс не будет уничтожен).

Еще один важный момент о сеансах: пока сеанс работает, PHP блокирует базовый файл. Так если ваш запрос займет много времени и поступит другой запрос на тот же сеанс, у вас возникнут проблемы. В этом случае лучше всего выпустить файл сеанса, когда вы закончите с ним, например, в начале сценария. Вы всегда можете перезагрузить его ближе к концу, чтобы сохранить результаты выполнения скрипта.

session_start();
... // do your session work early
session_write_close();
... // continue with your long script

Могут ли асинхронные запросы к одному и тому же файлу влиять друг на друга?

Да! если обработка занимает много времени при работе с файлом, другой процесс может привести к ошибке. Рассмотрим этот сценарий:

//allow script to run for a long time (or PHP might kill it)
set_time_limit(35);

$file = fopen("test.txt","w+"); //open file
flock($file,LOCK_EX); //set exclusive lock.
sleep(30); //sleep for 30 seconds
flock($file,LOCK_UN); //release lock
fclose($file);//close the file

Если поступит другой запрос и попытается открыть этот файл, пока этот процесс находится в спящем режиме, у вас возникнет проблема.

 2
Author: BeetleJuice, 2016-07-16 23:33:31

Давайте проведем тест и посмотрим:

JS

    for (ajax_var=1; ajax_var < 4; ajax_var++) {
        $.ajax({
            url: 'variable.php',
            type: 'POST',
            data: { 'ajax_var': ajax_var },
            success: function(resp) {
                console.log(resp);
            }
        });
    }

PHP

    if(!isset($_SESSION)) { session_start(); }

    $ajax_var = $_POST['ajax_var'];
    $_SESSION['var'] = $ajax_var;

    $data = [];
    for ($php_var = 1; $php_var < 4; $php_var++) {
        array_push($data, "Ajax Variable = " . $ajax_var);
        array_push($data, "PHP Variable = " . $php_var);
        array_push($data, "Session Variable = " . $_SESSION['var']);
        array_push($data, "   ");
    }

    print_r($data)

КОНСОЛЬ

    Array
    (
        [0] => Ajax Variable = 1
        [1] => PHP Variable = 1
        [2] => Session Variable = 1
        [3] =>    
        [4] => Ajax Variable = 1
        [5] => PHP Variable = 2
        [6] => Session Variable = 1
        [7] =>    
        [8] => Ajax Variable = 1
        [9] => PHP Variable = 3
        [10] => Session Variable = 1
        [11] =>    
    )

    variable_test_run.html:20 
    Array
    (
        [0] => Ajax Variable = 2
        [1] => PHP Variable = 1
        [2] => Session Variable = 2
        [3] =>    
        [4] => Ajax Variable = 2
        [5] => PHP Variable = 2
        [6] => Session Variable = 2
        [7] =>    
        [8] => Ajax Variable = 2
        [9] => PHP Variable = 3
        [10] => Session Variable = 2
        [11] =>    
    )

    variable_test_run.html:20 
    Array
    (
        [0] => Ajax Variable = 3
        [1] => PHP Variable = 1
        [2] => Session Variable = 3
        [3] =>    
        [4] => Ajax Variable = 3
        [5] => PHP Variable = 2
        [6] => Session Variable = 3
        [7] =>    
        [8] => Ajax Variable = 3
        [9] => PHP Variable = 3
        [10] => Session Variable = 3
        [11] =>    
    )

Похоже, что первый php-скрипт завершен еще до того, как будет запущен второй php-скрипт. Однако я запускаю это на локальном сервере, и у живого сервера может быть немного более медленный отклик, чем у кода javascript. Но вероятность того, что два сценария совпадут и приведут к перекрытию, равна нулю. Я уверен, что переменная сеанса с большей вероятностью будет иметь перекрывается, но я никогда по-настоящему не понимал, зачем вам нужно зацикливать вызов ajax в реальном примере.

 0
Author: David, 2016-07-04 03:53:13

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

Сеансы будут работать, так как каждый ajax по сути такой же, как ваш браузер, выполняющий публикацию/ПОЛУЧЕНИЕ и получающий ответ, за исключением того, что все это происходит в JS.

В php вы также можете определить, является ли его AJAX(xmlhttprequest) здесь помимо простого включения переменной, чтобы идентифицировать ее как ajax. (ни один из которых, по-видимому, не является полностью надежным доказательством).

Более подробная информация о вики здесь

Еще один запрос sof об ajax по сравнению с обычными запросами здесь

И многое другое здесь

 -1
Author: 2114L3, 2017-05-23 11:51:38