AJAX如何影响PHP中的变量和函数?

时间:2016-07-03 10:35:35

标签: php ajax scope

根据定义,Ajax是对服务器的异步请求。但是这对于PHP文件中的变量意味着什么呢?

假设我们在for循环中有一个Ajax请求。每次迭代的请求都是相同的,除了略有不同的输入(在这种情况下为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会包含所有请求的所有值(当循环在每个请求中完成时),还是每个请求都是唯一的?

在扩展中,如何修改SESSION变量?那些应该被分享,我想?因此,如果我们用下面的内容替换上面的代码片段,那么$ values数组会有所有值吗?

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

for ($i = 0; $i < 10; $i++) {
  push($_SESSION['values'], ($val+$i));
}
或者有可能因为一些小的时间差,即使第一个初始化的请求已经为数组写了一个值,第二个请求会将会话变量重新初始化为空数组吗?所以价值可能会丢失吗?

总结一下:变量是在多个ajax请求中共享到同一个PHP文件的,还是每个请求都是唯一的?那么SESSION变量及其初始化呢?如果您知道在ajax请求中使用该文件,那么在PHP中使用变量/函数时应该注意什么?或者,通常:对同一文件的异步请求是否会相互影响?

3 个答案:

答案 0 :(得分:2)

  

是在同一PHP的多个ajax请求之间共享的变量   文件,还是每个请求都是唯一的?

每次请求都会重置PHP变量,因此您不必担心一个请求会弄乱另一个请求中的值。

  

那么SESSION变量及其初始化呢?

$_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

如果另一个请求进来并尝试在此进程暂停时打开此文件,则会出现问题。

答案 1 :(得分:0)

让我们进行测试,看看:

<强> 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)

<强> CONSOLE

    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调用。

答案 2 :(得分:-1)

根据要求,它们是唯一的。您可以使用会话,cookie,数据库来收集单独请求的数据。

会话将起作用,因为每个ajax基本上与浏览器执行POST / GET并接收响应相同,除了它在JS中发生的一切。

在php中你还可以检测它的AJAX(xmlhttprequest)here是否包含一个变量来将其标识为ajax。 (其中没有一个看起来完全是万无一失的)

更多信息on wiki here

关于ajax与正常请求的另一个关于here

的问题

以及更多here