gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:25:01 26 4
gpt4 key购买 nike

根据定义,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));
}

或者是否有可能,因为一些小的时间差异,即使第一个初始化请求已经将值写入数组,第二个请求将 session 变量重新初始化为一个空数组?那么值可能会丢失?

总结一下:变量是在对同一个 PHP 文件的多个 ajax 请求之间共享的,还是每个请求都是唯一的? SESSION 变量及其初始化又如何呢?如果您知道在 ajax 请求中使用该文件,那么在 PHP 中使用变量/函数时什么时候应该小心?或者,一般来说:对同一文件的异步请求会相互影响吗?

最佳答案

are variables shared across multiple ajax requests to the same PHP file, or are they unique per request?

PHP 变量随每个请求重置,因此您无需担心一个请求会弄乱另一个请求的值。

And what about SESSION variables and their initialisation?

$_SESSION 数据不同。它存在于 PHP 进程之外的磁盘或内存中的某个位置,就像数据库数据一样。因此,就像数据库一样,它在请求、异步或其他方式中存活,并且将按照先到先得的原则进行修改。

但是在您的示例中,您在每个请求上都设置了 $_SESSION['values'] = array();,因此它将被重置为一个空数组。如果您刚刚将新值插入其中,则先前请求的值将继续存在(至少在 session 被销毁之前)。

关于 session 的另一个重点:当 session 处于事件状态时,PHP 会锁定底层文件。因此,如果您的请求需要很长时间才能得到服务,而同一 session 的另一个请求又进来了,您就会遇到麻烦。在这种情况下,最好的办法是在完成 session 文件后释放它,例如在脚本的早期。您始终可以在末尾重新加载它以存储脚本的结果。

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

can asynchronous requests to the same file influence each other?

是的!如果处理文件需要很长时间,则另一个进程可能会出错。考虑这个脚本:

//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

如果另一个请求进来并试图在这个进程休眠时打开这个文件,你就会遇到问题。

关于php - AJAX 如何影响 PHP 中的变量和函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38169082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com